/ Hex Artifact Content
Login

Artifact 43302cc4f3de6479b90fa6bb271b65d86333d00e:


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 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0910: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0920: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0930: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0950: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0960: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0970: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0990: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09a0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
09b0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
09c0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
09d0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
09e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
09f0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0a60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0a70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0a80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0a90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0aa0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0ab0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0ac0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0ad0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0ae0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0af0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0b60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0b70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0b80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0b90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ba0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0bb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0bc0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0bd0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0be0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0c10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0c20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0c30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0c40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0c50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0c70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0c90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0cb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0cc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0cd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0ce0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0cf0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
0d00: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0d10: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0d20: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
0d30: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
0d40: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
0d50: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
0d60: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0d70: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
0d80: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
0d90: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
0da0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
0db0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
0dc0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
0dd0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
0de0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0df0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
0e00: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
0e10: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
0e20: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
0e30: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
0e40: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
0e50: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
0e60: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
0e70: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
0e80: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
0e90: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
0ea0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
0eb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0ec0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
0ed0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
0ee0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
0ef0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
0f00: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
0f10: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
0f20: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
0f30: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
0f40: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
0f50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
0f60: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
0f70: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0f80: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0f90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0fa0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0fb0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0fc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
0fd0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
0fe0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
0ff0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1000: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1010: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1020: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1030: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1040: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1060: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1070: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1080: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1090: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
10a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
10b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
10e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
10f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1100: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1110: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1120: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1130: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1140: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1150: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1160: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1170: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1180: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1190: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
11a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
11b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
11c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
11d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
11e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
11f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1200: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1210: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1220: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1230: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1240: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1260: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1270: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1290: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
12a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
12b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
12c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
12d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
12e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
12f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1310: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1320: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1330: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1340: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1350: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1360: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1370: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1380: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1390: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
13a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
13b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
13c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
13d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
13e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
13f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1400: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1410: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1420: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1430: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1440: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1450: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1460: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1470: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1480: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1490: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
14a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
14b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
14c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
14d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
14e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
14f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1500: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1510: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1530: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1540: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1550: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1560: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1570: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1580: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1590: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
15a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
15b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
15c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
15d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
15e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
15f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1600: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1610: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1620: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1640: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1650: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1660: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1670: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1680: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1690: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
16a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
16b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
16d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
16e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
16f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1700: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1710: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1720: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1730: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1740: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1750: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1760: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1770: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1780: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1790: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
17a0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
17b0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
17c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
17d0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
17e0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
17f0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1800: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1830: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1840: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1850: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1870: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1890: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
18a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
18b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18d0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
18f0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1900: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1910: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1920: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1930: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1940: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1950: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1960: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1970: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1980: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1990: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
19a0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
19b0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
19c0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
19d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
19e0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
19f0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1a00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1a10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1a20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1a30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1a40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1a50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1a60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1a80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1a90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1aa0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1ab0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1ac0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1ad0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1ae0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1af0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1b00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1b10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1b20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1b40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1b50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1b60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1b70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1b80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1b90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ba0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1bb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1bc0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1be0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bf0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1c00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1c10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1c20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1c50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1ca0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1cb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1cc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1cd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1ce0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1cf0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1d00: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
1d10: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d20: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
1d30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
1d40: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
1d50: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
1d60: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
1d70: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
1d80: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
1d90: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
1da0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
1db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1dc0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
1dd0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
1de0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1df0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e00: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
1e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1e30: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1e40: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
1e50: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
1e60: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
1e70: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
1e80: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
1e90: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1eb0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
1ec0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
1ed0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
1ee0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
1ef0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
1f00: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
1f10: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
1f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f30: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
1f40: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
1f50: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
1f60: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
1f70: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1f90: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
1fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
1fb0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1fc0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
1fd0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
1fe0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2000: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2010: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2020: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2030: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2040: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2050: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2060: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2070: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2080: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2090: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
20b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
20c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
20d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
20e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
20f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2100: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2120: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2130: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
2140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2150: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2160: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2170: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
2180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2190: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
21a0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
21b0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
21c0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
21d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
21e0: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
21f0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2200: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2210: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2220: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2230: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2240: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2250: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2260: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2270: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
2280: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
2290: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
22a0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
22b0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
22c0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
22d0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
22e0: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
22f0: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2300: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2310: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2320: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2330: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2350: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2360: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2370: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2380: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
2390: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
23a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
23b0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
23c0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
23d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
23e0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
23f0: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2400: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2410: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2430: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2440: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2450: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2460: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2470: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
2480: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
2490: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
24a0: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
24b0: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
24c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
24e0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d  AREDCACHE;.    }
24f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2510: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2520: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2530: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2540: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2550: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
2560: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
2570: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2580: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
2590: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
25a0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
25b0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
25c0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
25d0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
25e0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
25f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  K..**.** This fu
2600: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
2610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2620: 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70  .**   (a) The sp
2630: 65 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62  ecified Btree ob
2640: 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63  ject p is connec
2650: 74 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c  ted to a sharabl
2660: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
2670: 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68  ase (one with th
2680: 65 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61  e BtShared.shara
2690: 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61  ble flag set), a
26a0: 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e  nd.**.**   (b) N
26b0: 6f 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  o other Btree ob
26c0: 6a 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63  jects hold a loc
26d0: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
26e0: 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74  .**       with t
26f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2700: 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61  k (i.e. querySha
2710: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2720: 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20  k() has.**      
2730: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2740: 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  lled and returne
2750: 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  d SQLITE_OK)..**
2760: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2770: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2780: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2790: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
27a0: 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73  ITE_NOMEM .** is
27b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
27c0: 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61  alloc attempt fa
27d0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
27e0: 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68  nt setSharedCach
27f0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
2800: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
2810: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2820: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2830: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2840: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
2850: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2860: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2870: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2890: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
28a0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
28b0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
28c0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20  ( p->db!=0 );.. 
28d0: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
28e0: 20 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75   with the read-u
28f0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2900: 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74  set will never t
2910: 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
2920: 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73  n a read-lock us
2930: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2940: 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64  n. The only read
2950: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20  -lock obtained. 
2960: 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74   ** by a connect
2970: 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  ion in read-unco
2980: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20  mmitted mode is 
2990: 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
29a0: 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ster .  ** table
29b0: 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20  , and that lock 
29c0: 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42  is obtained in B
29d0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29  treeBeginTrans()
29e0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29f0: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
2a00: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
2a10: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63  mmitted) || eLoc
2a20: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2a30: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2a40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
2a50: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
2a60: 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20  sharable b-tree 
2a70: 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68  after it .  ** h
2a80: 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  as been determin
2a90: 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ed that no other
2aa0: 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20   b-tree holds a 
2ab0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
2ac0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ad0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20  p->sharable );. 
2ae0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2af0: 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43  OK==querySharedC
2b00: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
2b10: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
2b20: 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  );..  /* First s
2b30: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
2b40: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
2b50: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
2b60: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
2b70: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2b80: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2b90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2ba0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
2bb0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
2bc0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
2bd0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
2be0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
2bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c00: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
2c10: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
2c20: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
2c30: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
2c40: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
2c50: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
2c60: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
2c70: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
2c80: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2c90: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
2ca0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
2cb0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2cc0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
2cd0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
2ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
2cf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
2d10: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
2d20: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
2d30: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
2d40: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
2d50: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
2d60: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
2d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2d80: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
2d90: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
2da0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
2db0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
2dc0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2dd0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
2de0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
2df0: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
2e00: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
2e10: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
2e20: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
2e30: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
2e40: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
2e50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
2e60: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
2e70: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
2e80: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
2e90: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
2ea0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
2eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2ed0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2ee0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2f10: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
2f20: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
2f30: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
2f40: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
2f50: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
2f60: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
2f70: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
2f80: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
2f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2fa0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2fb0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
2fc0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
2fd0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
2fe0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
2ff0: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3000: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
3010: 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  g variable.** ma
3020: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3030: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3040: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3050: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3060: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3070: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3080: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3090: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
30a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
30b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
30c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
30d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
30f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3100: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3110: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3120: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3130: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3140: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3150: 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75  rt( pBt->isExclu
3160: 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  sive==0 || pBt->
3170: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
3180: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
3190: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31a0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31b0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31c0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31d0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
31e0: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
31f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3200: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3210: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3220: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3230: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3240: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3250: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3260: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3280: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
3290: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32a0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42   }..  assert( pB
32b0: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20  t->isPending==0 
32c0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20  || pBt->pWriter 
32d0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  );.  if( pBt->pW
32e0: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
32f0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3300: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63  ;.    pBt->isExc
3310: 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  lusive = 0;.    
3320: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3330: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
3340: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3350: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
3380: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
3390: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33b0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33c0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
33d0: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
33e0: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
33f0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3400: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3420: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3430: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3440: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3450: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3460: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
3470: 20 74 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66   the isPending f
3480: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
3490: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
34a0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
34b0: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
34c0: 20 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64   BtShared.isPend
34d0: 69 6e 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ing must.    ** 
34e0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
34f0: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3500: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3510: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3520: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   */.    pBt->isP
3530: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a  ending = 0;.  }.
3540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3550: 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61  nction changes a
3560: 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68  ll write-locks h
3570: 65 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69  eld by Btree p i
3580: 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a  nto read-locks..
3590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
35a0: 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
35b0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
35c0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
35d0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35e0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d  >pBt;.  if( pBt-
35f0: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3600: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
3610: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  ;.    pBt->pWrit
3620: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3630: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
3640: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
3650: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ding = 0;.    fo
3660: 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f  r(pLock=pBt->pLo
3670: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
3680: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
3690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
36a0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ock->eLock==READ
36b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
36c0: 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20  pBtree==p );.   
36d0: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
36e0: 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
36f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66   }.  }.}..#endif
3700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3710: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3730: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
3740: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
3750: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
3770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3780: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
3790: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
37a0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
37b0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
37c0: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
37d0: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
37e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
37f0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
3800: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
3810: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
3820: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
3830: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
3840: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
3850: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
3860: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3870: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3880: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
3890: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
38a0: 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20  or cursor pCur, 
38b0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69  if any..*/.stati
38c0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
38d0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  eOverflowCache(B
38e0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
38f0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
3900: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
3910: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
3920: 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
3930: 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76  ow);.  pCur->aOv
3940: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f  erflow = 0;.}../
3950: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3960: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3970: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3980: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3990: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
39a0: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
39b0: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
39d0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
39e0: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
39f0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3a00: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3a10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3a20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3a30: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3a40: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3a50: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3a60: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3a70: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3a80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3a90: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3aa0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3ab0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3ac0: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3ad0: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3ae0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3af0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3b00: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3b10: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3b20: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3b30: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3b40: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3b50: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3b60: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3b70: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
3b80: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
3b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ba0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3bb0: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3bc0: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3bd0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3be0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3bf0: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3c00: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3c10: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3c20: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3c30: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3c40: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
3c50: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
3c60: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
3c70: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
3c80: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
3c90: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
3ca0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
3cb0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3cd0: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3ce0: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3cf0: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3d00: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3d10: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3d20: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
3d50: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
3d60: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
3d70: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
3d80: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
3d90: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
3da0: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
3db0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
3dc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
3dd0: 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ee->pBt;.  asser
3de0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
3df0: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
3e00: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3e10: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3e20: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3e30: 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
3e40: 48 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65  Handle && (isCle
3e50: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
3e60: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
3e70: 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
3e80: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
3e90: 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ID;.    }.  }.}.
3ea0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
3eb0: 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20   functions when 
3ec0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
3ed0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
3ee0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3ef0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
3f00: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
3f10: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f20: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3f30: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3f40: 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23  Cursors(x,y,z).#
3f50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3f60: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
3f70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
3f80: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
3f90: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
3fa0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
3fb0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
3fc0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
3fd0: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
3fe0: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
3ff0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4000: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4010: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4020: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4030: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4040: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4050: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4060: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
4070: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
4080: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
4090: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
40a0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
40b0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
40c0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
40d0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
40e0: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
40f0: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4100: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4110: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4120: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4130: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4140: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4150: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4160: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
4170: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
4180: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
4190: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
41a0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
41b0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
41c0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
41d0: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
41e0: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
41f0: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4200: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4210: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4220: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4230: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4240: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4250: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4260: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
4270: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
4280: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
4290: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
42a0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
42b0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
42c0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
42d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
42e0: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
42f0: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4300: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4310: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4320: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4330: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4340: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4350: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4360: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
4370: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
4380: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
4390: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
43a0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
43b0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
43c0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
43d0: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
43e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43f0: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4400: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4410: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4420: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4430: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4440: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4450: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4460: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4470: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4480: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4490: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
44a0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
44b0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
44c0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
44d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
44e0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
44f0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4500: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4510: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4520: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4530: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4540: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4560: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4570: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4580: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4590: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
45a0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
45b0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
45c0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
45d0: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
45e0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
45f0: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4600: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4610: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4620: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4630: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4640: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4650: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4660: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4670: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4680: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4690: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
46a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
46b0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
46c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
46d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
46e0: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
46f0: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4700: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4710: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4720: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4730: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4740: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4750: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
4770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
4780: 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76  gno<=sqlite3Bitv
4790: 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73  ecSize(pBt->pHas
47a0: 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20  Content) ){.    
47b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
47c0: 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43  ecSet(pBt->pHasC
47d0: 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  ontent, pgno);. 
47e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
47f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  }../*.** Query t
4800: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4810: 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a  Content vector..
4820: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4830: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f  eaf page is remo
4860: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
4870: 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65  free-list for re
4880: 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20  use. It returns 
4890: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
48a0: 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  afe to retrieve 
48b0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d  the.** page from
48c0: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
48d0: 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
48e0: 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
48f0: 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   True otherwise.
4900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4910: 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
4920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4930: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42   Pgno pgno){.  B
4940: 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e  itvec *p = pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72  pHasContent;.  r
4960: 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e  eturn (p && (pgn
4970: 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  o>sqlite3BitvecS
4980: 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65  ize(p) || sqlite
4990: 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70  3BitvecTest(p, p
49a0: 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gno)));.}../*.**
49b0: 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29   Clear (destroy)
49c0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49d0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49e0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
49f0: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74  .** invoked at t
4a00: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
4a10: 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e   each write-tran
4a20: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4a30: 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65  ic void btreeCle
4a40: 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  arHasContent(BtS
4a50: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
4a60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
4a70: 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  roy(pBt->pHasCon
4a80: 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48  tent);.  pBt->pH
4a90: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d  asContent = 0;.}
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4ab0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
4ac0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
4ad0: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
4ae0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
4af0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
4b00: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
4b10: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
4b20: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
4b30: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4b40: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
4b50: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
4b60: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
4b70: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
4b80: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
4b90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
4ba0: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
4bb0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
4bc0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
4bd0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
4be0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
4bf0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
4c00: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
4c10: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
4c20: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
4c30: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4c40: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
4c50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4c60: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
4c70: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
4c80: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
4c90: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
4ca0: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
4cb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
4cc0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
4cd0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
4ce0: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
4cf0: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
4d00: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
4d10: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
4d20: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
4d30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
4d40: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
4d50: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
4d60: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
4d70: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
4d80: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
4d90: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
4da0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
4db0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
4dc0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
4dd0: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
4de0: 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70   if( 0==pCur->ap
4df0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
4e00: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  ){.    void *pKe
4e10: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
4e20: 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  c( (int)pCur->nK
4e30: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
4e40: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
4e50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4e60: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
4e70: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
4e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4e90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ea0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
4eb0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4ed0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
4ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4ef0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
4f00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4f10: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
4f20: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
4f30: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
4f40: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
4f50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4f60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4f70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
4f80: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
4f90: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
4fa0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4fb0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72  [i]);.      pCur
4fc0: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
4fe0: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20  >iPage = -1;.   
4ff0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5000: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5010: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
5020: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5030: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
5040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5050: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5060: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5070: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5080: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5090: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
50a0: 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65    with root-page
50b0: 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c   iRoot. Usually,
50c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
50d0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
50e0: 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73  or.** pExcept is
50f0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5100: 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65  the table (Btree
5110: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5120: 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73  eInsert())..*/.s
5130: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5140: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5150: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5160: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5170: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5180: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
51a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
51b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
51c0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
51d0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
51e0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
51f0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5200: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5210: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5220: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5230: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20  Root==iRoot) && 
5240: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
5250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
5270: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
5280: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
5290: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
52a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
52b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
52c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
52d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
52e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
52f0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5300: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5310: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5320: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5330: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5340: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5350: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5370: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5380: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5390: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
53a0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
53b0: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
53c0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
53d0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
53e0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
53f0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5400: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5410: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5420: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5430: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5440: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5450: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5460: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5470: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5480: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5490: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
54a0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
54b0: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
54c0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
54d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
54e0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
54f0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5500: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5510: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5520: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5530: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5540: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5550: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5560: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5570: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5580: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5590: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
55a0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
55b0: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
55c0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
55d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5600: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5610: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5620: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5630: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5640: 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20  pace[150];      
5650: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5660: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5670: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5680: 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79  c */..  if( pKey
5690: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
56a0: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
56b0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
56c0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
56d0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
56e0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
56f0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20  nt)nKey, pKey,. 
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a       aSpace, siz
5730: 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20  eof(aSpace));.  
5740: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5750: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5760: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
5770: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
5780: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5790: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57a0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57b0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
57c0: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
57d0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  pKey ){.    sqli
57e0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
57f0: 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78  ackedRecord(pIdx
5800: 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
5810: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5820: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5830: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5840: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
5850: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
5860: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
5870: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
5880: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
5890: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
58a0: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
58b0: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
58c0: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
58d0: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
58e0: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
58f0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5900: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5910: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5920: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5930: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5940: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5950: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5960: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5970: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5980: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5990: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
59a0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
59b0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
59c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
59d0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
59e0: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
59f0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5a00: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5a10: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5a20: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5a30: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5a40: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5a50: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5a60: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5a70: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5a80: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5a90: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5aa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5ab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5ac0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5ad0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5ae0: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5af0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5b00: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5b10: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5b20: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5b30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5b40: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5b50: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5b60: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5b70: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5b80: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5b90: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5ba0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5bb0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5bc0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5bd0: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5be0: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5bf0: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5c00: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5c10: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5c20: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5c30: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5c40: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5c50: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5c60: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5c70: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5c80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5c90: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5ca0: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5cb0: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5cc0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5cd0: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5ce0: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5cf0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5d00: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5d10: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5d20: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5d30: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5d40: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5d50: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
5d60: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
5d70: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
5d80: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
5d90: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
5da0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5db0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5dc0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
5dd0: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
5de0: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
5df0: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
5e00: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
5e10: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
5e20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5e30: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
5e40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
5e50: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
5e60: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
5e70: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
5e80: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
5e90: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
5ea0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
5eb0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
5ec0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
5ed0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
5ee0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
5ef0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
5f00: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
5f10: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
5f20: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
5f30: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
5f40: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
5f50: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
5f60: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
5f70: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
5f80: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
5f90: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
5fa0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
5fb0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
5fc0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
5fd0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
5fe0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
5ff0: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
6000: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6010: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
6020: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
6030: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
6040: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
6050: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
6060: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
6070: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
6080: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
6090: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
60a0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
60b0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
60c0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
60d0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
60e0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
60f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
6100: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
6110: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
6120: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6130: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6140: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
6150: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
6160: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
6170: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
6180: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
6190: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
61a0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
61b0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
61c0: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
61d0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
61e0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
61f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6200: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
6210: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6220: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
6230: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
6240: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
6250: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
6260: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
6270: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6280: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
6290: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
62a0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
62b0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
62c0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
62d0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
62e0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
62f0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6300: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
6310: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
6320: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6330: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
6340: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6350: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6360: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6370: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6380: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6390: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
63a0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
63b0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
63c0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
63d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
63e0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
63f0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
6400: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
6410: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
6420: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
6430: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6440: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
6450: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6460: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6470: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6480: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6490: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
64a0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
64b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
64c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
64d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
64e0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
64f0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
6500: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6510: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
6520: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
6530: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
6540: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6550: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6560: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6570: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6580: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6590: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
65a0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
65b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
65c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
65d0: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
65e0: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
65f0: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
6600: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
6610: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
6620: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
6630: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
6640: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6650: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
6660: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
6670: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
6680: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
6690: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
66a0: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
66b0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
66c0: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
66d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
66e0: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
66f0: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
6700: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
6710: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
6720: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
6730: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
6740: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
6750: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
6760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
6770: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
6780: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
6790: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
67a0: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
67b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
67c0: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
67d0: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
67e0: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
67f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
6800: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
6810: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
6820: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
6830: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
6840: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
6850: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
6860: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
6870: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
6880: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
6890: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
68a0: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
68b0: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
68c0: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
68d0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
68e0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
68f0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6900: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6910: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
6920: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
6930: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
6940: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
6950: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
6960: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
6970: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
6980: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
6990: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
69a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
69b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
69c0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
69d0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
69e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
69f0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
6a00: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
6a10: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
6a20: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
6a30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
6a40: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
6a50: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
6a60: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
6a70: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6a80: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6a90: 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28   key);.  assert(
6aa0: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
6ab0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
6ac0: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
6ad0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
6ae0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
6af0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
6b00: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
6b10: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6b20: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
6b30: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
6b40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6b50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
6b60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6b70: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
6b80: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
6b90: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
6ba0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
6bb0: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
6bc0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
6bd0: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
6be0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
6bf0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
6c00: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
6c10: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
6c20: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
6c30: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
6c40: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
6c50: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
6c60: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
6c70: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
6c80: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
6c90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
6ca0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
6cb0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
6cc0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
6cd0: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
6ce0: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
6cf0: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
6d00: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
6d10: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
6d20: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
6d30: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
6d40: 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74  2byte(&(P)->aDat
6d50: 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65  a[(P)->cellOffse
6d60: 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a  t+2*(I)])))../*.
6d70: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
6d80: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
6d90: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
6da0: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
6db0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
6dc0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
6dd0: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
6de0: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
6df0: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
6e00: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
6e10: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
6e20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6e30: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
6e40: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
6e50: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
6e60: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
6e70: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
6e80: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
6e90: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
6ea0: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
6eb0: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
6ec0: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
6ed0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
6ee0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
6ef0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
6f00: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
6f10: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
6f20: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
6f30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
6f40: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
6f50: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
6f60: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
6f70: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
6f80: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
6f90: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
6fa0: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
6fb0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
6fc0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72  s function.  btr
6fd0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61  eeParseCell() ta
6fe0: 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69  kes a .** cell i
6ff0: 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f  ndex as the seco
7000: 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  nd argument and 
7010: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7020: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
7030: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
7040: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
7050: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
7060: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
7070: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
7080: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
7090: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
70a0: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
70b0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
70c0: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
70d0: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
70e0: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
70f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7100: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7110: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
7120: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7130: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7140: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
7150: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
7160: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
7170: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
7180: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
7190: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
71a0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
71b0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
71c0: 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20  .  u16 n;       
71d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
71e0: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
71f0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
7200: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
7210: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
7220: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7230: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
7240: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
7250: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7260: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
7270: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
7280: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
7290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
72a0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
72b0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
72c0: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
72d0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
72e0: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
72f0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
7300: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7310: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
7320: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
7330: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7340: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
7350: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c  ayload);.    }el
7360: 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  se{.      nPaylo
7370: 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ad = 0;.    }.  
7380: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7390: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34  (&pCell[n], (u64
73a0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
73b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74  .    pInfo->nDat
73c0: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
73d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
73e0: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->nData = 0;.   
73f0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7400: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
7410: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66  yload);.    pInf
7420: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
7430: 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d  ad;.  }.  pInfo-
7440: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
7450: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
7460: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65  Header = n;.  te
7470: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
7480: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7490: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
74a0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
74b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
74c0: 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61    if( likely(nPa
74d0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
74e0: 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  xLocal) ){.    /
74f0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
7500: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
7510: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
7520: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
7530: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
7540: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
7550: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
7560: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
7570: 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  ( (pInfo->nSize 
7580: 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f  = (u16)(n+nPaylo
7590: 61 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e  ad))<4 ) pInfo->
75a0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70  nSize = 4;.    p
75b0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
75c0: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
75d0: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
75e0: 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 0;.  }else{
75f0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
7600: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
7610: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
7620: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
7630: 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
7640: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
7650: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
7660: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
7670: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
7680: 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
7690: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
76a0: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
76b0: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
76c0: 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20  f unused.    ** 
76d0: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
76e0: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
76f0: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
7700: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
7710: 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77  e.    ** in betw
7720: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
7730: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a   maxLocal..    *
7740: 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67  *.    ** Warning
7750: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
7760: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
7770: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
7780: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a  ted in any.    *
7790: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
77a0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
77b0: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
77c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
77d0: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
77e0: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
77f0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
7800: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
7810: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
7820: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
7830: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
7840: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
7850: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
7860: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
7870: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
7880: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
7890: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70      minLocal = p
78a0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
78b0: 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70      maxLocal = p
78c0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
78d0: 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69      surplus = mi
78e0: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f  nLocal + (nPaylo
78f0: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
7900: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
7910: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
7920: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
7930: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
7940: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
7950: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b  rplus==maxLocal+
7960: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72  1 );.    if( sur
7970: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
7980: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
7990: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73  >nLocal = (u16)s
79a0: 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73  urplus;.    }els
79b0: 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  e{.      pInfo->
79c0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69  nLocal = (u16)mi
79d0: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
79e0: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
79f0: 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f  ow = (u16)(pInfo
7a00: 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20  ->nLocal + n);. 
7a10: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
7a20: 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c  = pInfo->iOverfl
7a30: 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64  ow + 4;.  }.}.#d
7a40: 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28  efine parseCell(
7a50: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
7a60: 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61  nfo) \.  btreePa
7a70: 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67  rseCellPtr((pPag
7a80: 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50  e), findCell((pP
7a90: 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20  age), (iCell)), 
7aa0: 28 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20  (pInfo)).static 
7ab0: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7ac0: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
7ad0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
7ae0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
7af0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
7b00: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
7b10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
7b20: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
7b30: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
7b40: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
7b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
7b60: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
7b70: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65  re */.){.  parse
7b80: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7b90: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  l, pInfo);.}../*
7ba0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
7bb0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7bc0: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
7bd0: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
7be0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
7bf0: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
7c00: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
7c10: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
7c20: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
7c30: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
7c40: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
7c50: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
7c60: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
7c70: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
7c80: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
7c90: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  r..*/.static u16
7ca0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
7cb0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
7cc0: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
7cd0: 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50  Iter = &pCell[pP
7ce0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
7cf0: 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b  e];.  u32 nSize;
7d00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7d10: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
7d20: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7d30: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
7d40: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
7d50: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
7d60: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
7d70: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
7d80: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
7d90: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
7da0: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
7db0: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
7dc0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
7dd0: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
7de0: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
7df0: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
7e00: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
7e10: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
7e20: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
7e30: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
7e40: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7e50: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
7e60: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
7e70: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
7e80: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75  >intKey ){.    u
7e90: 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28  8 *pEnd;.    if(
7ea0: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7eb0: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b  ){.      pIter +
7ec0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
7ed0: 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  ter, nSize);.   
7ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
7ef0: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ize = 0;.    }..
7f00: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
7f10: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
7f20: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
7f30: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
7f40: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
7f50: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
7f60: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
7f70: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
7f80: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
7f90: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
7fa0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
7fb0: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
7fc0: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
7fd0: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
7fe0: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
7ff0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
8000: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8010: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
8020: 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65  t32(pIter, nSize
8030: 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61  );.  }..  testca
8040: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
8050: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
8060: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
8070: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8080: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
8090: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
80a0: 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  l ){.    int min
80b0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
80c0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
80d0: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
80e0: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
80f0: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
8100: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
8110: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8120: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
8130: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
8140: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
8150: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
8160: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
8170: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
8180: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
8190: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
81a0: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
81b0: 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20   4;.  }.  nSize 
81c0: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
81d0: 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54   pCell);..  /* T
81e0: 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
81f0: 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34  of any cell is 4
8200: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28   bytes. */.  if(
8210: 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20   nSize<4 ){.    
8220: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a  nSize = 4;.  }..
8230: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
8240: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
8250: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
8260: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
8270: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8280: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
8290: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
82a0: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
82b0: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
82c0: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
82d0: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
82e0: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
82f0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
8300: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
8310: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
8320: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
8330: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
8340: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
8350: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
8360: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
8370: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
8380: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
8390: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
83a0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
83b0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
83c0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
83d0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
83e0: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
83f0: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
8400: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
8410: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
8420: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
8430: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
8440: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
8450: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
8460: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
8470: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
8480: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
8490: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
84a0: 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
84b0: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
84c0: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
84d0: 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
84e0: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20  ayload );.  if( 
84f0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
8500: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
8510: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
8520: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
8530: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
8540: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
8550: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
8560: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
8570: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
8580: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
8590: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
85a0: 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65  e given.  All Ce
85b0: 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  lls are moved to
85c0: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
85d0: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
85e0: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
85f0: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65  llected into one
8600: 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20  .** big FreeBlk 
8610: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62  that occurs in b
8620: 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65  etween the heade
8630: 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f  r and cell.** po
8640: 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20  inter array and 
8650: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8660: 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   area..*/.static
8670: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
8680: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8690: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
86c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
86f0: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
8700: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
8710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8720: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
8730: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
8740: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
8750: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
8760: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
8770: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
8780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8790: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
87a0: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
87b0: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
87c0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
87d0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
87e0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
87f0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
8800: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8810: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8820: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8830: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
8840: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
8850: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8860: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
8870: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
8880: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
8890: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
88a0: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
88b0: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
88c0: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
88d0: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
88e0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
88f0: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
8900: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
8910: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
8920: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
8930: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
8940: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
8950: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
8960: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ...  assert( sql
8970: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
8980: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
8990: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
89a0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
89b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
89c0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
89d0: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
89e0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
89f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8a00: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
8a10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8a20: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8a30: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8a40: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
8a50: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
8a60: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
8a70: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
8a80: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
8a90: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
8aa0: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
8ab0: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
8ac0: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
8ad0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
8ae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
8af0: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
8b00: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
8b10: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
8b20: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8b30: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
8b40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
8b50: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
8b60: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
8b70: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
8b80: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
8b90: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
8ba0: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
8bb0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
8bc0: 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
8bd0: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
8be0: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
8bf0: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
8c00: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
8c10: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
8c20: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
8c30: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
8c40: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
8c50: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
8c60: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
8c70: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8c80: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
8c90: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8ca0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21  ellLast );.#if !
8cb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8cc0: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
8cd0: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f  ELL_CHECK).    /
8ce0: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
8cf0: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
8d00: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
8d10: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
8d20: 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54  .    ** if SQLIT
8d30: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
8d40: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20  E_CELL_CHECK is 
8d50: 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a  defined .    */.
8d60: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
8d70: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
8d80: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
8d90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8da0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8db0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
8dc0: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
8dd0: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
8de0: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
8df0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
8e00: 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b  age, &temp[pc]);
8e10: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
8e20: 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
8e30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8e40: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8e50: 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ).    if( cbrk<i
8e60: 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20  CellFirst ){.   
8e70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8e80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8e90: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
8ea0: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
8eb0: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
8ec0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
8ed0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8ee0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8ef0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
8f00: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
8f10: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
8f20: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
8f30: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8f40: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
8f50: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
8f60: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
8f70: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
8f80: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
8f90: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
8fa0: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
8fb0: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
8fc0: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
8fd0: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
8fe0: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
8ff0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
9000: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
9010: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
9020: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
9030: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
9040: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
9050: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
9060: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
9070: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9080: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9090: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
90a0: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
90b0: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
90c0: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
90d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
90e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
90f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9100: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
9110: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
9120: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
9130: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
9140: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
9150: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
9160: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
9170: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
9180: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
9190: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
91a0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
91b0: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
91c0: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
91d0: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
91e0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
91f0: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
9200: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
9210: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
9220: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
9230: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
9240: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
9250: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
9260: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
9270: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
9280: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
9290: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
92a0: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
92b0: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
92c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
92d0: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
92e0: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
92f0: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
9300: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
9310: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
9320: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
9330: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
9340: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
9350: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
9360: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
9370: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
9380: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
9390: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
93a0: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
93b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
93c0: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
93d0: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
93e0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
93f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
9400: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
9410: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
9420: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
9430: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
9440: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
9450: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
9460: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
9470: 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20   nFrag;         
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9490: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
94a0: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
94b0: 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  on pPage */.  in
94c0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
94f0: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
9500: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67   area */.  int g
9510: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
9520: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
9530: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
9540: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
9550: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
9560: 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rc;         /* I
9570: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
9580: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  de */.  int usab
9590: 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c  leSize; /* Usabl
95a0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61  e size of the pa
95b0: 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  ge */.  .  asser
95c0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
95d0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
95e0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
95f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9600: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
9610: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9620: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9630: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
9640: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
9650: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
9660: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
9670: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
9680: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
9690: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
96a0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
96b0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
96c0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
96d0: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
96e0: 6e 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69  nByte < usableSi
96f0: 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67  ze-8 );..  nFrag
9700: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a   = data[hdr+7];.
9710: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9720: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68  >cellOffset == h
9730: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
9740: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70  e->leaf );.  gap
9750: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
9760: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
9770: 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67  nCell;.  top = g
9780: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9790: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
97a0: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
97b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
97c0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
97d0: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
97e0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
97f0: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
9800: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
9810: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
9820: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
9830: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
9840: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
9850: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
9860: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9870: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9880: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9890: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
98a0: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
98b0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
98c0: 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32   }else if( gap+2
98d0: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  <=top ){.    /* 
98e0: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
98f0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
9900: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
9910: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
9920: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  y .    ** the re
9930: 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63  quest. The alloc
9940: 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72  ation is made fr
9950: 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65  om the first fre
9960: 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a  e slot in .    *
9970: 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  * the list that 
9980: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
9990: 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74  to accomadate it
99a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
99b0: 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66   pc, addr;.    f
99c0: 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28  or(addr=hdr+1; (
99d0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
99e0: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61  ata[addr]))>0; a
99f0: 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69  ddr=pc){.      i
9a00: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
9a10: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
9a20: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
9a30: 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61        if( pc>usa
9a40: 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c  bleSize-4 || pc<
9a50: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
9a60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9a70: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9a80: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65      }.      size
9a90: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9aa0: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
9ab0: 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20  if( size>=nByte 
9ac0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
9ad0: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   = size - nByte;
9ae0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
9af0: 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20  e( x==4 );.     
9b00: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
9b10: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  3 );.        if(
9b20: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
9b30: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
9b40: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
9b50: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
9b60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
9b70: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
9b80: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
9b90: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
9ba0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
9bb0: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
9bc0: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
9bd0: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
9be0: 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20  7] = (u8)(nFrag 
9bf0: 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  + x);.        }e
9c00: 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20  lse if( size+pc 
9c10: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
9c20: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9c30: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9c40: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
9c50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
9c60: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
9c70: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
9c80: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
9c90: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
9ca0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
9cb0: 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65   the portion use
9cc0: 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c  d by the new all
9cd0: 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ocation. */.    
9ce0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
9cf0: 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  data[pc+2], x);.
9d00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9d10: 20 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78    *pIdx = pc + x
9d20: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9d30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
9d40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
9d50: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   /* Check to mak
9d60: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
9d70: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20  enough space in 
9d80: 74 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73  the gap to satis
9d90: 66 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f  fy.  ** the allo
9da0: 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c  cation.  If not,
9db0: 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a   defragment..  *
9dc0: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
9dd0: 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29  p+2+nByte==top )
9de0: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42  ;.  if( gap+2+nB
9df0: 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72  yte>top ){.    r
9e00: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
9e10: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
9e20: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9e30: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
9e40: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
9e50: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
9e60: 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74  assert( gap+nByt
9e70: 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a  e<=top );.  }...
9e80: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
9e90: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
9ea0: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
9eb0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
9ec0: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
9ed0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9ee0: 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e  ea.  The btreeIn
9ef0: 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61  itPage() call ha
9f00: 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76  s already.  ** v
9f10: 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65  alidated the fre
9f20: 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68  elist.  Given th
9f30: 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  at the freelist 
9f40: 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a  is valid, there.
9f50: 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74    ** is no way t
9f60: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
9f70: 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66  on can extend of
9f80: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
9f90: 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20   page..  ** The 
9fa0: 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76  assert() below v
9fb0: 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76  erifies the prev
9fc0: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20  ious sentence.. 
9fd0: 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79   */.  top -= nBy
9fe0: 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  te;.  put2byte(&
9ff0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
a000: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
a010: 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67 65 2d  +nByte <= pPage-
a020: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a030: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
a040: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
a050: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a060: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
a070: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
a080: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
a090: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
a0a0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
a0b0: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
a0c0: 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74   pPage->aDisk[st
a0d0: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
a0e0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
a0f0: 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65  k is "size" byte
a100: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  s..**.** Most of
a110: 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65   the effort here
a120: 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
a130: 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65  coalesing adjace
a140: 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b  nt.** free block
a150: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
a160: 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a  big free block..
a170: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
a180: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
a190: 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72  *pPage, int star
a1a0: 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  t, int size){.  
a1b0: 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e  int addr, pbegin
a1c0: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61  , hdr;.  int iLa
a1d0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
a1e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
a1f0: 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66  rgest possible f
a200: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
a210: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
a220: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
a230: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
a240: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
a250: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
a260: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a270: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
a280: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
a290: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
a2a0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
a2b0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a2c0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  e );.  assert( (
a2d0: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
a2e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a2f0: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
a300: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a310: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a320: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a330: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
a340: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
a350: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
a360: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
a370: 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
a380: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
a390: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
a3a0: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
a3b0: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
a3c0: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
a3d0: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
a3e0: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
a3f0: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
a400: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  , size);.  }..  
a410: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
a420: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
a430: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
a440: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20  eeblocks.  Note 
a450: 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74  that.  ** even t
a460: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
a470: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
a480: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
a490: 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74  tPage(),.  ** bt
a4a0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69  reeInitPage() di
a4b0: 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  d not detect ove
a4c0: 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f  rlapping cells o
a4d0: 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b  r.  ** freeblock
a4e0: 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65  s that overlappe
a4f0: 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64  d cells.   Nor d
a500: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68  oes it detect wh
a510: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  en the.  ** cell
a520: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78   content area ex
a530: 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20  ceeds the value 
a540: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
a550: 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20  er.  If these.  
a560: 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72  ** situations ar
a570: 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ise, then subseq
a580: 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72  uent insert oper
a590: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72  ations might cor
a5a0: 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72  rupt.  ** the fr
a5b0: 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64  eelist.  So we d
a5c0: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
a5d0: 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  for corruption w
a5e0: 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20  hile scanning.  
a5f0: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
a600: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
a610: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
a620: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
a630: 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67  ;.  iLast = pPag
a640: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a650: 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74  ze - 4;.  assert
a660: 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29  ( start<=iLast )
a670: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
a680: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
a690: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
a6a0: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
a6b0: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c  .    if( pbegin<
a6c0: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
a6d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a6e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a6f0: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  }.    addr = pbe
a700: 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gin;.  }.  if( p
a710: 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20  begin>iLast ){. 
a720: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a730: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a740: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
a750: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
a760: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
a770: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
a780: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
a790: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
a7a0: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
a7b0: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
a7c0: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
a7d0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
a7e0: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31  age->nFree + (u1
a7f0: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
a800: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
a810: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
a820: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
a830: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
a840: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
a850: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
a860: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
a870: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
a880: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
a890: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a8a0: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
a8b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
a8c0: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
a8d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
a8e0: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
a8f0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
a900: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
a910: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
a920: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
a930: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
a940: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
a950: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
a960: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
a970: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
a980: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
a990: 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20  [hdr+7]) ){.    
a9a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a9b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
a9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61        }.      da
a9d0: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38  ta[hdr+7] -= (u8
a9e0: 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d  )frag;.      x =
a9f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
aa00: 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70  pnext]);.      p
aa10: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
aa20: 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20  egin], x);.     
aa30: 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74   x = pnext + get
aa40: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
aa50: 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a  t+2]) - pbegin;.
aa60: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
aa70: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20  data[pbegin+2], 
aa80: 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
aa90: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
aaa0: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
aab0: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
aac0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
aad0: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
aae0: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
aaf0: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
ab00: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
ab10: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
ab20: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
ab30: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
ab40: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
ab50: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
ab60: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
ab70: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
ab80: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
ab90: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
aba0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
abb0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
abc0: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
abd0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
abe0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
abf0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
ac00: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
ac10: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
ac20: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
ac30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ac40: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
ac50: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
ac60: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
ac70: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
ac80: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
ac90: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
aca0: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
acb0: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
acc0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
acd0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
ace0: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
acf0: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
ad00: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
ad10: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
ad20: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
ad30: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
ad40: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
ad50: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
ad60: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
ad70: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
ad80: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
ad90: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
ada0: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
adb0: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
adc0: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
add0: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
ade0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
adf0: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
ae00: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
ae10: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
ae20: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
ae30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ae40: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
ae50: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
ae60: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
ae70: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ae80: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
ae90: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
aea0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
aeb0: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
aec0: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
aed0: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
aee0: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
aef0: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
af00: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
af10: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
af20: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
af30: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
af40: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
af50: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
af60: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
af70: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
af80: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70  age->hasData = p
af90: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
afa0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
afb0: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
afc0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
afd0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
afe0: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
aff0: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
b000: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
b010: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
b020: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
b030: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
b040: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
b050: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
b060: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
b070: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
b080: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
b090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b0a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
b0b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b0c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
b0d0: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
b0e0: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
b0f0: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
b100: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
b110: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
b120: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
b130: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
b140: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
b150: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
b160: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
b170: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
b180: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
b190: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
b1a0: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
b1b0: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
b1c0: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
b1d0: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
b1e0: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
b1f0: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
b200: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
b210: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
b220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
b230: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
b240: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
b250: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b260: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b270: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b280: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b290: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
b2a0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
b2b0: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
b2c0: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
b2d0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b2e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
b2f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b300: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
b310: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b320: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
b330: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b340: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
b350: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
b360: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
b370: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
b380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b390: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
b3a0: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
b3b0: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
b3c0: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
b3d0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b3e0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
b3f0: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
b400: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
b410: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
b420: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
b430: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
b440: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
b450: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
b460: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74  cture */.    int
b470: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
b480: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
b490: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
b4a0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
b4b0: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
b4c0: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
b4d0: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
b4e0: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
b4f0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
b500: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
b510: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
b520: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
b530: 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  age */.    int t
b540: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
b550: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
b560: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b570: 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  area */.    int 
b580: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
b590: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
b5a0: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
b5b0: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
b5c0: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
b5d0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
b5e0: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
b5f0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
b600: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
b610: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
b620: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b630: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
b640: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
b650: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
b660: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
b670: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
b680: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b690: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
b6a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
b6b0: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
b6c0: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20  ze<=65536 );.   
b6d0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
b6e0: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
b6f0: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20  geSize - 1);.   
b700: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
b710: 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c  w = 0;.    usabl
b720: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
b730: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  bleSize;.    pPa
b740: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
b750: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
b760: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
b770: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20  ->leaf;.    top 
b780: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
b790: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
b7a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b7b0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b7c0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b7d0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b7e0: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b7f0: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b800: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b810: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b820: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b830: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b850: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b860: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b870: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b880: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b890: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b8a0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b8b0: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
b8c0: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
b8d0: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
b8e0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
b8f0: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
b900: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
b910: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
b920: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
b930: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
b940: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
b950: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
b960: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
b970: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
b980: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
b990: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
b9a0: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
b9b0: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
b9c0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
b9d0: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
b9e0: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
b9f0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
ba00: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
ba10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
ba20: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
ba30: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
ba40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
ba50: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
ba60: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
ba70: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
ba80: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
ba90: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
baa0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
bab0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
bac0: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
bad0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
bae0: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
baf0: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
bb00: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
bb10: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
bb20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bb30: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
bb40: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
bb50: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
bb60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bb70: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
bb80: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
bb90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
bba0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bbb0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
bbc0: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
bbd0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
bbe0: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
bbf0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bc00: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
bc10: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bc20: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
bc30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
bc40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bc50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
bc60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bc70: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
bc80: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
bc90: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
bca0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
bcb0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
bcc0: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
bcd0: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
bce0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bcf0: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
bd00: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
bd10: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
bd20: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
bd30: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
bd40: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
bd50: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
bd60: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
bd70: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65   /* Start of fre
bd80: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
bd90: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
bda0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bdb0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bdc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
bdd0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
bde0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
bdf0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
be00: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
be10: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
be20: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
be30: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
be40: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
be50: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
be60: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
be70: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
be80: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
be90: 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65  e of..** the fre
bea0: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
beb0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
bec0: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
bed0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bee0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
bf00: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
bf10: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
bf20: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
bf30: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
bf40: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
bf50: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
bf60: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
bf70: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
bf80: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
bf90: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
bfa0: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
bfb0: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
bfc0: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
bfd0: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
bfe0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
bff0: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
c000: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
c010: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
c020: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
c030: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
c040: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
c050: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
c060: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c070: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
c080: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
c090: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
c0a0: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
c0b0: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
c0c0: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
c0d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
c0e0: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
c0f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c100: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c110: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
c120: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
c130: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
c140: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
c150: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
c160: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
c170: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c180: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
c190: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
c1a0: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
c1b0: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
c1c0: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
c1d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
c1e0: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
c1f0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
c200: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
c210: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
c220: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
c230: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
c240: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
c250: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c260: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
c270: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c280: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c290: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c2a0: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c2b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c2c0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c2d0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c2e0: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
c2f0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c300: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c310: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c320: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
c330: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c340: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c350: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c360: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c370: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c380: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c390: 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65   if( pBt->secure
c3a0: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d 65  Delete ){.    me
c3b0: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
c3c0: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
c3d0: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
c3e0: 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
c3f0: 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
c400: 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34  st = hdr + 8 + 4
c410: 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41  *((flags&PTF_LEA
c420: 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d  F)==0 ?1:0);.  m
c430: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
c440: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
c450: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
c460: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c470: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
c480: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
c490: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
c4a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c4b0: 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
c4c0: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
c4d0: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
c4e0: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
c4f0: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
c500: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
c510: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c520: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
c530: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
c540: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
c550: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
c560: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
c570: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
c580: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
c590: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
c5a0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c5b0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
c5c0: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
c5d0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
c5e0: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
c5f0: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
c600: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
c610: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
c620: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
c630: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
c640: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
c650: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
c660: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
c670: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
c680: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
c690: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
c6a0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c6b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
c6c0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
c6d0: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
c6e0: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
c6f0: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
c700: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
c710: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
c720: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
c730: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c740: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
c750: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
c760: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
c770: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
c780: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c790: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c7a0: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c7b0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c7c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
c7d0: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
c7e0: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
c7f0: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
c800: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
c810: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
c820: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
c830: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
c840: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
c850: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
c860: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
c870: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
c880: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
c890: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
c8a0: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
c8b0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
c8c0: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
c8d0: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
c8e0: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
c8f0: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
c900: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
c910: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
c920: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
c930: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
c940: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
c950: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
c960: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
c970: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
c980: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
c990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c9a0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
c9b0: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
c9c0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
c9d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
c9e0: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
c9f0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
ca00: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
ca10: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
ca20: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
ca30: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
ca40: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
ca50: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
ca60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ca70: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
ca80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
ca90: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
caa0: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
cab0: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
cac0: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
cad0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
cae0: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
caf0: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
cb00: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
cb10: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
cb20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cb30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
cb40: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
cb50: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
cb60: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
cb70: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
cb80: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
cb90: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
cba0: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
cbb0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
cbc0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
cbd0: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cbe0: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
cbf0: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
cc00: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
cc10: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
cc20: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
cc30: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
cc40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
cc50: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
cc60: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
cc70: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
cc80: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
cc90: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
cca0: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
ccb0: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
ccc0: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
ccd0: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
cce0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
ccf0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cd00: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
cd10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
cd20: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
cd30: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
cd40: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
cd50: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
cd60: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
cd70: 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
cd80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
cd90: 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
cda0: 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
cdb0: 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
cdc0: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
cdd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
cde0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
cdf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
ce00: 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
ce10: 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
ce20: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 62 74    return (int)bt
ce30: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
ce40: 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
ce50: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
ce60: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
ce70: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
ce80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
ce90: 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  t a.** convenien
cea0: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
ceb0: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
cec0: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
ced0: 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65  () and .** btree
cee0: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
cef0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
cf00: 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 76  curs, then the v
cf10: 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73 20  alue *ppPage is 
cf20: 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66 69  set to is undefi
cf30: 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
cf40: 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
cf50: 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
cf60: 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
cf70: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
cf80: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
cf90: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
cfa0: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
cfb0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
cfc0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
cfd0: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
cfe0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
cff0: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
d000: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
d010: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
d020: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
d030: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
d040: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d050: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d060: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d070: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d080: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d090: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d0a0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d0b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d0c0: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d0d0: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d0e0: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
d0f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d100: 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
d110: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
d120: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d130: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d140: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d150: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
d160: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d170: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d180: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d190: 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
d1a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
d1b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d1c0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d1d0: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
d1e0: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
d1f0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
d200: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
d210: 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
d220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d230: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d240: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d250: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d260: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d270: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d280: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d290: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d2a0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d2b0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d2c0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d2d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d2e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d2f0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d300: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
d310: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d320: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d330: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d340: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
d350: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
d360: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
d370: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
d380: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
d390: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
d3a0: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
d3b0: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
d3c0: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
d3d0: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
d3e0: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
d3f0: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
d400: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
d410: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
d420: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
d430: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
d440: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d450: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
d460: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
d470: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
d480: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
d490: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
d4a0: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
d4b0: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
d4c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
d4d0: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
d4e0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
d4f0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
d500: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
d510: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
d520: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
d530: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d540: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d550: 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
d560: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
d570: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d580: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d590: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d5a0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
d5b0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
d5c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
d5d0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d5e0: 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
d5f0: 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
d600: 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
d610: 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
d620: 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
d630: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
d640: 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
d650: 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
d660: 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
d670: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
d680: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
d690: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
d6a0: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
d6b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
d6c0: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
d6d0: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
d6e0: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
d6f0: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
d700: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
d710: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
d720: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
d730: 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
d740: 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
d750: 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
d760: 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
d770: 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
d780: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
d790: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
d7a0: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
d7b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
d7c0: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
d7d0: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
d7e0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d7f0: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d800: 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
d810: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d820: 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
d830: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
d840: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
d850: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d860: 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
d870: 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
d880: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
d890: 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
d8a0: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
d8b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
d8c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d8d0: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
d8e0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d8f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d900: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
d910: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e   is NULL.** then
d920: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61   an ephemeral da
d930: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
d940: 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  d.  The ephemera
d950: 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  l database might
d960: 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65  .** be exclusive
d970: 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72  ly in memory, or
d980: 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20   it might use a 
d990: 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72  disk-based memor
d9a0: 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68  y cache..** Eith
d9b0: 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65  er way, the ephe
d9c0: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77  meral database w
d9d0: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
d9e0: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a  ally deleted .**
d9f0: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
da00: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
da10: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  led..**.** If zF
da20: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
da30: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
da40: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
da50: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
da60: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
da70: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
da80: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
da90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61  ..**.** The "fla
daa0: 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  gs" parameter is
dab0: 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
dac0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69  might contain bi
dad0: 74 73 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ts.** BTREE_OMIT
dae0: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
daf0: 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43  BTREE_NO_READLOC
db00: 4b 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4e 4f  K.  The BTREE_NO
db10: 5f 52 45 41 44 4c 4f 43 4b 0a 2a 2a 20 62 69 74  _READLOCK.** bit
db20: 20 69 73 20 61 6c 73 6f 20 73 65 74 20 69 66 20   is also set if 
db30: 74 68 65 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61  the SQLITE_NoRea
db40: 64 6c 6f 63 6b 20 66 6c 61 67 73 20 69 73 20 73  dlock flags is s
db50: 65 74 20 69 6e 20 64 62 2d 3e 66 6c 61 67 73 2e  et in db->flags.
db60: 0a 2a 2a 20 54 68 65 73 65 20 66 6c 61 67 73 20  .** These flags 
db70: 61 72 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  are passed throu
db80: 67 68 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 50  gh into sqlite3P
db90: 61 67 65 72 4f 70 65 6e 28 29 20 61 6e 64 20 6d  agerOpen() and m
dba0: 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 73 61  ust.** be the sa
dbb0: 6d 65 20 76 61 6c 75 65 73 20 61 73 20 50 41 47  me values as PAG
dbc0: 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  ER_OMIT_JOURNAL 
dbd0: 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  and PAGER_NO_REA
dbe0: 44 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  DLOCK..**.** If 
dbf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
dc00: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
dc10: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
dc20: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
dc30: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
dc40: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
dc50: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
dc60: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
dc70: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
dc80: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
dc90: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
dca0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
dcb0: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
dcc0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
dcd0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
dce0: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
dcf0: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
dd00: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
dd10: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
dd20: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
dd30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
dd40: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
dd50: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
dd60: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
dd70: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
dd80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
dd90: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
dda0: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
ddb0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
ddc0: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
ddd0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
dde0: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
ddf0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
de00: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
de10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
de20: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
de30: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
de40: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
de50: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
de60: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
de70: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
de80: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
de90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
dea0: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
deb0: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
dec0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
ded0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
dee0: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
def0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
df00: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df20: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
df30: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
df40: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
df50: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
df60: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
df70: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
df80: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
df90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
dfb0: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
dfc0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
dfd0: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
e000: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
e010: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
e020: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
e030: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
e040: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
e050: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ntent */..  /* T
e060: 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61  rue if opening a
e070: 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d  n ephemeral, tem
e080: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
e090: 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
e0a0: 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e  sTempDb = zFilen
e0b0: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
e0c0: 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a  ame[0]==0;..  /*
e0d0: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
e0e0: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
e0f0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
e100: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
e110: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
e120: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
e130: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64  abase..  */.#ifd
e140: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
e150: 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20  EMORYDB.  const 
e160: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
e170: 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69  .#else.  const i
e180: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46  nt isMemdb = (zF
e190: 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d  ilename && strcm
e1a0: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
e1b0: 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20  emory:")==0).   
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62      || (isTempDb
e1e0: 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49   && sqlite3TempI
e1f0: 6e 4d 65 6d 6f 72 79 28 64 62 29 29 3b 0a 23 65  nMemory(db));.#e
e200: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
e210: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
e220: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e230: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
e240: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66   );.  assert( (f
e250: 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67  lags&0xff)==flag
e260: 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20  s );   /* flags 
e270: 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f  fit in 8 bits */
e280: 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54  ..  /* Only a BT
e290: 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
e2a0: 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45  ase can be BTREE
e2b0: 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20  _UNORDERED */.  
e2c0: 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
e2d0: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
e2e0: 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  )==0 || (flags &
e2f0: 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d   BTREE_SINGLE)!=
e300: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52  0 );..  /* A BTR
e310: 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
e320: 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74  se is always a t
e330: 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20  emporary and/or 
e340: 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61  ephemeral */.  a
e350: 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
e360: 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30  BTREE_SINGLE)==0
e370: 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a   || isTempDb );.
e380: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
e390: 20 26 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64   & SQLITE_NoRead
e3a0: 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 66 6c 61 67  lock ){.    flag
e3b0: 73 20 7c 3d 20 42 54 52 45 45 5f 4e 4f 5f 52 45  s |= BTREE_NO_RE
e3c0: 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 69 66  ADLOCK;.  }.  if
e3d0: 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
e3e0: 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f   flags |= BTREE_
e3f0: 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66  MEMORY;.  }.  if
e400: 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
e410: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
e420: 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  B)!=0 && (isMemd
e430: 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29  b || isTempDb) )
e440: 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d  {.    vfsFlags =
e450: 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51   (vfsFlags & ~SQ
e460: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
e470: 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  B) | SQLITE_OPEN
e480: 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20  _TEMP_DB;.  }.  
e490: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
e4a0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
e4b0: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
e4c0: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
e4d0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
e4e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e4f0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
e500: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
e510: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
e520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
e530: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
e540: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
e550: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
e560: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
e570: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
e580: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
e590: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
e5a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
e5b0: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
e5c0: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
e5d0: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
e5e0: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
e5f0: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
e600: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
e610: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
e620: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
e630: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
e640: 73 4d 65 6d 64 62 3d 3d 30 20 26 26 20 69 73 54  sMemdb==0 && isT
e650: 65 6d 70 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20  empDb==0 ){.    
e660: 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
e670: 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
e680: 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
e690: 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
e6a0: 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
e6b0: 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
e6c0: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
e6d0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
e6e0: 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  c(nFullPathname)
e6f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e700: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
e710: 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  ed;.      p->sha
e720: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
e730: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
e740: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
e750: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
e760: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e770: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e780: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e790: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
e7a0: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
e7b0: 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , nFullPathname,
e7c0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e7d0: 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
e7e0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
e7f0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
e800: 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
e810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
e820: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
e830: 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
e840: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
e850: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
e860: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
e870: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
e880: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e890: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
e8a0: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
e8b0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
e8c0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
e8d0: 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
e8e0: 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
e8f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e900: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
e910: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
e920: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
e930: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
e940: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
e950: 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
e960: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
e970: 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
e980: 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
e990: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
e9a0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
e9b0: 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
e9c0: 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
e9e0: 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
e9f0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
ea00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
ea10: 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
ea20: 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
ea30: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
ea40: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ea50: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
ea60: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
ea70: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ea80: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
ea90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
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 20 20 20 20 20 20 73 71 6c 69              sqli
ead0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
eae0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
eaf0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
eb00: 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
eb10: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
eb20: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
eb30: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
eb40: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
eb50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
eb60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
eb70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
eb80: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
eb90: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
eba0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
ebb0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
ebc0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
ebd0: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
ebe0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
ebf0: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
ec00: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
ec10: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
ec20: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
ec30: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
ec40: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
ec50: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
ec60: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
ec70: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
ec80: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
ec90: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
eca0: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
ecb0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
ecc0: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
ecd0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
ece0: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
ecf0: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
ed00: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
ed10: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
ed20: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
ed30: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
ed40: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
ed50: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
ed60: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
ed70: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
ed80: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
ed90: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
eda0: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
edb0: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
edc0: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
edd0: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
ede0: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
edf0: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
ee00: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
ee10: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
ee20: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
ee30: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
ee40: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
ee50: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
ee60: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
ee70: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
ee80: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
ee90: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
eea0: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
eeb0: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
eec0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
eed0: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
eee0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
eef0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
ef00: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
ef10: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
ef20: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
ef30: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
ef40: 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
ef50: 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
ef60: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
ef90: 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
efa0: 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
efb0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
efc0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
efd0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
efe0: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
eff0: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
f000: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
f010: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
f020: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f030: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
f040: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
f050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
f060: 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
f070: 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
f080: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
f090: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
f0a0: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
f0b0: 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
f0c0: 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
f0d0: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
f0e0: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
f0f0: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
f100: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
f110: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61   0;.    pBt->rea
f120: 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50  dOnly = sqlite3P
f130: 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
f140: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 23 69 66  Bt->pPager);.#if
f150: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
f160: 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
f170: 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d  ->secureDelete =
f180: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70   1;.#endif.    p
f190: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
f1a0: 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
f1b0: 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
f1c0: 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
f1d0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
f1e0: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
f1f0: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
f200: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
f210: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
f220: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
f230: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
f240: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
f250: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
f260: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f270: 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
f280: 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
f290: 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
f2a0: 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
f2b0: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
f2c0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
f2d0: 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
f2e0: 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
f2f0: 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
f300: 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
f310: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
f320: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
f330: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
f340: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
f350: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
f360: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
f370: 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
f380: 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
f390: 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
f3a0: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
f3b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
f3c0: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
f3d0: 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
f3e0: 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
f3f0: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
f400: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
f410: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
f420: 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
f430: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
f440: 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
f450: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
f460: 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
f470: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
f480: 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
f490: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
f4a0: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
f4b0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
f4c0: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
f4d0: 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
f4e0: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
f4f0: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
f500: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f510: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
f520: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
f530: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
f540: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
f550: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
f560: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
f570: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
f580: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
f590: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
f5a0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
f5b0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
f5c0: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
f5d0: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
f5e0: 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
f5f0: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
f600: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f610: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
f620: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
f630: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
f640: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
f650: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
f660: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
f670: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
f680: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
f690: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
f6a0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f6b0: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
f6c0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
f6d0: 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
f6e0: 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
f6f0: 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
f700: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
f710: 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
f720: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
f730: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
f740: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f750: 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a  x *mutexShared;.
f760: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
f770: 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  = 1;.      mutex
f780: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
f790: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
f7a0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
f7b0: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66  ASTER);.      if
f7c0: 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
f7d0: 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
f7e0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
f7f0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
f800: 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
f810: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
f820: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
f830: 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
f840: 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
f850: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f860: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f870: 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
f880: 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
f890: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
f8a0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
f8b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f8c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f8d0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
f8e0: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
f8f0: 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
f900: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f910: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f920: 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
f930: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f940: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f950: 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
f960: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f970: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
f980: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
f990: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
f9a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
f9b0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
f9c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f9d0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
f9e0: 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
f9f0: 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
fa00: 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
fa10: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
fa20: 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
fa30: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
fa40: 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
fa50: 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
fa60: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
fa70: 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
fa80: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
fa90: 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
faa0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
fab0: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
fac0: 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
fad0: 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
fae0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
faf0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
fb00: 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
fb10: 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
fb20: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
fb30: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
fb40: 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
fb50: 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
fb60: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
fb70: 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
fb80: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
fb90: 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
fba0: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
fbb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
fbc0: 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
fbd0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
fbe0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
fbf0: 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
fc00: 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
fc10: 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
fc20: 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
fc30: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
fc40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
fc50: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
fc60: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
fc70: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
fc80: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
fc90: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
fca0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
fcb0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
fcc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fcd0: 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
fce0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
fcf0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
fd00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
fd10: 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
fd20: 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
fd30: 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
fd40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fd50: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
fd60: 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
fd70: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
fd80: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
fd90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
fda0: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
fdb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
fdc0: 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
fdd0: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
fde0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d      /* If the B-
fdf0: 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73  Tree was success
fe00: 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65  fully opened, se
fe10: 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
fe20: 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20  e size to the.  
fe30: 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
fe40: 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e  ue. Except, when
fe50: 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65   opening on an e
fe60: 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
fe70: 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20  ager-cache,.    
fe80: 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ** do not change
fe90: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
fea0: 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
feb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
fec0: 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30  eeSchema(p, 0, 0
fed0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
fee0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
fef0: 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70  hesize(p->pBt->p
ff00: 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
ff10: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
ff20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
ff30: 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
ff40: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
ff50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
ff60: 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
ff70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ff80: 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
ff90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ffa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
ffb0: 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
ffc0: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
ffd0: 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
ffe0: 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
fff0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
10000 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
10010 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
10020 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
10030 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
10040 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
10050 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
10060 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
10070 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
10080 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
10090 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
100a0 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
100b0 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
100c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
100d0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c  ARED_CACHE.  sql
100e0 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
100f0 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ter;.  BtShared 
10100 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
10110 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
10120 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10130 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
10140 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61  >mutex) );.  pMa
10150 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
10160 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
10170 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
10180 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TER);.  sqlite3_
10190 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
101a0 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
101b0 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
101c0 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
101d0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
101e0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
101f0 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
10200 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
10210 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
10220 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10230 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
10240 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10250 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
10260 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
10270 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10280 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
10290 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
102a0 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
102b0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
102c0 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
102d0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
102e0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
102f0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
10300 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
10310 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
10320 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
10330 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
10340 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10350 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
10360 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
10370 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
10380 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
10390 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
103a0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
103b0 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
103c0 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
103d0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
103e0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
103f0 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
10400 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
10410 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
10420 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
10430 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
10440 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
10450 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
10460 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
10470 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
10480 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
10490 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
104a0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
104b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
104c0 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
104d0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
104e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
104f0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
10500 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
10510 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
10520 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
10530 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
10540 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
10550 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
10560 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
10570 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
10580 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10590 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
105a0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
105b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
105c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
105d0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
105e0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
105f0 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
10600 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
10610 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10620 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10630 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10640 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
10650 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
10660 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
10670 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
10680 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
10690 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
106a0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
106b0 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
106c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
106d0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
106e0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
106f0 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
10700 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
10710 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
10720 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
10730 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
10740 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
10750 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
10760 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
10770 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
10780 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
10790 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
107a0 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
107b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
107c0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
107d0 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
107e0 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
107f0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
10800 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
10810 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
10820 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
10830 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
10840 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
10850 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
10860 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
10870 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
10880 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
10890 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
108a0 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
108b0 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
108c0 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
108d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
108e0 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
108f0 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
10900 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
10910 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
10920 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
10930 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
10940 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
10950 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
10960 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
10970 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
10980 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
10990 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
109a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
109b0 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
109c0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
109d0 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
109e0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
109f0 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
10a00 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
10a10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10a20 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
10a30 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10a40 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
10a50 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
10a60 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
10a70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10a80 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
10a90 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
10aa0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
10ab0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
10ac0 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
10ad0 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
10ae0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
10af0 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
10b00 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
10b10 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
10b20 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
10b30 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10b50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
10b60 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
10b70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
10b80 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
10b90 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
10ba0 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
10bb0 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
10bc0 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
10bd0 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
10be0 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
10bf0 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
10c00 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
10c10 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
10c20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
10c30 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
10c40 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
10c50 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
10c60 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
10c70 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
10c80 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
10c90 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
10ca0 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
10cb0 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
10cc0 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
10cd0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
10ce0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
10cf0 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
10d00 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
10d10 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
10d20 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
10d30 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
10d40 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
10d50 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
10d60 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
10d70 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
10d80 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
10d90 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
10da0 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
10db0 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
10dc0 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
10dd0 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
10de0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
10df0 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
10e00 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
10e10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10e20 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
10e30 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
10e40 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
10e50 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10e60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10e70 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
10e80 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
10e90 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10ea0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
10eb0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
10ec0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
10ed0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
10ee0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
10ef0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10f00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
10f10 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
10f20 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
10f30 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
10f40 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
10f50 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
10f60 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
10f70 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
10f80 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
10f90 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
10fa0 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
10fb0 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
10fc0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
10fd0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
10fe0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
10ff0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
11000 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
11010 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
11020 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
11030 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
11040 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
11050 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
11060 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
11070 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
11080 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
11090 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
110a0 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
110b0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
110c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
110d0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
110e0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
110f0 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
11100 65 6c 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  el(.  Btree *p, 
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11120 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
11130 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
11140 6c 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  l on */.  int le
11150 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
11160 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68   /* PRAGMA synch
11170 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20  ronous.  1=OFF, 
11180 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c  2=NORMAL, 3=FULL
11190 20 2a 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79   */.  int fullSy
111a0 6e 63 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nc,          /* 
111b0 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63  PRAGMA fullfsync
111c0 2e 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46  . */.  int ckptF
111d0 75 6c 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a  ullSync       /*
111e0 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
111f0 6e 74 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29  nt_fullfync */.)
11200 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11210 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
11220 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11230 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11240 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11250 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20  rt( level>=1 && 
11260 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71  level<=3 );.  sq
11270 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11280 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11290 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
112a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
112b0 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63  vel, fullSync, c
112c0 6b 70 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  kptFullSync);.  
112d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
112e0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
112f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
11300 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
11310 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
11320 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
11330 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
11340 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
11350 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
11360 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
11370 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
11380 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
11390 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
113a0 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
113b0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
113c0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
113d0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
113e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
113f0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11400 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
11410 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11420 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
11430 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
11440 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
11450 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
11460 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
11470 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11480 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11490 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
114a0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
114b0 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
114c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
114d0 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43  _VACUUM)./*.** C
114e0 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
114f0 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
11500 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
11510 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
11520 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
11530 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
11540 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
11550 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
11560 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
11570 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
11580 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
11590 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
115a0 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
115b0 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
115c0 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
115d0 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
115e0 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
115f0 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
11600 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
11610 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
11620 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
11630 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
11640 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
11650 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
11660 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
11670 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
11680 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11690 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
116a0 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
116b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
116c0 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
116d0 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
116e0 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
116f0 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
11700 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
11710 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
11720 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
11730 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
11740 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
11750 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
11760 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
11770 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
11780 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
11790 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
117a0 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ix!=0 then the p
117b0 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61  ageSizeFixed fla
117c0 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
117d0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
117e0 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
117f0 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
11800 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
11810 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11820 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
11830 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
11840 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
11850 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
11860 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11870 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
11880 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11890 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
118a0 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
118b0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
118c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
118d0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
118e0 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
118f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
11900 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
11910 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
11920 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
11930 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
11940 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
11950 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
11960 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
11970 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
11980 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
11990 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
119a0 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
119b0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
119c0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
119d0 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
119e0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
119f0 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
11a00 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
11a10 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
11a20 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
11a30 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
11a40 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
11a50 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
11a60 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
11a70 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
11a80 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
11a90 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
11aa0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
11ab0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
11ac0 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
11ad0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
11ae0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
11af0 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
11b00 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
11b10 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
11b20 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 1;.  sqlite3B
11b30 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11b40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11b50 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
11b60 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
11b70 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
11b80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
11b90 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
11ba0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
11bb0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
11bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11bd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
11be0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
11bf0 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
11c00 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
11c10 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
11c20 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
11c30 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
11c40 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
11c50 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
11c60 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
11c70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11c80 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
11c90 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
11ca0 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
11cb0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
11cc0 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
11cd0 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
11ce0 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
11cf0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11d00 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
11d10 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
11d20 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
11d30 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
11d40 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
11d50 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
11d60 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
11d70 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
11d80 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
11d90 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
11da0 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
11db0 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
11dc0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
11dd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11de0 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
11df0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
11e00 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
11e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11e20 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
11e30 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
11e40 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
11e50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
11e60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11e70 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11e80 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
11e90 74 68 65 20 73 65 63 75 72 65 44 65 6c 65 74 65  the secureDelete
11ea0 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67   flag if newFlag
11eb0 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20   is 0 or 1.  If 
11ec0 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a  newFlag is -1,.*
11ed0 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63  * then make no c
11ee0 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20  hanges.  Always 
11ef0 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
11f00 20 6f 66 20 74 68 65 20 73 65 63 75 72 65 44 65   of the secureDe
11f10 6c 65 74 65 0a 2a 2a 20 73 65 74 74 69 6e 67 20  lete.** setting 
11f20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
11f30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11f40 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
11f50 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
11f60 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
11f70 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
11f80 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
11f90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11fa0 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
11fb0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
11fc0 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d  ->secureDelete =
11fd0 20 28 6e 65 77 46 6c 61 67 21 3d 30 29 20 3f 20   (newFlag!=0) ? 
11fe0 31 20 3a 20 30 3b 0a 20 20 7d 20 0a 20 20 62 20  1 : 0;.  } .  b 
11ff0 3d 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65  = p->pBt->secure
12000 44 65 6c 65 74 65 3b 0a 20 20 73 71 6c 69 74 65  Delete;.  sqlite
12010 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12020 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65    return b;.}.#e
12030 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
12040 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
12050 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
12060 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12070 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a  MIT_VACUUM) */..
12080 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
12090 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
120a0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
120b0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
120c0 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
120d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
120e0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
120f0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
12100 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
12110 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
12120 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
12130 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
12140 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
12150 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
12160 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
12170 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
12180 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
12190 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
121a0 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
121b0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
121c0 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
121d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
121e0 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
121f0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
12200 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
12210 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
12220 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12230 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
12240 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
12250 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
12260 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
12270 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
12280 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29  xed && (av ?1:0)
12290 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
122a0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
122b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
122c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
122d0 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
122e0 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
122f0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
12300 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
12310 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12320 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12330 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
12340 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
12350 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
12360 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
12370 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
12380 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
12390 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
123a0 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
123b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
123c0 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
123d0 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
123e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
123f0 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
12400 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
12410 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
12420 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
12430 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12440 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
12450 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
12460 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
12470 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
12480 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
12490 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
124a0 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
124b0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
124c0 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
124d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
124e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
124f0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
12500 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
12510 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
12520 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
12530 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
12540 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
12550 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
12560 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
12570 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
12580 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
12590 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
125a0 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
125b0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
125c0 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
125d0 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
125e0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
125f0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
12600 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
12610 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
12620 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
12630 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
12640 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
12650 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
12660 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
12670 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
12680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12690 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
126a0 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
126b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
126c0 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
126d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
126e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
126f0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
12700 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
12710 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
12720 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
12730 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
12740 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
12750 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
12760 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
12770 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
12780 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
12790 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
127a0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
127b0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
127c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
127d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
127e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
127f0 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
12800 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12810 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
12820 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
12830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12840 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
12850 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
12860 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
12870 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
12880 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
12890 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
128a0 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
128b0 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
128c0 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
128d0 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
128e0 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
128f0 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
12900 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
12910 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
12920 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
12930 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
12940 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
12950 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
12960 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
12970 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
12980 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
12990 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
129a0 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
129b0 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
129c0 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
129d0 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
129e0 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
129f0 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
12a00 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
12a10 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
12a20 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
12a30 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
12a40 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
12a50 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
12a60 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
12a70 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12a80 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
12a90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12aa0 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
12ab0 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
12ac0 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
12ad0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
12ae0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
12af0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12b00 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12b10 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
12b20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
12b30 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  2 ){.      pBt->
12b40 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
12b50 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
12b60 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
12b70 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12b80 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
12b90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
12ba0 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
12bb0 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
12bc0 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
12bd0 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
12be0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
12bf0 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
12c00 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
12c10 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
12c20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
12c30 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
12c40 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
12c50 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
12c60 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
12c70 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
12c80 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
12c90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
12ca0 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
12cb0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
12cc0 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
12cd0 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
12ce0 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
12cf0 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
12d00 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
12d10 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
12d20 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
12d30 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
12d40 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
12d50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
12d60 31 5b 31 39 5d 3d 3d 32 20 26 26 20 70 42 74 2d  1[19]==2 && pBt-
12d70 3e 64 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d 30 20  >doNotUseWAL==0 
12d80 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
12d90 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
12da0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12db0 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
12dc0 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
12dd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12df0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12e00 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
12e10 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
12e20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
12e30 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
12e40 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  1);.        retu
12e50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12e60 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
12e70 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
12e80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
12e90 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
12ea0 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
12eb0 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  on must be exact
12ec0 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65  ly 25%.  And the
12ed0 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
12ee0 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
12ef0 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20  n must be 12.5% 
12f00 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61  for both leaf-da
12f10 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d  ta and non-leaf-
12f20 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65  data..    ** The
12f30 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
12f40 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
12f50 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
12f60 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
12f70 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
12f80 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
12f90 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
12fa0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
12fb0 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
12fc0 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
12fd0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
12fe0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
12ff0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
13000 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
13010 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
13020 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
13030 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31  if( ((pageSize-1
13040 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20  )&pageSize)!=0. 
13050 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e      || pageSize>
13060 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
13070 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61  SIZE .     || pa
13080 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20  geSize<=256 .   
13090 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
130a0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
130b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
130c0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
130d0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61  7)==0 );.    usa
130e0 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
130f0 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
13100 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
13110 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
13120 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
13130 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
13140 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
13150 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
13160 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
13170 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
13180 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
13190 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
131a0 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
131b0 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
131c0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
131d0 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
131e0 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
131f0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
13200 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
13210 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
13220 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
13230 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
13240 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
13250 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
13260 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
13270 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
13280 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
13290 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
132a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
132b0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
132c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
132d0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
132e0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
132f0 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
13300 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
13310 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
13320 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
13330 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
13360 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
13370 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13380 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
13390 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
133a0 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
133b0 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
133c0 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
133d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
133e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
133f0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
13400 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
13410 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
13420 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
13430 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13440 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
13450 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
13460 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
13470 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
13480 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23   = usableSize;.#
13490 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
134a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
134b0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
134c0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
134d0 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
134e0 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
134f0 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
13500 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
13510 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
13520 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
13530 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
13540 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
13550 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
13560 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
13570 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
13580 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
13590 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
135a0 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
135b0 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
135c0 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
135d0 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
135e0 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
135f0 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
13600 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
13610 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
13620 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
13630 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
13640 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
13650 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
13660 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
13670 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
13680 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
13690 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
136a0 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
136b0 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
136c0 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
136d0 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
136e0 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
136f0 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  nter, a header w
13700 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
13710 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
13720 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
13730 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
13740 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
13750 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
13760 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
13770 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
13780 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  axLocal = (u16)(
13790 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
137a0 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
137b0 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  );.  pBt->minLoc
137c0 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
137d0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
137e0 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
137f0 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28  pBt->maxLeaf = (
13800 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
13810 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42  Size - 35);.  pB
13820 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31  t->minLeaf = (u1
13830 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
13840 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
13850 20 32 33 29 3b 0a 20 20 61 73 73 65 72 74 28 20   23);.  assert( 
13860 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
13870 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
13880 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
13890 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
138a0 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  ;.  pBt->nPage =
138b0 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
138c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
138d0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
138e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
138f0 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
13900 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
13910 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13920 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
13930 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
13940 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
13950 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
13960 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
13970 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
13980 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
13990 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
139a0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
139b0 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
139c0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
139d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
139e0 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
139f0 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
13a00 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
13a10 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
13a20 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
13a30 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
13a40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13a50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
13a60 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
13a70 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
13a80 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
13a90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13aa0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
13ab0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
13ac0 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  t( pBt->pCursor=
13ad0 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
13ae0 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
13af0 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
13b00 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
13b10 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
13b20 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
13b30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
13b40 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
13b50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
13b60 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
13b70 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
13b80 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
13b90 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
13ba0 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c  aData );.    rel
13bb0 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
13bc0 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age1);.    pBt->
13bd0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a  pPage1 = 0;.  }.
13be0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
13bf0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
13c00 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
13c10 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
13c20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
13c30 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
13c40 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
13c50 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
13c60 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
13c70 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
13c80 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
13c90 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
13ca0 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
13cb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13cc0 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
13cd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13ce0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
13cf0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
13d00 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
13d10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13d20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
13d30 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
13d40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
13d50 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
13d60 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
13d70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
13d80 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
13d90 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
13da0 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
13db0 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
13dc0 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
13dd0 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
13de0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
13df0 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
13e00 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
13e10 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
13e20 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
13e30 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
13e40 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
13e50 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
13e60 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
13e70 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
13e80 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
13e90 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
13ea0 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
13eb0 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
13ec0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
13ed0 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
13ee0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
13ef0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
13f00 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
13f10 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
13f20 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
13f30 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
13f40 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
13f50 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
13f60 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
13f70 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
13f80 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70  DATA );.  pBt->p
13f90 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
13fa0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13fb0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
13fc0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
13fd0 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  autoVacuum==1 ||
13fe0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
13ff0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
14000 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
14010 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72  ==1 || pBt->incr
14020 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70  Vacuum==0 );.  p
14030 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
14040 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75   + 4*4], pBt->au
14050 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74  toVacuum);.  put
14060 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
14070 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72   7*4], pBt->incr
14080 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a  Vacuum);.#endif.
14090 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31    pBt->nPage = 1
140a0 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31  ;.  data[31] = 1
140b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
140c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
140d0 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
140e0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
140f0 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
14100 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
14110 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
14120 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
14130 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
14140 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
14150 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
14160 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14170 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
14180 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
14190 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
141a0 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
141b0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
141c0 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
141d0 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
141e0 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
141f0 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
14200 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
14210 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
14220 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
14230 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
14240 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
14250 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
14260 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
14270 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
14280 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
14290 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
142a0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
142b0 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
142c0 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
142d0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
142e0 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
142f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14300 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
14310 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
14320 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
14330 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
14340 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
14350 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
14360 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
14370 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
14380 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
14390 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
143a0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
143b0 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
143c0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
143d0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
143e0 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
143f0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
14400 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
14410 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
14420 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
14430 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
14440 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
14450 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
14460 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
14470 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
14480 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
14490 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
144a0 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
144b0 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
144c0 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
144d0 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
144e0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
144f0 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
14500 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
14510 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
14520 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
14530 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
14540 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
14550 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
14560 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
14570 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
14580 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
14590 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
145a0 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
145b0 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
145c0 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
145d0 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
145e0 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
145f0 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
14600 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
14610 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
14620 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
14630 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
14640 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
14650 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
14660 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
14670 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
14680 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
14690 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
146a0 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
146b0 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
146c0 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
146d0 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
146e0 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
146f0 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
14700 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
14710 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
14720 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
14730 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
14740 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
14750 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
14760 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14770 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
14780 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
14790 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42  ){.  sqlite3 *pB
147a0 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68  lock = 0;.  BtSh
147b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
147c0 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
147d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
147e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
147f0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
14800 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
14810 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
14820 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
14830 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
14840 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
14850 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
14860 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
14870 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
14880 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
14890 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
148a0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
148b0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
148c0 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
148d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
148e0 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
148f0 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
14900 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  _begun;.  }..  /
14910 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
14920 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
14930 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
14940 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
14950 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64  .  if( pBt->read
14960 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29  Only && wrflag )
14970 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14980 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
14990 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
149a0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
149b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
149c0 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20  D_CACHE.  /* If 
149d0 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
149e0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
149f0 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
14a00 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
14a10 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
14a20 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
14a30 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
14a40 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
14a50 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
14a60 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
14a70 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f  ITE_LOCKED..  */
14a80 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26  .  if( (wrflag &
14a90 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
14aa0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
14ab0 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50 65 6e  E) || pBt->isPen
14ac0 64 69 6e 67 20 29 7b 0a 20 20 20 20 70 42 6c 6f  ding ){.    pBlo
14ad0 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
14ae0 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69  r->db;.  }else i
14af0 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
14b00 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
14b10 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  ;.    for(pIter=
14b20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
14b30 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
14b40 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
14b50 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
14b60 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =p ){.        pB
14b70 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42  lock = pIter->pB
14b80 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
14b90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
14ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
14bb0 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73   pBlock ){.    s
14bc0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
14bd0 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
14be0 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d  Block);.    rc =
14bf0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
14c00 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20  HAREDCACHE;.    
14c10 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
14c20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
14c30 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
14c40 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
14c50 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
14c60 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
14c70 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
14c80 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
14c90 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
14ca0 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
14cb0 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
14cc0 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
14cd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
14ce0 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
14cf0 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
14d00 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
14d10 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
14d20 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
14d30 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
14d40 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
14d50 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
14d60 3e 69 6e 69 74 69 61 6c 6c 79 45 6d 70 74 79 20  >initiallyEmpty 
14d70 3d 20 28 75 38 29 28 70 42 74 2d 3e 6e 50 61 67  = (u8)(pBt->nPag
14d80 65 3d 3d 30 29 3b 0a 20 20 64 6f 20 7b 0a 20 20  e==0);.  do {.  
14d90 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74    /* Call lockBt
14da0 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68  ree() until eith
14db0 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  er pBt->pPage1 i
14dc0 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20  s populated or. 
14dd0 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28     ** lockBtree(
14de0 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
14df0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
14e00 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74  QLITE_OK. lockBt
14e10 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ree().    ** may
14e20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14e30 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d  K but leave pBt-
14e40 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30  >pPage1 set to 0
14e50 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a   if after.    **
14e60 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20   reading page 1 
14e70 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  it discovers tha
14e80 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
14e90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
14ea0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  .    ** file is 
14eb0 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  not pBt->pageSiz
14ec0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
14ed0 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c  lockBtree() will
14ee0 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70   update.    ** p
14ef0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20  Bt->pageSize to 
14f00 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
14f10 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
14f20 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  k..    */.    wh
14f30 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
14f40 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
14f50 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65  ==(rc = lockBtre
14f60 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20  e(pBt)) );..    
14f70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14f80 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
14f90 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65       if( pBt->re
14fa0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
14fb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
14fc0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
14fd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
14fe0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
14ff0 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  gin(pBt->pPager,
15000 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33  wrflag>1,sqlite3
15010 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e  TempInMemory(p->
15020 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db));.        if
15030 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
15050 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
15060 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
15070 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
15080 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
150a0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
150b0 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
150c0 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46  }while( (rc&0xFF
150d0 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
150e0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
150f0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
15100 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
15110 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
15120 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20  dler(pBt) );..  
15130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15140 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
15150 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
15160 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
15170 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
15180 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
15190 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
151a0 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  HE.      if( p->
151b0 73 68 61 72 61 62 6c 65 20 29 7b 0a 09 61 73 73  sharable ){..ass
151c0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
151d0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
151e0 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
151f0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
15200 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
15210 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
15220 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
15230 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
15240 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
15250 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
15260 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
15270 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
15280 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
15290 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
152a0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
152b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
152c0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
152d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
152e0 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
152f0 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
15300 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
15310 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
15320 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
15330 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
15340 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
15350 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
15360 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
15370 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
15380 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78  .      pBt->isEx
15390 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28 77  clusive = (u8)(w
153a0 72 66 6c 61 67 3e 31 29 3b 0a 23 65 6e 64 69 66  rflag>1);.#endif
153b0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
153c0 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72  e db-size header
153d0 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72   field is incorr
153e0 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62  ect (as it may b
153f0 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20  e if an old.    
15400 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20    ** client has 
15410 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  been writing the
15420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
15430 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20   update it now. 
15440 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  Doing.      ** t
15450 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  his sooner rathe
15460 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61  r than later mea
15470 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
15480 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20  size can safely 
15490 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61  .      ** re-rea
154a0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
154b0 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20  ize from page 1 
154c0 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f  if a savepoint o
154d0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  r transaction.  
154e0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
154f0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
15500 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
15510 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
15520 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65  ( pBt->nPage!=ge
15530 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
15540 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20  aData[28]) ){.  
15550 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15560 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
15570 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
15580 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
15590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
155a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
155b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
155c0 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
155d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
155e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72  }.    }.  }...tr
155f0 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
15600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15610 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
15620 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
15630 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
15640 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
15650 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
15660 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
15670 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
15680 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
15690 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
156a0 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
156b0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
156c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
156d0 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
156e0 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
156f0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
15700 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
15710 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
15720 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
15730 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
15740 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
15750 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
15760 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15770 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
15780 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15790 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
157a0 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
157b0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
157c0 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
157d0 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
157e0 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
157f0 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
15800 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
15810 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
15820 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
15830 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
15840 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
15850 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
15860 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
15870 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
15880 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
15890 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
158c0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
158d0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
158f0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
15900 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
15910 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15930 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
15940 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
15950 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
15960 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69  >pBt;.  u8 isIni
15970 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
15980 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
15990 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
159a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
159b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
159c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
159d0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  x) );.  rc = btr
159e0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
159f0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
15a10 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
15a20 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  maps_out;.  }.  
15a30 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
15a40 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
15a50 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
15a60 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
15a70 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
15a80 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70   i);..    ptrmap
15a90 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
15aa0 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
15ab0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
15ac0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
15ad0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
15ae0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
15af0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
15b00 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
15b10 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
15b20 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
15b30 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
15b40 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
15b50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
15b60 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
15b70 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
15b80 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
15b90 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
15ba0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
15bb0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
15bc0 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68  rc);.  }..set_ch
15bd0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a  ild_ptrmaps_out:
15be0 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
15bf0 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
15c00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15c10 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
15c20 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69  n pPage is a poi
15c30 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
15c40 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73  om.  Modify this
15c50 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74   pointer so.** t
15c60 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
15c70 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
15c80 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
15c90 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
15ca0 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64  ter to.** be mod
15cb0 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f  ified, as  follo
15cc0 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
15cd0 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
15ce0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
15cf0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
15d00 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
15d10 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
15d20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
15d30 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
15d40 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
15d50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
15d60 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
15d70 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
15d80 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
15d90 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
15da0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
15db0 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
15dc0 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
15dd0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
15de0 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
15df0 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
15e00 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
15e10 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
15e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
15e40 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
15e50 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
15e60 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
15e70 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
15e80 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
15e90 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
15ea0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15eb0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
15ec0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
15ed0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15ee0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
15ef0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
15f00 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
15f10 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
15f20 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
15f30 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
15f40 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
15f50 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
15f60 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
15f70 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
15f80 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
15f90 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
15fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15fb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
15fc0 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
15fd0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
15fe0 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
15ff0 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
16000 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
16010 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
16020 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  int nCell;..    
16030 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
16040 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  age);.    nCell 
16050 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
16060 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16070 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
16080 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
16090 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
160a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
160b0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
160c0 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
160d0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
160e0 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73         btreePars
160f0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
16100 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
16110 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
16120 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
16130 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
16140 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
16150 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
16160 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
16170 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
16180 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
16190 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
161a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
161b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
161c0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
161d0 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
161e0 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
161f0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
16200 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
16210 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
16220 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
16230 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16240 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
16250 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
16260 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
16270 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
16280 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
16290 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
162a0 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
162b0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
162c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
162d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
162e0 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
162f0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
16300 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
16310 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
16320 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
16330 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
16340 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
16350 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
16360 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
16370 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
16380 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
16390 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
163a0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
163b0 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
163c0 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
163d0 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
163e0 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
163f0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
16400 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
16410 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
16420 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
16430 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
16440 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
16450 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
16460 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
16470 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
16480 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
16490 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
164a0 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
164b0 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
164c0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
164d0 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
164e0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
164f0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
16500 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
16510 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
16520 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
16530 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
16540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16550 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
16560 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
16570 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
16580 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
16590 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
165a0 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
165b0 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
165c0 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
165d0 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
165e0 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
165f0 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
16600 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
16610 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
16620 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
16630 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
16640 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
16650 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
16660 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
16670 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
16680 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
16690 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
166a0 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
166b0 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
166c0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
166d0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
166e0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
166f0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
16700 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
16710 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
16720 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
16730 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
16740 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
16750 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
16760 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16770 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
16780 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
16790 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
167a0 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
167b0 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
167c0 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
167d0 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
167e0 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
167f0 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
16800 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
16810 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
16820 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
16830 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
16840 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
16850 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
16860 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
16870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16880 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
16890 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
168a0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
168b0 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
168c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
168d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
168e0 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
168f0 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
16900 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
16910 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
16920 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
16930 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
16940 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
16950 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
16960 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
16970 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
16980 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
16990 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
169a0 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
169b0 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
169c0 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
169d0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
169e0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
169f0 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
16a00 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
16a10 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
16a20 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
16a30 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
16a40 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
16a50 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
16a60 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
16a70 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
16a80 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
16a90 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
16aa0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
16ab0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
16ac0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
16ad0 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
16ae0 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
16af0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
16b00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16b10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16b20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
16b30 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
16b40 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
16b50 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
16b60 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
16b70 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
16b80 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
16b90 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
16ba0 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
16bb0 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
16bc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16bd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16be0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
16bf0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
16c00 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
16c10 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
16c20 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
16c30 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
16c40 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
16c50 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
16c60 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
16c70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
16c80 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
16c90 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
16ca0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
16cb0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
16cc0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
16cd0 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
16ce0 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
16cf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
16d10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
16d20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16d30 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
16d40 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
16d50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16d60 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
16d70 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
16d80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
16d90 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
16da0 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
16db0 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
16dc0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
16dd0 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
16de0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
16df0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
16e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16e10 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
16e20 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
16e30 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
16e40 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
16e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16e60 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
16e70 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
16e80 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
16e90 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
16ea0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
16eb0 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
16ec0 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
16ed0 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
16ee0 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
16ef0 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
16f00 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
16f10 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
16f20 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
16f30 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
16f40 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
16f50 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
16f60 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69  re no.** point i
16f70 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  n calling this f
16f80 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
16f90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
16fa0 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  NE..**.** More s
16fb0 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
16fc0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
16fd0 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
16fe0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
16ff0 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61  e so that the la
17000 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
17010 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
17020 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f   use.** is no lo
17030 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
17040 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70  ** If the nFin p
17050 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
17060 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
17070 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
17080 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
17090 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
170a0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
170b0 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
170c0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
170d0 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
170e0 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
170f0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
17100 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
17110 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
17120 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
17130 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
17140 63 6f 6d 70 6c 65 74 65 2e 20 20 49 66 20 6e 46  complete.  If nF
17150 69 6e 20 69 73 20 7a 65 72 6f 2c 20 69 74 20 69  in is zero, it i
17160 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
17170 2a 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  * incrVacuumStep
17180 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  () will be calle
17190 64 20 61 20 66 69 6e 69 74 65 20 61 6d 6f 75 6e  d a finite amoun
171a0 74 20 6f 66 20 74 69 6d 65 73 0a 2a 2a 20 77 68  t of times.** wh
171b0 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
171c0 6f 74 20 65 6d 70 74 79 20 74 68 65 20 66 72 65  ot empty the fre
171d0 65 6c 69 73 74 2e 20 20 41 20 66 75 6c 6c 20 61  elist.  A full a
171e0 75 74 6f 76 61 63 75 75 6d 0a 2a 2a 20 68 61 73  utovacuum.** has
171f0 20 6e 46 69 6e 3e 30 2e 20 20 41 20 22 50 52 41   nFin>0.  A "PRA
17200 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f  GMA incremental_
17210 76 61 63 75 75 6d 22 20 68 61 73 20 6e 46 69 6e  vacuum" has nFin
17220 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ==0..*/.static i
17230 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
17240 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
17250 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
17260 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e   iLastPg){.  Pgn
17270 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
17280 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17290 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
172a0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
172b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
172c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
172d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
172e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
172f0 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
17300 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
17310 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
17320 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
17330 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
17340 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
17350 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
17360 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
17370 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
17380 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
17390 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
173a0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
173b0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
173c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
173d0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
173e0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
173f0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
17400 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
17410 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
17420 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17440 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
17450 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
17460 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17470 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
17480 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
17490 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
174a0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
174b0 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
174c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
174d0 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
174e0 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
174f0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
17500 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
17510 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
17520 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
17530 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
17540 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
17550 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
17560 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
17570 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
17580 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
17590 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
175a0 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
175b0 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
175c0 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
175d0 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
175e0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
175f0 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
17600 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
17610 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
17620 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
17630 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
17640 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
17650 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
17660 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17670 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
17680 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17690 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
176a0 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
176b0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
176c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
176d0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
176e0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
176f0 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
17700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17710 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
17720 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
17730 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
17740 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
17750 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
17760 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
17770 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
17780 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
17790 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
177a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
177b0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
177c0 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
177d0 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
177e0 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
177f0 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
17800 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
17810 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
17820 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
17830 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
17840 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
17850 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
17860 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
17870 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
17880 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
17890 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
178a0 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
178b0 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
178c0 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
178d0 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
178e0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
178f0 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
17900 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
17910 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
17920 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
17930 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
17940 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
17950 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
17960 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
17970 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17980 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17990 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
179a0 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
179b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
179c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
179d0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
179e0 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
179f0 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
17a00 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
17a10 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
17a20 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
17a30 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
17a40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
17a50 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
17a60 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
17a70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17a80 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
17a90 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
17aa0 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
17ab0 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
17ac0 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
17ad0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
17ae0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
17af0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17b00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17b20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
17b30 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
17b40 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a  .    iLastPg--;.
17b50 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74      while( iLast
17b60 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
17b70 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
17b80 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
17b90 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
17ba0 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
17bb0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
17bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
17bd0 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  age *pPg;.      
17be0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
17bf0 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
17c00 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
17c10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17c20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17c30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17c50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17c60 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
17c70 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
17c80 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
17c90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
17ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17cb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17cc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17cd0 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50    }.      iLastP
17ce0 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g--;.    }.    s
17cf0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
17d00 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
17d10 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a  ager, iLastPg);.
17d20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
17d30 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
17d40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
17d60 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
17d70 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
17d80 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
17d90 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
17da0 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
17db0 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
17dc0 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
17dd0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
17de0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
17df0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
17e00 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
17e10 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
17e20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
17e30 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
17e40 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
17e50 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
17e60 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
17e70 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
17e80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
17e90 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
17ea0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
17eb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17ec0 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
17ed0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
17ee0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17ef0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
17f00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17f10 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
17f20 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
17f30 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
17f40 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
17f50 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
17f60 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
17f70 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
17f80 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
17f90 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  lse{.    invalid
17fa0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
17fb0 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63  che(pBt);.    rc
17fc0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
17fd0 70 28 70 42 74 2c 20 30 2c 20 62 74 72 65 65 50  p(pBt, 0, btreeP
17fe0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a  agecount(pBt));.
17ff0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18010 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18020 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
18030 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
18040 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
18050 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
18060 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
18070 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
18080 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18090 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
180a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
180b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
180c0 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
180d0 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
180e0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
180f0 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66  ** is commited f
18100 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
18110 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
18120 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
18130 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
18140 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
18150 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
18160 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
18170 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
18180 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
18190 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
181a0 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
181b0 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
181c0 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
181d0 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
181e0 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
181f0 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
18200 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
18210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
18220 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
18230 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
18240 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18250 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
18260 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
18270 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
18280 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
18290 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
182a0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
182b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
182c0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
182d0 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
182e0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
182f0 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
18300 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
18310 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
18320 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
18330 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
18340 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18350 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
18360 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
18370 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
18380 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
18390 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
183a0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
183b0 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
183c0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74 72  */.    Pgno nPtr
183d0 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  map;      /* Num
183e0 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
183f0 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
18400 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
18410 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
18420 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
18430 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e   freed */.    in
18440 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
18450 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
18460 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
18470 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  map page */.    
18480 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
18490 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
184a0 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
184b0 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
184c0 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
184d0 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
184e0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
184f0 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
18500 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
18510 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
18520 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
18530 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
18540 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
18550 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
18560 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
18570 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
18580 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
18590 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
185a0 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
185b0 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
185c0 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
185d0 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
185e0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
185f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18600 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18610 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
18620 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
18630 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
18640 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d  ]);.    nEntry =
18650 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
18660 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20  /5;.    nPtrmap 
18670 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
18680 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
18690 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29  , nOrig)+nEntry)
186a0 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69  /nEntry;.    nFi
186b0 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
186c0 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  e - nPtrmap;.   
186d0 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
186e0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
186f0 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e  ) && nFin<PENDIN
18700 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
18710 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
18720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
18730 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
18740 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
18750 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
18760 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
18770 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
18780 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e   }.    if( nFin>
18790 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
187a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
187b0 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46 72  PT;..    for(iFr
187c0 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
187d0 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
187e0 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
187f0 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
18800 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
18810 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20  nFin, iFree);.  
18820 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
18830 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
18840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
18850 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
18860 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18870 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
18880 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
18890 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
188a0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
188b0 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
188c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
188d0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
188e0 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
188f0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
18900 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
18910 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 73 71   nFin);.      sq
18920 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
18930 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
18940 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  ger, nFin);.    
18950 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
18960 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
18970 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18980 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18990 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
189a0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
189b0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
189c0 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
189d0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
189e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
189f0 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
18a00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18a10 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
18a20 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
18a30 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
18a40 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
18a50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
18a60 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
18a70 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
18a80 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
18a90 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
18aa0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
18ab0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
18ac0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
18ad0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
18ae0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
18af0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
18b00 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
18b10 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
18b20 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
18b30 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
18b40 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
18b50 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
18b60 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
18b70 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
18b80 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
18b90 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
18ba0 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
18bb0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
18bc0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
18bd0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
18be0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
18bf0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
18c00 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
18c10 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
18c20 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
18c30 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
18c40 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
18c50 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
18c60 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
18c70 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
18c80 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
18c90 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
18ca0 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
18cb0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
18cc0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
18cd0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
18ce0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
18cf0 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
18d00 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
18d10 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
18d20 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
18d30 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
18d40 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
18d50 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
18d60 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
18d70 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
18d80 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
18d90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18da0 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
18db0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
18dc0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
18dd0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
18de0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
18df0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
18e00 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
18e10 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
18e20 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
18e30 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
18e40 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
18e50 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
18e60 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
18e70 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
18e80 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
18e90 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
18ea0 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
18eb0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
18ec0 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
18ed0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
18ee0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
18ef0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
18f00 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
18f10 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
18f20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
18f30 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
18f40 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
18f50 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
18f60 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
18f70 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
18f80 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
18f90 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
18fa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
18fb0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
18fc0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
18fd0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
18fe0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18ff0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
19000 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
19010 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
19020 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
19030 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
19040 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
19050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
19060 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
19070 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
19080 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
19090 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
190a0 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
190b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
190c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
190d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
190e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
190f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
19100 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
19110 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
19120 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
19130 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
19140 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
19150 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19160 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19170 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
19180 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
19190 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
191a0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
191b0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
191c0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
191d0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
191e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
191f0 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
19200 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
19210 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
19220 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19230 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
19240 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
19250 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 62 74 72  tex(p) );..  btr
19260 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
19270 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 70 2d  t(pBt);.  if( p-
19280 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
19290 4f 4e 45 20 26 26 20 70 2d 3e 64 62 2d 3e 61 63  ONE && p->db->ac
192a0 74 69 76 65 56 64 62 65 43 6e 74 3e 31 20 29 7b  tiveVdbeCnt>1 ){
192b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
192c0 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
192d0 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
192e0 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
192f0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
19300 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
19310 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
19320 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
19330 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
19340 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
19350 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
19360 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
19370 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
19380 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
19390 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
193a0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
193b0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
193c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
193d0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
193e0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
193f0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
19400 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
19410 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
19420 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
19430 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
19440 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
19450 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
19460 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
19470 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
19480 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
19490 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
194a0 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
194b0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
194c0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
194d0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
194e0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
194f0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
19500 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
19510 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
19520 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
19530 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
19540 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
19550 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
19560 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
19570 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
19580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19590 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
195a0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
195b0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
195c0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
195d0 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
195e0 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
195f0 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
19600 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
19610 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
19620 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
19630 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
19640 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
19650 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
19660 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
19670 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
19680 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
19690 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
196a0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
196b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
196c0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
196d0 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
196e0 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
196f0 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
19700 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
19710 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
19720 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
19730 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
19740 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
19750 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
19760 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
19770 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
19780 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
19790 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
197a0 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
197b0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
197c0 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
197d0 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
197e0 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
197f0 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
19800 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
19810 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
19820 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
19830 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
19840 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
19850 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
19860 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
19870 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
19880 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
19890 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
198a0 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
198b0 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
198c0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
198d0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
198e0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
198f0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
19900 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
19910 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
19920 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
19930 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
19940 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19950 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
19960 74 72 65 65 20 2a 70 29 7b 0a 0a 20 20 69 66 28  tree *p){..  if(
19970 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
19980 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
19990 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
199a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
199b0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
199c0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
199d0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
199e0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
199f0 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
19a00 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
19a10 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
19a20 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
19a30 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
19a40 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
19a50 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
19a60 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
19a70 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
19a80 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
19a90 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
19aa0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
19ab0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
19ac0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
19ad0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
19ae0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
19af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
19b00 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
19b10 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
19b20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19b30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
19b40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19b50 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
19b60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
19b70 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
19b80 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
19b90 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
19ba0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
19bb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19bc0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
19bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19be0 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
19bf0 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
19c00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19c10 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
19c20 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
19c30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19c40 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
19c50 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
19c60 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
19c70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
19c90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
19ca0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a  mitPhaseTwo(p);.
19cb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
19cc0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
19cd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
19ce0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
19cf0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
19d00 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
19d10 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
19d20 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
19d30 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
19d40 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
19d50 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
19d60 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
19d70 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
19d80 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  defined..**.** F
19d90 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
19da0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
19db0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
19dc0 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
19dd0 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
19de0 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74   of writing to t
19df0 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61  he databse.  Tha
19e00 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73  t means the curs
19e10 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e  or was.** origin
19e20 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ally opened for 
19e30 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20  writing and the 
19e40 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
19e50 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79  e disabled.** by
19e60 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74   having its stat
19e70 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52  e changed to CUR
19e80 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74  SOR_FAULT..*/.st
19e90 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
19ea0 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
19eb0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
19ec0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
19ed0 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
19ee0 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
19ef0 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
19f00 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
19f10 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
19f20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
19f30 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
19f40 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
19f50 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
19f60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19f70 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
19f80 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
19f90 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
19fa0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
19fb0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
19fc0 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
19fd0 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
19fe0 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
19ff0 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
1a000 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
1a010 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
1a020 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
1a030 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1a040 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
1a050 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
1a060 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
1a070 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
1a080 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1a090 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
1a0a0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
1a0b0 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
1a0c0 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
1a0d0 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
1a0e0 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
1a0f0 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
1a100 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
1a110 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
1a120 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
1a130 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
1a140 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
1a150 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
1a160 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
1a170 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
1a180 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
1a190 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
1a1a0 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
1a1b0 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
1a1c0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
1a1d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1a1e0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1a1f0 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
1a200 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
1a210 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73  BtCursor *p;.  s
1a220 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a230 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
1a240 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
1a250 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1a260 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
1a270 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
1a280 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1a290 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
1a2a0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
1a2b0 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74  .    p->skipNext
1a2c0 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1a2d0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
1a2e0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1a2f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
1a300 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1a310 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
1a320 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1a330 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a340 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
1a350 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
1a360 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
1a370 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
1a380 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
1a390 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
1a3a0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
1a3b0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1a3c0 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
1a3d0 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
1a3e0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1a3f0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
1a400 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
1a410 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
1a420 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1a430 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1a440 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1a450 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1a460 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1a470 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1a480 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1a490 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1a4a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a4b0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
1a4c0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1a4d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1a4e0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
1a4f0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73  ge *pPage1;..  s
1a500 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a510 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65  (p);.  rc = save
1a520 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1a530 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
1a540 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1a550 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63  D_CACHE.  if( rc
1a560 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a570 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
1a580 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69  horrible situati
1a590 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c  on. An IO or mal
1a5a0 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
1a5b0 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20  rred whilst.    
1a5c0 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76  ** trying to sav
1a5d0 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
1a5e0 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ns. If this is a
1a5f0 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c  n automatic roll
1a600 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20  back (as.    ** 
1a610 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20  the result of a 
1a620 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c  constraint, mall
1a630 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20  oc() failure or 
1a640 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a  IO error) then .
1a650 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65      ** the cache
1a660 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c   may be internal
1a670 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
1a680 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c  (not contain val
1a690 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20  id trees) so.   
1a6a0 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69   ** we cannot si
1a6b0 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  mply return the 
1a6c0 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  error to the cal
1a6d0 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62  ler. Instead, ab
1a6e0 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  ort .    ** all 
1a6f0 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79  queries that may
1a700 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66   be using any of
1a710 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
1a720 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65  t failed to save
1a730 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
1a740 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
1a750 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a  Cursors(p, rc);.
1a760 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72    }.#endif.  btr
1a770 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1a780 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1a790 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1a7a0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
1a7b0 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
1a7c0 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
1a7d0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
1a7e0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
1a7f0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
1a800 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1a810 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
1a820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1a830 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
1a840 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
1a850 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
1a860 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
1a870 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
1a880 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72  .    ** call btr
1a890 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
1a8a0 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
1a8b0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
1a8c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
1a8d0 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
1a8e0 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65  */.    if( btree
1a8f0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
1a900 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c  &pPage1, 0)==SQL
1a910 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a920 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34  int nPage = get4
1a930 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
1a940 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge1->aData);.   
1a950 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61     testcase( nPa
1a960 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ge==0 );.      i
1a970 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71  f( nPage==0 ) sq
1a980 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1a990 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
1a9a0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
1a9b0 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e  testcase( pBt->n
1a9c0 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20  Page!=nPage );. 
1a9d0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1a9e0 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72  = nPage;.      r
1a9f0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1aa00 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
1aa10 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65  sert( countWrite
1aa20 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20  Cursors(pBt)==0 
1aa30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
1aa40 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1aa50 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62  S_READ;.  }..  b
1aa60 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1aa70 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
1aa80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1aa90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1aaa0 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
1aab0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
1aac0 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
1aad0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61  ansaction can ca
1aae0 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n be rolled.** b
1aaf0 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
1ab00 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y of the main tr
1ab10 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d  ansaction. You m
1ab20 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
1ab30 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f  saction .** befo
1ab40 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
1ab50 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
1ab60 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
1ab70 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
1ab80 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74  tically .** if t
1ab90 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
1aba0 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  ion commits or r
1abb0 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
1abc0 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
1abd0 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
1abe0 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
1abf0 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
1ac00 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
1ac10 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
1ac20 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
1ac30 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
1ac40 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
1ac50 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
1ac60 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
1ac70 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
1ac80 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
1ac90 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
1aca0 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
1acb0 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
1acc0 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
1acd0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1ace0 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   A statement sub
1acf0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
1ad00 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1ad10 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  n anonymous save
1ad20 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61  point. The.** va
1ad30 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
1ad40 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1ad50 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  er is the total 
1ad60 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
1ad70 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  ints,.** includi
1ad80 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79  ng the new anony
1ad90 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20  mous savepoint, 
1ada0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72  open on the B-Tr
1adb0 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72  ee. i.e. if ther
1adc0 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1add0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
1ade0 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65  d no other state
1adf0 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
1ae00 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74  s open,.** iStat
1ae10 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73  ement is 1. This
1ae20 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
1ae30 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65  oint can be rele
1ae40 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  ased or rolled b
1ae50 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ack.** using the
1ae60 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
1ae70 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f  epoint() functio
1ae80 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1ae90 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
1aea0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53  Btree *p, int iS
1aeb0 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74  tatement){.  int
1aec0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1aed0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1aee0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1aef0 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
1af00 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1af10 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
1af20 73 65 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f  sert( pBt->readO
1af30 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  nly==0 );.  asse
1af40 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30  rt( iStatement>0
1af50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1af60 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e  tatement>p->db->
1af70 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
1af80 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1af90 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1afa0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20  S_WRITE );.  /* 
1afb0 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76  At the pager lev
1afc0 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  el, a statement 
1afd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1afe0 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
1aff0 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
1b000 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
1b010 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
1b020 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
1b030 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ng.  ** SQL stat
1b040 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
1b050 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
1b060 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
1b070 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68  ck any.  ** such
1b080 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
1b090 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
1b0a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
1b0b0 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
1b0c0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1b0d0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1b0e0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1b0f0 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  er, iStatement);
1b100 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b110 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b120 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1b130 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1b140 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
1b150 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61  ion, op, is alwa
1b160 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ys SAVEPOINT_ROL
1b170 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45  LBACK.** or SAVE
1b180 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54  POINT_RELEASE. T
1b190 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74  his function eit
1b1a0 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20  her releases or 
1b1b0 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a  rolls back the.*
1b1c0 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e  * savepoint iden
1b1d0 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
1b1e0 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20  ter iSavepoint, 
1b1f0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1b200 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70   value .** of op
1b210 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1b220 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  , iSavepoint is 
1b230 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1b240 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48  equal to zero. H
1b250 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73  owever, if op is
1b260 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
1b270 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61  LLBACK, then iSa
1b280 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f  vepoint may also
1b290 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20   be -1. In this 
1b2a0 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  case the .** con
1b2b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74  tents of the ent
1b2c0 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
1b2d0 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  are rolled back.
1b2e0 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
1b2f0 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72  nt.** from a nor
1b300 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mal transaction 
1b310 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20  rollback, as no 
1b320 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73  locks are releas
1b330 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72  ed and the.** tr
1b340 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e  ansaction remain
1b350 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  s open..*/.int s
1b360 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1b370 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  oint(Btree *p, i
1b380 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
1b390 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
1b3a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b3b0 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72  if( p && p->inTr
1b3c0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1b3d0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1b3e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1b3f0 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
1b400 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1b410 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
1b420 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
1b430 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
1b440 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
1b450 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
1b460 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1b470 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
1b480 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1b490 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  p);.    rc = sql
1b4a0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
1b4b0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1b4c0 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
1b4d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b4e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b4f0 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
1b500 20 26 26 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c   && pBt->initial
1b510 6c 79 45 6d 70 74 79 20 29 20 70 42 74 2d 3e 6e  lyEmpty ) pBt->n
1b520 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
1b530 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1b540 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
1b550 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
1b560 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
1b570 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
1b580 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1b590 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
1b5a0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
1b5b0 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
1b5c0 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
1b5d0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1b5e0 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
1b5f0 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1b600 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
1b610 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
1b620 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
1b630 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1b640 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
1b650 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b660 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1b670 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b680 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1b690 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1b6a0 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
1b6b0 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
1b6c0 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
1b6d0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1b6e0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1b6f0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1b700 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
1b710 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
1b720 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
1b730 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1b740 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
1b750 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
1b760 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1b770 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1b780 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
1b790 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
1b7a0 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
1b7b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1b7c0 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
1b7d0 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
1b7e0 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
1b7f0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
1b800 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
1b810 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1b820 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
1b830 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
1b840 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
1b850 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
1b860 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
1b870 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
1b880 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
1b890 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
1b8a0 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
1b8b0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
1b8c0 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
1b8d0 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
1b8e0 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
1b8f0 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
1b900 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
1b910 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
1b920 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1b930 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
1b940 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
1b950 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
1b960 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
1b970 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
1b980 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
1b990 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
1b9a0 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
1b9b0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
1b9c0 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
1b9d0 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
1b9e0 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1b9f0 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
1ba00 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
1ba10 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
1ba20 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
1ba30 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
1ba40 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
1ba50 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
1ba60 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
1ba70 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
1ba80 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
1ba90 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
1baa0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
1bab0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1bac0 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
1bad0 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
1bae0 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
1baf0 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
1bb00 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
1bb10 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
1bb20 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1bb30 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
1bb40 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
1bb50 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1bb60 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
1bb70 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
1bb80 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1bb90 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
1bba0 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
1bbb0 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
1bbc0 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
1bbd0 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
1bbe0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1bbf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bc00 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
1bc10 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1bc40 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1bc50 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc70 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1bc80 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1bc90 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcb0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1bcc0 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1bcd0 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1bce0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1bcf0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1bd00 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1bd10 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1bd20 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1bd30 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd50 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1bd60 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1bd70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1bd80 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1bd90 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1bda0 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1bdb0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1bdc0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1bdd0 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1bde0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1bdf0 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
1be00 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1be10 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
1be20 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
1be30 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
1be40 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
1be50 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
1be60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
1be70 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
1be80 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
1be90 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
1bea0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1beb0 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
1bec0 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
1bed0 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
1bee0 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
1bef0 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
1bf00 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1bf10 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
1bf20 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
1bf30 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
1bf40 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
1bf50 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1bf60 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
1bf70 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1bf80 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1bf90 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
1bfa0 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
1bfb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1bfc0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1bfd0 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
1bfe0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
1bff0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1c000 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1c010 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
1c020 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
1c030 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
1c040 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 70  EVER(wrFlag && p
1c050 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  Bt->readOnly) ){
1c060 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c070 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
1c080 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
1c090 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
1c0a0 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
1c0b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c0c0 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EMPTY;.  }..  /*
1c0d0 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
1c0e0 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
1c0f0 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
1c100 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
1c110 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
1c120 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
1c130 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
1c140 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
1c150 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
1c160 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
1c170 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
1c180 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
1c190 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1c1a0 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
1c1b0 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
1c1c0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
1c1d0 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38  ur->wrFlag = (u8
1c1e0 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d  )wrFlag;.  pCur-
1c1f0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
1c200 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
1c210 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1c220 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1c230 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
1c240 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1c250 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
1c260 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1c270 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63  VALID;.  pCur->c
1c280 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a  achedRowid = 0;.
1c290 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c2a0 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
1c2b0 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
1c2c0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c2f0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1c300 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1c330 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1c340 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1c350 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c370 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1c380 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1c390 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1c3a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1c3b0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1c3c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1c3d0 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
1c3e0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1c3f0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c410 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
1c420 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
1c430 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1c440 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1c450 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75  ;.  rc = btreeCu
1c460 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
1c470 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
1c480 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  , pCur);.  sqlit
1c490 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1c4a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c4b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1c4c0 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
1c4d0 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
1c4e0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
1c4f0 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
1c500 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
1c510 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
1c520 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
1c530 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
1c540 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
1c550 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
1c560 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
1c570 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
1c580 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
1c590 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
1c5a0 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
1c5b0 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
1c5c0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1c5d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1c5e0 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
1c5f0 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e  ){.  return ROUN
1c600 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73  D8(sizeof(BtCurs
1c610 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  or));.}../*.** I
1c620 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
1c630 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f   that will be co
1c640 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42  nverted into a B
1c650 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a  tCursor object..
1c660 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65  **.** The simple
1c670 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77   approach here w
1c680 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65  ould be to memse
1c690 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f  t() the entire o
1c6a0 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f  bject.** to zero
1c6b0 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20  .  But it turns 
1c6c0 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50  out that the apP
1c6d0 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
1c6e0 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e  ] arrays.** do n
1c6f0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65  ot need to be ze
1c700 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72  roed and they ar
1c710 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63  e large, so we c
1c720 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a  an save a lot.**
1c730 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   of run-time by 
1c740 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
1c750 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
1c760 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  hose elements..*
1c770 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1c780 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74  reeCursorZero(Bt
1c790 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65  Cursor *p){.  me
1c7a0 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65  mset(p, 0, offse
1c7b0 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50  tof(BtCursor, iP
1c7c0 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  age));.}../*.** 
1c7d0 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20 72  Set the cached r
1c7e0 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76  owid value of ev
1c7f0 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68  ery cursor in th
1c800 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
1c810 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20  file.** as pCur 
1c820 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20 73  and having the s
1c830 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  ame root page nu
1c840 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20 54  mber as pCur.  T
1c850 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73  he value is.** s
1c860 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a  et to iRowid..**
1c870 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76  .** Only positiv
1c880 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61  e rowid values a
1c890 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61  re considered va
1c8a0 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61 63  lid for this cac
1c8b0 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65  he..** The cache
1c8c0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1c8d0 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74  to zero, indicat
1c8e0 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63  ing an invalid c
1c8f0 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65  ache..** A btree
1c900 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20   will work fine 
1c910 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67  with zero or neg
1c920 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57  ative rowids.  W
1c930 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a  e just cannot.**
1c940 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e   cache zero or n
1c950 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20  egative rowids, 
1c960 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c  which means tabl
1c970 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f  es that use zero
1c980 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20   or.** negative 
1c990 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e  rowids might run
1c9a0 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
1c9b0 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74 69  .  But in practi
1c9c0 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e  ce, zero.** or n
1c9d0 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 61  egative rowids a
1c9e0 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e  re very uncommon
1c9f0 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20   so this should 
1ca00 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
1ca10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ca20 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52  3BtreeSetCachedR
1ca30 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  owid(BtCursor *p
1ca40 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Cur, sqlite3_int
1ca50 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74  64 iRowid){.  Bt
1ca60 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72  Cursor *p;.  for
1ca70 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43  (p=pCur->pBt->pC
1ca80 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1ca90 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1caa0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72  ->pgnoRoot==pCur
1cab0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e  ->pgnoRoot ) p->
1cac0 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52  cachedRowid = iR
1cad0 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65  owid;.  }.  asse
1cae0 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64  rt( pCur->cached
1caf0 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b  Rowid==iRowid );
1cb00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1cb10 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69   the cached rowi
1cb20 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  d for the given 
1cb30 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74  cursor.  A negat
1cb40 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72  ive or zero.** r
1cb50 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
1cb60 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 72  cates that the r
1cb70 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69 6e  owid cache is in
1cb80 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
1cb90 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   be.** ignored. 
1cba0 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63 61   If the rowid ca
1cbb0 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  che has never be
1cbc0 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74  fore been set, t
1cbd0 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73  hen a.** zero is
1cbe0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71   returned..*/.sq
1cbf0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
1cc00 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65  te3BtreeGetCache
1cc10 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
1cc20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
1cc30 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77   pCur->cachedRow
1cc40 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  id;.}../*.** Clo
1cc50 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
1cc60 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
1cc70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cc80 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
1cc90 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
1cca0 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
1ccb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ccc0 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
1ccd0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1cce0 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
1ccf0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1cd00 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1cd10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
1cd20 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1cd30 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
1cd40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1cd50 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  pBtree);.    sql
1cd60 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
1cd70 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
1cd80 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
1cd90 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
1cda0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
1cdb0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
1cdc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d  else{.      pBt-
1cdd0 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
1cde0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
1cdf0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
1ce00 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
1ce10 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1ce20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20  pCur->pPrev;.   
1ce30 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
1ce40 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
1ce50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
1ce60 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
1ce70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
1ce80 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
1ce90 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
1cea0 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
1ceb0 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
1cec0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
1ced0 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
1cee0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1cef0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
1cf00 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1cf10 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
1cf20 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
1cf30 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
1cf40 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
1cf50 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
1cf60 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
1cf70 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
1cf80 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
1cf90 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
1cfa0 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
1cfb0 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
1cfc0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
1cfd0 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
1cfe0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
1cff0 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
1d000 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
1d010 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
1d020 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
1d030 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
1d040 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37  ll()..**.** 2007
1d050 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69  -06-25:  There i
1d060 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20  s a bug in some 
1d070 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43  versions of MSVC
1d080 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a   that cause the.
1d090 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63  ** compiler to c
1d0a0 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c  rash when getCel
1d0b0 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65  lInfo() is imple
1d0c0 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72  mented as a macr
1d0d0 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20  o..** But there 
1d0e0 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65  is a measureable
1d0f0 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65   speed advantage
1d100 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61   to using the ma
1d110 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77  cro on gcc.** (w
1d120 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65  hen less compile
1d130 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
1d140 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20  like -Os or -O0 
1d150 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65  are used and the
1d160 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20  .** compiler is 
1d170 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73  not doing agress
1d180 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20  ive inlining.)  
1d190 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c  So we use a real
1d1a0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
1d1b0 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72   MSVC and a macr
1d1c0 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  o for everything
1d1d0 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23   else.  Ticket #
1d1e0 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2457..*/.#ifndef
1d1f0 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
1d200 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
1d210 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1d220 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
1d230 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
1d240 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1d250 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
1d260 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
1d270 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74  f(info));.    bt
1d280 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1d290 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1d2a0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
1d2b0 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
1d2c0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
1d2d0 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
1d2e0 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
1d2f0 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
1d300 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
1d310 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
1d320 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
1d330 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
1d340 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
1d350 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
1d360 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
1d370 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
1d380 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
1d390 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
1d3a0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
1d3b0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
1d3c0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
1d3d0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1d3e0 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62  ->iPage;.      b
1d3f0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1d400 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1d410 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1d420 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1d430 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76  );.      pCur->v
1d440 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
1d450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1d460 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
1d470 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
1d480 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
1d490 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
1d4a0 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
1d4b0 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
1d4c0 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
1d4d0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
1d4e0 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
1d4f0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
1d540 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
1d550 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d580 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20        \.    int 
1d590 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1d5a0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5d0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72         \.    btr
1d5e0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1d5f0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1d600 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1d610 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
1d620 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c   \.    pCur->val
1d630 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20  idNKey = 1;     
1d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20    \.  }else{    
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43     \.    assertC
1d6d0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20  ellInfo(pCur);  
1d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d710 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66      \.  }.#endif
1d720 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a   /* _MSC_VER */.
1d730 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
1d740 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
1d750 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
1d760 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
1d770 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
1d780 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1d790 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
1d7a0 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
1d7b0 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
1d7c0 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
1d7d0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1d7e0 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
1d7f0 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
1d800 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
1d810 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
1d820 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
1d830 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
1d840 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
1d850 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d860 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
1d870 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1d880 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
1d890 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
1d8a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
1d8b0 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
1d8c0 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  G */../*.** Set 
1d8d0 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
1d8e0 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
1d8f0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
1d900 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
1d910 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
1d920 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
1d930 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
1d940 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
1d950 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1d960 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
1d970 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
1d980 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
1d990 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
1d9a0 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
1d9b0 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
1d9c0 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
1d9d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1d9e0 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
1d9f0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1da00 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74   must position t
1da10 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20  he cursor prior 
1da20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
1da30 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a   routine..** .**
1da40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1da50 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61  nnot fail.  It a
1da60 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
1da70 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e  LITE_OK.  .*/.in
1da80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
1da90 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
1daa0 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
1dab0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1dac0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1dad0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1dae0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1daf0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
1db00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1db10 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1db20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1db30 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
1db40 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  ){.    *pSize = 
1db50 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1db60 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1db70 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
1db80 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1db90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1dba0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1dbb0 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1dbc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1dbd0 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74  tes of data in t
1dbe0 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20  he entry the.** 
1dbf0 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79  cursor currently
1dc00 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a   points to..**.*
1dc10 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1dc20 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
1dc30 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
1dc40 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e  ointing to a non
1dc50 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65  -NULL.** valid e
1dc60 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  ntry.  In other 
1dc70 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69  words, the calli
1dc80 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  ng procedure mus
1dc90 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74  t guarantee.** t
1dca0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
1dcb0 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65  as Cursor.eState
1dcc0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  ==CURSOR_VALID..
1dcd0 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73  **.** Failure is
1dce0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20   not possible.  
1dcf0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
1dd00 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
1dd10 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69  ITE_OK..** It mi
1dd20 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c  ght just as well
1dd30 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20   be a procedure 
1dd40 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29  (returning void)
1dd50 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65   but we continue
1dd60 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  .** to return an
1dd70 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20   integer result 
1dd80 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69  code for histori
1dd90 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a  cal reasons..*/.
1dda0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ddb0 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f  DataSize(BtCurso
1ddc0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53  r *pCur, u32 *pS
1ddd0 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
1dde0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1ddf0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1de00 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1de10 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1de20 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
1de30 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
1de40 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  = pCur->info.nDa
1de50 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ta;.  return SQL
1de60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1de70 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20   Given the page 
1de80 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65  number of an ove
1de90 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1dea0 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61  e database (para
1deb0 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20  meter.** ovfl), 
1dec0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  this function fi
1ded0 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nds the page num
1dee0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1def0 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
1df00 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  linked list of o
1df10 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
1df20 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75  f possible, it u
1df30 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ses the auto-vac
1df40 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  uum.** pointer-m
1df50 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20  ap data instead 
1df60 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  of reading the c
1df70 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f  ontent of page o
1df80 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a  vfl to do so. .*
1df90 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1dfa0 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74   occurs an SQLit
1dfb0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1dfc0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1dfd0 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ise:.**.** The p
1dfe0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1dff0 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
1e000 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
1e010 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77  ed list is .** w
1e020 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
1e030 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
1e040 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  fl is the last p
1e050 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65  age in its linke
1e060 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67  d .** list, *pPg
1e070 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f  noNext is set to
1e080 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   zero. .**.** If
1e090 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e   ppPage is not N
1e0a0 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72  ULL, and a refer
1e0b0 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50  ence to the MemP
1e0c0 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  age object corre
1e0d0 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
1e0e0 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c  age number pOvfl
1e0f0 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74   was obtained, t
1e100 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73  hen *ppPage is s
1e110 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1e120 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  hat.** reference
1e130 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
1e140 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1e150 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c  e caller to call
1e160 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a   releasePage().*
1e170 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20  * on *ppPage to 
1e180 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e  free the referen
1e190 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65  ce. In no refere
1e1a0 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64  nce was obtained
1e1b0 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1e1c0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73   pointer-map was
1e1d0 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
1e1e0 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70  the value for *p
1e1f0 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a  PgnoNext), then.
1e200 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  ** *ppPage is se
1e210 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  t to zero..*/.st
1e220 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72  atic int getOver
1e230 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68  flowPage(.  BtSh
1e240 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
1e250 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e260 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e270 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20  .  Pgno ovfl,   
1e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e290 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66  /* Current overf
1e2a0 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1e2b0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
1e2c0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
1e2d0 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
1e2e0 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65  e handle (may be
1e2f0 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f   NULL) */.  Pgno
1e300 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
1e310 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1e320 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
1e330 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
1e340 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
1e350 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1e360 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
1e370 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1e380 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e390 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1e3a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1e3b0 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a  ert(pPgnoNext);.
1e3c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e3d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1e3e0 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
1e3f0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1e400 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
1e410 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
1e420 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
1e430 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
1e440 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
1e450 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
1e460 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
1e470 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
1e480 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
1e490 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
1e4a0 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
1e4b0 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
1e4c0 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
1e4d0 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
1e4e0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
1e4f0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1e500 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
1e510 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
1e520 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1e530 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
1e540 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
1e550 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
1e560 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
1e570 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1e580 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
1e590 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
1e5a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e5b0 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
1e5c0 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
1e5d0 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65  if( iGuess<=btre
1e5e0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
1e5f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
1e600 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75  rmapGet(pBt, iGu
1e610 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67  ess, &eType, &pg
1e620 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
1e630 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e640 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1e650 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
1e660 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
1e670 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
1e680 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e690 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
1e6a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1e6b0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65  if..  assert( ne
1e6c0 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  xt==0 || rc==SQL
1e6d0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
1e6e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e6f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
1e700 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
1e710 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a  fl, &pPage, 0);.
1e720 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1e730 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1e740 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
1e750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e760 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
1e770 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
1e780 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1e790 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
1e7a0 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
1e7b0 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
1e7c0 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
1e7d0 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
1e7e0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
1e7f0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
1e800 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
1e810 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
1e820 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
1e830 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
1e840 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
1e850 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
1e860 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
1e870 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
1e880 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
1e890 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
1e8a0 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
1e8b0 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
1e8c0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
1e8d0 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
1e8e0 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
1e8f0 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
1e900 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
1e910 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
1e920 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
1e930 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
1e940 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1e950 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
1e960 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
1e970 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
1e980 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
1e990 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
1e9a0 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
1e9b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e9c0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
1e9d0 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
1e9e0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
1e9f0 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
1ea00 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
1ea10 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
1ea20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
1ea30 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
1ea40 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
1ea50 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1ea60 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
1ea70 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
1ea80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1ea90 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1eaa0 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
1eab0 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
1eac0 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
1ead0 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
1eae0 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
1eaf0 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
1eb00 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
1eb10 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
1eb20 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
1eb30 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
1eb40 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
1eb50 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
1eb60 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
1eb70 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
1eb80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1eb90 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
1eba0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ebb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ebc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ebd0 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
1ebe0 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
1ebf0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
1ec00 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1ec10 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
1ec20 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
1ec30 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
1ec40 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
1ec50 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
1ec60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ec70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
1ec80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1ec90 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
1eca0 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
1ecb0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
1ecc0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
1ecd0 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
1ece0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1ecf0 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20  . If the eOp.** 
1ed00 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
1ed10 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
1ed20 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63  peration (data c
1ed30 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75  opied into.** bu
1ed40 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69  ffer pBuf). If i
1ed50 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61  t is non-zero, a
1ed60 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70   write (data cop
1ed70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66  ied from.** buff
1ed80 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20  er pBuf)..**.** 
1ed90 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
1eda0 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
1edb0 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
1edc0 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
1edd0 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
1ede0 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
1edf0 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
1ee00 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
1ee10 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72  being read or wr
1ee20 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65  itten might appe
1ee30 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
1ee40 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61  age.** or be sca
1ee50 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
1ee60 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
1ee70 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
1ee80 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49  the BtCursor.isI
1ee90 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
1eea0 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74  ag is set, and t
1eeb0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75  he current.** cu
1eec0 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
1eed0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
1eee0 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73  flow pages, this
1eef0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c   function.** all
1ef00 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72  ocates space for
1ef10 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c   and lazily popl
1ef20 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  uates the overfl
1ef30 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a  ow page-list .**
1ef40 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
1ef50 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
1ef60 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ). Subsequent ca
1ef70 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  lls use this.** 
1ef80 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
1ef90 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
1efa0 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72  plied offset mor
1efb0 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
1efc0 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
1efd0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1efe0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
1eff0 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
1f000 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
1f010 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
1f020 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
1f030 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
1f040 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
1f050 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
1f060 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
1f070 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
1f080 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
1f090 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
1f0a0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
1f0b0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
1f0c0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1f0d0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
1f0e0 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
1f0f0 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
1f100 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
1f110 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
1f120 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
1f130 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
1f140 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
1f150 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1f160 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
1f170 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
1f180 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1f190 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
1f1a0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
1f1b0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
1f1c0 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
1f1d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
1f1e0 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
1f1f0 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
1f200 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
1f210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f220 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
1f230 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
1f240 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
1f250 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
1f260 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
1f270 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f290 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
1f2a0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
1f2b0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
1f2c0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
1f2d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1f2e0 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b  ITE_OK;.  u32 nK
1f2f0 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  ey;.  int iIdx =
1f300 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1f310 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1f320 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f330 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
1f340 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
1f350 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
1f360 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
1f390 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
1f3a0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
1f3b0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
1f3c0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1f3d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1f3e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f3f0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1f400 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
1f410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1f420 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f430 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65  Cur) );..  getCe
1f440 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1f450 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1f460 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43  >info.pCell + pC
1f470 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
1f480 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67  ;.  nKey = (pPag
1f490 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20  e->intKey ? 0 : 
1f4a0 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
1f4b0 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45  nKey);..  if( NE
1f4c0 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e  VER(offset+amt >
1f4d0 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
1f4e0 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20 26  .nData) .   || &
1f4f0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
1f500 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
1f510 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
1f520 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29  >usableSize].  )
1f530 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
1f540 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
1f550 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
1f560 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
1f570 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
1f580 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f590 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
1f5a0 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
1f5b0 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
1f5c0 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
1f5d0 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
1f5e0 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
1f5f0 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
1f600 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
1f610 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
1f620 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
1f630 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
1f640 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
1f650 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
1f660 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
1f670 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
1f680 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
1f690 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  et], pBuf, a, eO
1f6a0 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  p, pPage->pDbPag
1f6b0 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
1f6c0 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
1f6d0 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
1f6e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
1f6f0 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
1f700 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
1f710 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f720 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
1f730 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76      const u32 ov
1f740 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  flSize = pBt->us
1f750 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f  ableSize - 4;  /
1f760 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20  * Bytes content 
1f770 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f  per ovfl page */
1f780 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61  .    Pgno nextPa
1f790 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67  ge;..    nextPag
1f7a0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
1f7b0 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
1f7c0 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66  o.nLocal]);..#if
1f7d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f7e0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a  _INCRBLOB.    /*
1f7f0 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c   If the isIncrbl
1f800 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73  obHandle flag is
1f810 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74 43   set and the BtC
1f820 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
1f830 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74  ].    ** has not
1f840 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1f850 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
1f860 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20 73  . The array is s
1f870 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f  ized at.    ** o
1f880 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63  ne entry for eac
1f890 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  h overflow page 
1f8a0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1f8b0 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a  chain. The.    *
1f8c0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
1f8d0 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
1f8e0 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72  low page is stor
1f8f0 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
1f900 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20  0],.    ** etc. 
1f910 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20  A value of 0 in 
1f920 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  the aOverflow[] 
1f930 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74  array means "not
1f940 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20   yet known".    
1f950 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 73  ** (the cache is
1f960 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
1f970 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
1f980 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62  f( pCur->isIncrb
1f990 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43  lobHandle && !pC
1f9a0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
1f9b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c  .      int nOvfl
1f9c0 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   = (pCur->info.n
1f9d0 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e  Payload-pCur->in
1f9e0 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69  fo.nLocal+ovflSi
1f9f0 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a  ze-1)/ovflSize;.
1fa00 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
1fa10 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29  rflow = (Pgno *)
1fa20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1fa30 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e  o(sizeof(Pgno)*n
1fa40 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Ovfl);.      /* 
1fa50 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79 73 20  nOvfl is always 
1fa60 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20 69 74  positive.  If it
1fa70 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65 74 63   were zero, fetc
1fa80 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68  hPayload would h
1fa90 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 65  ave.      ** bee
1faa0 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  n used instead o
1fab0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  f this routine. 
1fac0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
1fad0 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20 21 70  AYS(nOvfl) && !p
1fae0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
1faf0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1fb00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1fb10 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1fb20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
1fb30 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1fb40 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
1fb50 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
1fb60 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
1fb70 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
1fb80 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
1fb90 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
1fba0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
1fbb0 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
1fbc0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
1fbd0 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
1fbe0 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f  verflow[offset/o
1fbf0 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  vflSize] ){.    
1fc00 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
1fc10 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
1fc20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
1fc30 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1fc40 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
1fc50 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
1fc60 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ize);.    }.#end
1fc70 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72  if..    for( ; r
1fc80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1fc90 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
1fca0 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66  e; iIdx++){..#if
1fcb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fcc0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
1fcd0 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
1fce0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
1fcf0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1fd00 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cache. */.      
1fd10 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
1fd20 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61  low ){.        a
1fd30 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
1fd40 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20  erflow[iIdx] || 
1fd50 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1fd60 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29  iIdx]==nextPage)
1fd70 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
1fd80 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
1fd90 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20  = nextPage;.    
1fda0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1fdb0 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
1fdc0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
1fdd0 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
1fde0 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
1fdf0 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
1fe00 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
1fe10 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
1fe20 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
1fe30 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1fe40 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
1fe50 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
1fe60 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1fe70 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
1fe80 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
1fe90 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
1fea0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1feb0 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
1fec0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
1fed0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1fee0 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
1fef0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
1ff00 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1ff10 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1ff20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
1ff30 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
1ff40 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1ff50 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
1ff60 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
1ff70 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1ff80 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
1ff90 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20   else .#endif.  
1ffa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
1ffb0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
1ffc0 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
1ffd0 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
1ffe0 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
1fff0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
20000 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
20010 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
20020 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
20030 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
20040 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
20050 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
20060 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
20070 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
20080 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
20090 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
200a0 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
200b0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Page;.        in
200c0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
200d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
200e0 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
200f0 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
20100 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20120 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
20130 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
20140 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
20150 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20160 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
20170 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
20180 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20190 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
201a0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
201b0 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
201c0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
201d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
201e0 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
201f0 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
20200 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
20210 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
20220 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20230 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
20240 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
20250 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
20260 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
20270 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20  .          pBuf 
20280 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += a;.        }.
20290 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
202a0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
202b0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
202c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
202d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
202e0 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
202f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
20300 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65  d part of the ke
20310 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
20320 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
20330 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
20340 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
20350 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
20360 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
20370 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
20380 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
20390 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
203a0 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
203b0 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  ur is pointing t
203c0 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a  o a valid row.**
203d0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
203e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
203f0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
20400 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
20410 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
20420 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
20430 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
20440 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
20450 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
20460 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
20470 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
20480 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
20490 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
204a0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
204b0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
204c0 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  uf){.  assert( c
204d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
204e0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
204f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
20500 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
20510 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20520 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
20530 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20540 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
20550 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
20560 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
20570 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20580 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
20590 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
205a0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
205b0 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
205c0 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
205d0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
205e0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ad part of the d
205f0 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
20600 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
20610 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
20620 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
20630 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
20640 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
20650 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
20660 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
20670 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
20680 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
20690 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
206a0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
206b0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
206c0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
206d0 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
206e0 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
206f0 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
20700 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
20710 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
20720 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ta(BtCursor *pCu
20730 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
20740 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
20750 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
20760 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20770 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69  MIT_INCRBLOB.  i
20780 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
20790 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
207a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
207b0 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
207c0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
207d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
207e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
207f0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
20800 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
20810 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
20820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
20830 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
20840 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
20850 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
20860 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
20870 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20880 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20  r->iPage] );.   
20890 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
208a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
208b0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
208c0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
208d0 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  ll );.    rc = a
208e0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
208f0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
20900 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pBuf, 0);.  }.  
20910 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20920 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
20930 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20  nter to payload 
20940 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
20950 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
20960 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72  the .** pCur cur
20970 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
20980 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72  to.  The pointer
20990 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e   is to the begin
209a0 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  ning of.** the k
209b0 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30  ey if skipKey==0
209c0 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74   and it points t
209d0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
209e0 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b  of data if.** sk
209f0 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e  ipKey==1.  The n
20a00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
20a10 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f  f available key/
20a20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a  data is written.
20a30 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  ** into *pAmt.  
20a40 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
20a50 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
20a60 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
20a70 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e  .** a valid poin
20a80 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
20a90 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
20aa0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
20ab0 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
20ac0 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
20ad0 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
20ae0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
20af0 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
20b00 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
20b10 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
20b20 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
20b30 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
20b40 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
20b50 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
20b60 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
20b70 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
20b80 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
20b90 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
20ba0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
20bb0 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
20bc0 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
20bd0 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
20be0 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  le.** the key/da
20bf0 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
20c00 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
20c10 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
20c20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
20c30 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
20c40 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
20c50 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
20c60 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
20c70 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
20c80 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
20c90 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
20ca0 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
20cb0 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
20cc0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
20cd0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
20ce0 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50  ned char *fetchP
20cf0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
20d00 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
20d10 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
20d20 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
20d30 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
20d40 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20   *pAmt,         
20d50 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
20d60 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
20d70 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
20d80 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20  .  int skipKey  
20d90 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20          /* read 
20da0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74  beginning at dat
20db0 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
20dc0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
20dd0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
20de0 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d;.  MemPage *pP
20df0 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  age;.  u32 nKey;
20e00 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a  .  u32 nLocal;..
20e10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
20e20 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  0 && pCur->iPage
20e30 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
20e40 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20e50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
20e60 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
20e70 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
20e80 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
20e90 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
20ea0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
20eb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
20ec0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  e];.  assert( pC
20ed0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
20ee0 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
20ef0 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ell );.  if( NEV
20f00 45 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  ER(pCur->info.nS
20f10 69 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 62  ize==0) ){.    b
20f20 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
20f30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
20f40 3e 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  >iPage], pCur->a
20f50 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20f60 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
20f70 20 20 20 20 20 20 26 70 43 75 72 2d 3e 69 6e 66        &pCur->inf
20f80 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c 6f  o);.  }.  aPaylo
20f90 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
20fa0 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61  pCell;.  aPayloa
20fb0 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  d += pCur->info.
20fc0 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70  nHeader;.  if( p
20fd0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
20fe0 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20      nKey = 0;.  
20ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20  }else{.    nKey 
21000 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
21010 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  o.nKey;.  }.  if
21020 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
21030 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65   aPayload += nKe
21040 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  y;.    nLocal = 
21050 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
21060 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73  l - nKey;.  }els
21070 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  e{.    nLocal = 
21080 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
21090 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  l;.    assert( n
210a0 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20  Local<=nKey );. 
210b0 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f   }.  *pAmt = nLo
210c0 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50  cal;.  return aP
210d0 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ayload;.}.../*.*
210e0 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
210f0 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
21100 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
21110 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
21120 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
21130 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
21140 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
21150 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
21160 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
21170 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
21180 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
21190 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
211a0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
211b0 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
211c0 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
211d0 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
211e0 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
211f0 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
21200 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
21210 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
21220 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
21230 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
21240 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
21250 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
21260 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
21270 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
21280 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
21290 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
212a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
212b0 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
212c0 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
212d0 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
212e0 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
212f0 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
21300 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
21310 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
21320 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
21330 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
21340 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21350 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f  int *pAmt){.  co
21360 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b  nst void *p = 0;
21370 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21380 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
21390 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
213a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
213b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
213c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
213d0 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d  if( ALWAYS(pCur-
213e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
213f0 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20  VALID) ){.    p 
21400 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  = (const void*)f
21410 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
21420 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
21430 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f    return p;.}.co
21440 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
21450 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
21460 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21470 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f  int *pAmt){.  co
21480 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b  nst void *p = 0;
21490 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
214a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
214b0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
214c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
214d0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
214e0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
214f0 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d  if( ALWAYS(pCur-
21500 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21510 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20  VALID) ){.    p 
21520 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  = (const void*)f
21530 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
21540 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  , pAmt, 1);.  }.
21550 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a    return p;.}...
21560 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
21570 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
21580 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
21590 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
215a0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
215b0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
215c0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
215d0 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
215e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
215f0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
21600 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
21610 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
21620 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
21630 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
21640 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
21650 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
21660 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
21670 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
21680 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
21690 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
216a0 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
216b0 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
216c0 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
216d0 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
216e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
216f0 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
21700 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
21710 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
21720 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
21730 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
21740 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
21750 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
21760 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21770 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
21780 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21790 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
217a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
217b0 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
217c0 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28  X_DEPTH );.  if(
217d0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
217e0 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
217f0 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
21800 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
21810 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  T_BKPT;.  }.  rc
21820 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
21830 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
21840 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66  &pNewPage);.  if
21850 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
21860 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
21870 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65  [i+1] = pNewPage
21880 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
21890 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  i+1] = 0;.  pCur
218a0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43  ->iPage++;..  pC
218b0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
218c0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
218d0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
218e0 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
218f0 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e  <1 || pNewPage->
21900 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70  intKey!=pCur->ap
21910 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20  Page[i]->intKey 
21920 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
21930 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21940 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
21950 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
21960 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
21970 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
21980 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
21990 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
219a0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
219b0 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
219c0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
219d0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
219e0 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
219f0 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
21a00 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
21a10 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
21a20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
21a30 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
21a40 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
21a50 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
21a60 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
21a70 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
21a80 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
21a90 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
21aa0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
21ab0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
21ac0 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
21ad0 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
21ae0 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
21af0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
21b00 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
21b10 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
21b20 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
21b30 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
21b40 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
21b50 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
21b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
21b70 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
21b80 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
21b90 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
21ba0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
21bb0 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
21bc0 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
21bd0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
21be0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
21bf0 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
21c00 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
21c10 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
21c20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
21c30 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
21c40 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
21c50 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
21c60 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
21c70 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
21c80 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
21c90 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
21ca0 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
21cb0 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
21cc0 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
21cd0 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
21ce0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21cf0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
21d00 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
21d10 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
21d20 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21d40 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21d50 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
21d60 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
21d70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
21d80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21d90 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
21da0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
21db0 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
21dc0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
21dd0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
21de0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
21df0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
21e00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21e10 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  e]->pgno.  );.  
21e20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
21e30 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21e40 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e  Page]);.  pCur->
21e50 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d  iPage--;.  pCur-
21e60 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
21e70 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
21e80 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ey = 0;.}../*.**
21e90 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
21ea0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
21eb0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74   root page of it
21ec0 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  s b-tree structu
21ed0 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
21ee0 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72   table has a vir
21ef0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20  tual root page, 
21f00 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
21f10 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e  is moved to poin
21f20 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74  t.** to the virt
21f30 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ual root page in
21f40 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74  stead of the act
21f50 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41  ual root page. A
21f60 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20   table has a.** 
21f70 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
21f80 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61  e when the actua
21f90 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74  l root page cont
21fa0 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e  ains no cells an
21fb0 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63  d a .** single c
21fc0 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20  hild page. This 
21fd0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
21fe0 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72  with the table r
21ff0 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e  ooted at page 1.
22000 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d  .**.** If the b-
22010 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
22020 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72  s empty, the cur
22030 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74  sor state is set
22040 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49   to .** CURSOR_I
22050 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73  NVALID. Otherwis
22060 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  e, the cursor is
22070 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
22080 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65   the first.** ce
22090 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68  ll located on th
220a0 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75  e root (or virtu
220b0 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e  al root) page an
220c0 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  d the cursor sta
220d0 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  te.** is set to 
220e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
220f0 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
22100 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63  tion returns suc
22110 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61  cessfully, it ma
22120 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  y be assumed tha
22130 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65  t the.** page-he
22140 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63  ader flags indic
22150 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69  ate that the [vi
22160 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65  rtual] root-page
22170 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
22180 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74   .** kind of b-t
22190 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69  ree page (i.e. i
221a0 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  f when opening t
221b0 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61  he cursor the ca
221c0 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20  ller did not.** 
221d0 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
221e0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  o structure the 
221f0 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
22200 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30  t to 0x05 or 0x0
22210 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  D,.** indicating
22220 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
22230 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65   or if the calle
22240 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20  r did specify a 
22250 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
22260 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
22270 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
22280 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64  x02 or 0x0A, ind
22290 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  icating an index
222a0 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a  .** b-tree)..*/.
222b0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
222c0 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
222d0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
222e0 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
222f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22300 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
22310 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
22320 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22330 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
22340 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
22350 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
22360 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
22370 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
22380 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
22390 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
223a0 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
223b0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
223c0 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
223d0 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
223e0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
223f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
22400 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
22410 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
22420 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22430 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
22440 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22450 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
22460 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74  _OK );.      ret
22470 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
22480 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  xt;.    }.    sq
22490 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
224a0 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d  ursor(pCur);.  }
224b0 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
224c0 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  age>=0 ){.    in
224d0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
224e0 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
224f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
22500 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
22510 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
22520 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
22530 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
22540 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
22550 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
22560 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
22570 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a  ur->apPage[0]);.
22580 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
225a0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
225b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
225c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
225d0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
225e0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Page = 0;..    /
225f0 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
22600 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
22610 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
22620 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
22630 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20  s cursor.    ** 
22640 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
22650 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
22660 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
22670 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
22680 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74  s.    ** NULL, t
22690 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74  he caller expect
226a0 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  s a table b-tree
226b0 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
226c0 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a   the case,.    *
226d0 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  * return an SQLI
226e0 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
226f0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
22700 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
22710 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  ]->intKey==1 || 
22720 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
22730 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
22740 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65    if( (pCur->pKe
22750 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d  yInfo==0)!=pCur-
22760 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
22770 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
22780 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
22790 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
227a0 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  }..  /* Assert t
227b0 68 61 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  hat the root pag
227c0 65 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72  e is of the corr
227d0 65 63 74 20 74 79 70 65 2e 20 54 68 69 73 20 6d  ect type. This m
227e0 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20  ust be the.  ** 
227f0 63 61 73 65 20 61 73 20 74 68 65 20 63 61 6c 6c  case as the call
22800 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
22810 6e 20 74 68 61 74 20 6c 6f 61 64 65 64 20 74 68  n that loaded th
22820 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 65 69 74  e root-page (eit
22830 68 65 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 61  her.  ** this ca
22840 6c 6c 20 6f 72 20 61 20 70 72 65 76 69 6f 75 73  ll or a previous
22850 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75   invocation) wou
22860 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
22870 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a   corruption .  *
22880 2a 20 69 66 20 74 68 65 20 61 73 73 75 6d 70 74  * if the assumpt
22890 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
228a0 65 2c 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74  e, and it is not
228b0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
228c0 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79  e flags .  ** by
228d0 74 65 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20  te to have been 
228e0 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20 74  modified while t
228f0 68 69 73 20 63 75 72 73 6f 72 20 69 73 20 68 6f  his cursor is ho
22900 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
22910 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61  e.  ** to the pa
22920 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20  ge.  */.  pRoot 
22930 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
22940 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
22950 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
22960 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73  pgnoRoot );.  as
22970 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49  sert( pRoot->isI
22980 6e 69 74 20 26 26 20 28 70 43 75 72 2d 3e 70 4b  nit && (pCur->pK
22990 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f  eyInfo==0)==pRoo
229a0 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20  t->intKey );..  
229b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
229c0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
229d0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
229e0 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
229f0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
22a00 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52  y = 0;..  if( pR
22a10 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  oot->nCell==0 &&
22a20 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
22a30 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
22a40 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
22a50 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
22a60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
22a70 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
22a80 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
22a90 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
22aa0 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
22ab0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
22ac0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
22ad0 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
22ae0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
22af0 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
22b00 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
22b10 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43  te = ((pRoot->nC
22b20 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41  ell>0)?CURSOR_VA
22b30 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c  LID:CURSOR_INVAL
22b40 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ID);.  }.  retur
22b50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
22b60 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
22b70 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
22b80 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
22b90 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
22ba0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
22bb0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
22bc0 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
22bd0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
22be0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
22bf0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
22c00 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
22c10 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
22c20 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
22c30 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
22c40 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
22c50 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
22c60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22c70 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
22c80 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
22c90 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
22ca0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
22cb0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
22cc0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
22cd0 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
22ce0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
22cf0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
22d00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22d10 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
22d20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22d30 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22d40 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
22d50 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
22d60 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
22d70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64  Page, pCur->aiId
22d80 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29  x[pCur->iPage]))
22d90 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
22da0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
22db0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
22dc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
22dd0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
22de0 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
22df0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
22e00 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
22e10 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
22e20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
22e30 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
22e40 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
22e50 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
22e60 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
22e70 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
22e80 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
22e90 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
22ea0 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
22eb0 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
22ec0 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
22ed0 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
22ee0 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
22ef0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
22f00 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
22f10 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
22f20 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
22f30 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
22f40 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
22f50 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
22f60 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
22f70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
22f80 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
22f90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
22fa0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
22fb0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22fc0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
22fd0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
22fe0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22ff0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23000 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
23010 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
23020 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
23030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23040 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
23050 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23060 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
23070 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
23080 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
23090 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
230a0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
230b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
230c0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
230d0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
230e0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
230f0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  no);.  }.  if( r
23100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23110 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
23120 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
23130 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
23140 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
23150 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
23160 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
23170 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23180 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
23190 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
231a0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
231b0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
231c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
231d0 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
231e0 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
231f0 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
23200 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
23210 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
23220 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
23230 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
23240 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23250 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
23260 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
23270 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
23280 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
23290 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
232a0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
232b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
232c0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
232d0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
232e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
232f0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
23300 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23310 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
23320 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
23330 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
23340 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
23350 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
23360 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
23370 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
23380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
23390 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
233a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
233b0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
233c0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
233d0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
233e0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
233f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23400 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
23410 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
23420 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
23430 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
23440 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
23450 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
23460 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
23470 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
23480 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
23490 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
234a0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
234b0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
234c0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
234d0 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
234e0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
234f0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
23500 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
23510 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23520 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23530 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
23540 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
23550 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
23560 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
23570 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
23580 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
23590 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
235a0 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
235b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
235c0 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43  ur->eState && pC
235d0 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69  ur->atLast ){.#i
235e0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
235f0 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
23600 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
23610 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
23620 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
23630 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
23640 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
23650 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
23660 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
23670 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
23680 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
23690 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
236a0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
236b0 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
236c0 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
236d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
236e0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
236f0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
23700 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23710 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
23720 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
23730 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23740 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
23750 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
23760 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23770 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
23780 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
23790 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
237a0 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
237b0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
237c0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
237d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
237e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
237f0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
23800 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
23810 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23820 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23830 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23840 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
23850 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
23860 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
23870 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
23880 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
23890 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31  rc==SQLITE_OK ?1
238a0 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  :0;.    }.  }.  
238b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
238c0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
238d0 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
238e0 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
238f0 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
23900 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
23910 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
23920 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
23930 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
23940 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
23950 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
23960 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
23970 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
23980 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
23990 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
239a0 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
239b0 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
239c0 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
239d0 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
239e0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
239f0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
23a00 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
23a10 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
23a20 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
23a30 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
23a40 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
23a50 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
23a60 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
23a70 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
23a80 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
23a90 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
23aa0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
23ab0 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
23ac0 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
23ad0 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
23ae0 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
23af0 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
23b00 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
23b10 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
23b20 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
23b30 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
23b40 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
23b50 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
23b60 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
23b70 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
23b80 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
23b90 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
23ba0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
23bb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23bc0 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
23bd0 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
23be0 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
23bf0 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
23c20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
23c30 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
23c40 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
23c50 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
23c60 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
23c70 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
23c80 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
23c90 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
23ca0 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
23cb0 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
23cc0 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
23cd0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
23ce0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
23cf0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
23d00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23d10 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
23d20 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
23d30 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  y..**.*/.int sql
23d40 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
23d50 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
23d60 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
23d70 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
23d80 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
23d90 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
23da0 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
23db0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
23dc0 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
23dd0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
23de0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
23df0 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
23e00 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
23e10 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
23e20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
23e30 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
23e40 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
23e50 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
23e60 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
23e70 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
23e80 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
23e90 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
23ea0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
23eb0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
23ec0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
23ed0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
23ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
23ef0 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  es );.  assert( 
23f00 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
23f10 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
23f20 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
23f30 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
23f40 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61  ady positioned a
23f50 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61  t the point we a
23f60 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74  re trying.  ** t
23f70 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20  o move to, then 
23f80 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68  just return with
23f90 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f  out doing any wo
23fa0 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  rk */.  if( pCur
23fb0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23fc0 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e  _VALID && pCur->
23fd0 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26  validNKey .   &&
23fe0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
23ff0 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20  ->intKey .  ){. 
24000 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
24010 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
24020 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
24030 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
24040 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
24050 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
24060 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69  tLast && pCur->i
24070 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20  nfo.nKey<intKey 
24080 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
24090 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
240a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
240b0 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d   }.  }..  rc = m
240c0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
240d0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
240e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
240f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24100 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24110 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
24120 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24130 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
24140 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
24150 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24160 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
24170 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  >0 || pCur->eSta
24180 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
24190 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  ID );.  if( pCur
241a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
241b0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
241c0 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
241d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
241e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
241f0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
24200 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24210 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
24220 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
24230 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49  0]->intKey || pI
24240 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b  dxKey );.  for(;
24250 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
24260 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63   upr;.    Pgno c
24270 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
24280 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
24290 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
242a0 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63  Page];.    int c
242b0 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  ;..    /* pPage-
242c0 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
242d0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
242e0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
242f0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
24300 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
24310 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
24320 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
24330 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
24340 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
24350 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
24360 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
24370 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
24380 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
24390 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
243a0 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
243b0 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
243c0 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
243d0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
243e0 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
243f0 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
24400 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
24410 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
24420 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
24430 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
24440 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
24450 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
24460 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
24470 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
24480 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
24490 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
244a0 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
244b0 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
244c0 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
244d0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66  >nCell-1;.    if
244e0 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20  ( biasRight ){. 
244f0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
24500 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
24510 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65  (u16)upr;.    }e
24520 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
24530 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
24540 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72  ge] = (u16)((upr
24550 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a  +lwr)/2);.    }.
24560 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
24570 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
24580 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24590 50 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20  Page]; /* Index 
245a0 6f 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  of current cell 
245b0 69 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 20 20  in pPage */.    
245c0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
245f0 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   to current cell
24600 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20   in pPage */..  
24610 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
24620 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
24630 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
24640 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70  (pPage, idx) + p
24650 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
24660 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ze;.      if( pP
24670 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
24680 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c         i64 nCell
24690 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
246a0 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
246b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
246c0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20   dummy;.        
246d0 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61    pCell += getVa
246e0 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75  rint32(pCell, du
246f0 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mmy);.        }.
24700 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
24710 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
24720 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
24730 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d     if( nCellKey=
24740 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
24750 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
24760 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
24770 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
24780 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d  .          c = -
24790 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
247a0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
247b0 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  rt( nCellKey>int
247c0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
247d0 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20   c = +1;.       
247e0 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d   }.        pCur-
247f0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
24800 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
24810 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
24820 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
24830 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
24840 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
24850 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
24860 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
24870 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
24880 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
24890 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
248a0 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
248b0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
248c0 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
248d0 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
248e0 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
248f0 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
24900 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
24910 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
24920 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
24930 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
24940 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
24950 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
24960 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
24970 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
24980 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
24990 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
249a0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
249b0 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
249c0 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
249d0 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
249e0 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
249f0 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
24a00 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
24a10 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
24a20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
24a30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 28  ;.        if( !(
24a40 6e 43 65 6c 6c 20 26 20 30 78 38 30 29 20 26 26  nCell & 0x80) &&
24a50 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
24a60 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
24a70 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
24a80 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
24a90 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
24aa0 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
24ab0 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
24ac0 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
24ad0 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
24ae0 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
24af0 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
24b00 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
24b10 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
24b20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
24b30 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
24b40 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
24b50 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
24b60 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
24b70 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
24b80 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
24b90 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
24ba0 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
24bb0 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
24bc0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
24bd0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
24be0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
24bf0 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
24c00 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
24c10 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
24c20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
24c30 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
24c40 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
24c50 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
24c60 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
24c70 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
24c80 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
24c90 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
24ca0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
24cb0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
24cc0 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
24cd0 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
24ce0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
24cf0 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
24d00 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
24d10 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
24d20 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
24d30 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
24d40 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
24d50 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
24d60 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
24d70 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
24d80 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
24d90 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
24da0 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
24db0 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
24dc0 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20   called. */.    
24dd0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
24de0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
24df0 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
24e00 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
24e10 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
24e20 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74  ze;.          bt
24e30 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
24e40 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
24e50 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
24e60 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
24e70 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
24e80 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
24e90 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
24ea0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
24eb0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  l );.          i
24ec0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
24ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
24ee0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
24ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
24f00 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
24f10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24f20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65         rc = acce
24f30 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
24f40 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67  0, nCell, (unsig
24f50 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b  ned char*)pCellK
24f60 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ey, 0);.        
24f70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
24f80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
24f90 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
24fb0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
24fc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24fd0 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
24fe0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
24ff0 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
25000 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
25010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25020 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
25030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25040 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
25050 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
25060 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
25070 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
25080 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
25090 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
250a0 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20  upr = lwr - 1;. 
250b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
250c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
250d0 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
250e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
250f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25100 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
25110 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
25120 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
25130 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
25140 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
25150 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
25160 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69  .        upr = i
25170 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dx-1;.      }.  
25180 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
25190 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
251a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
251b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
251c0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
251d0 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20  ((lwr+upr)/2);. 
251e0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
251f0 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20   lwr==upr+1 );. 
25200 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
25210 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
25220 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
25230 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
25240 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
25250 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
25260 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
25270 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
25280 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
25290 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
252a0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
252b0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
252c0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
252d0 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
252e0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64    }.    if( chld
252f0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  Pg==0 ){.      a
25300 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
25310 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
25320 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25330 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25340 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
25350 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = c;.      rc = 
25360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
25370 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
25380 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ish;.    }.    p
25390 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
253a0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
253b0 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  wr;.    pCur->in
253c0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
253d0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
253e0 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
253f0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
25400 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
25410 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
25420 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a  eto_finish;.  }.
25430 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
25440 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
25450 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
25460 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
25470 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
25480 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
25490 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
254a0 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
254b0 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
254c0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
254d0 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
254e0 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
254f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
25500 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
25510 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
25520 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
25530 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
25540 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
25550 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
25560 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
25570 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
25580 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
25590 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
255a0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
255b0 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
255c0 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
255d0 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
255e0 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
255f0 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
25600 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
25610 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
25620 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
25630 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
25640 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
25650 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
25660 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
25670 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
25680 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
25690 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
256a0 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
256b0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
256c0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
256d0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
256e0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
256f0 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
25700 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
25710 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
25720 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
25730 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
25740 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
25750 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
25760 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25770 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
25780 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
25790 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
257a0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
257b0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
257c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
257d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
257e0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
257f0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
25800 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
25810 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
25820 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
25830 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
25840 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
25850 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
25860 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
25870 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
25880 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
25890 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
258a0 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 70  pNext>0 ){.    p
258b0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
258c0 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
258d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
258e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
258f0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
25900 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
25910 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25920 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20  iPage];.  idx = 
25930 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
25940 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
25950 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
25960 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
25970 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65   idx<=pPage->nCe
25980 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
25990 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
259a0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
259b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e   = 0;.  if( idx>
259c0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
259d0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
259e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
259f0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
25a00 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
25a10 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
25a20 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
25a30 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
25a40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
25a50 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
25a60 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
25a70 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
25a80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
25a90 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
25aa0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
25ab0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
25ac0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
25ad0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
25ae0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
25af0 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
25b00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
25b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
25b20 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
25b30 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
25b40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25b50 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77  ->iPage];.    }w
25b60 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
25b70 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d  x[pCur->iPage]>=
25b80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
25b90 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
25ba0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
25bb0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  tKey ){.      rc
25bc0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
25bd0 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
25be0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25bf0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
25c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
25c10 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52  rn rc;.  }.  *pR
25c20 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  es = 0;.  if( pP
25c30 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
25c40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25c50 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f  K;.  }.  rc = mo
25c60 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
25c70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
25c80 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  .}.../*.** Step 
25c90 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
25ca0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
25cb0 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
25cc0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
25cd0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
25ce0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
25cf0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
25d00 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
25d10 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
25d20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
25d30 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
25d40 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
25d50 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
25d60 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
25d70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
25d80 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
25d90 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
25da0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
25db0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
25dc0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
25dd0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25de0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
25df0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
25e00 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
25e10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25e20 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
25e30 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
25e40 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66  atLast = 0;.  if
25e50 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
25e60 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
25e70 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
25e80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25e90 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
25ea0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c   pCur->skipNext<
25eb0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
25ec0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
25ed0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
25ee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25ef0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
25f00 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70  ipNext = 0;..  p
25f10 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
25f20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25f30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25f40 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
25f50 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
25f60 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
25f70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
25f80 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72  r->iPage];.    r
25f90 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
25fa0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
25fb0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
25fc0 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
25fd0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
25fe0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
25ff0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
26000 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
26010 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
26020 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
26030 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20  ->iPage]==0 ){. 
26040 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
26050 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
26060 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
26070 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
26080 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
26090 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
260a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
260b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
260c0 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
260d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
260e0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
260f0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
26100 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70  NKey = 0;..    p
26110 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26120 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70  >iPage]--;.    p
26130 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
26140 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26150 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
26160 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
26170 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
26180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
26190 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
261a0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
261b0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
261c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
261d0 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
261e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
261f0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
26200 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
26210 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26220 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
26230 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
26240 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
26250 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
26260 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
26270 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
26280 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
26290 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
262a0 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
262b0 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
262c0 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
262d0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
262e0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
262f0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
26300 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
26310 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
26320 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
26330 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
26340 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
26350 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
26360 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
26370 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
26380 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
26390 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20   and *pPgno are 
263a0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  undefined in the
263b0 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
263c0 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e  or..** Do not in
263d0 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65  voke sqlite3Page
263e0 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50  rUnref() on *ppP
263f0 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  age if an error 
26400 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
26410 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62  ** If the "nearb
26420 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  y" parameter is 
26430 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66  not 0, then a (f
26440 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73  eeble) effort is
26450 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63   made to .** loc
26460 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65  ate a page close
26470 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d   to the page num
26480 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54  ber "nearby".  T
26490 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
264a0 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  in an.** attempt
264b0 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64   to keep related
264c0 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20   pages close to 
264d0 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68  each other in th
264e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
264f0 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72  .** which in tur
26500 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62  n can make datab
26510 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65  ase access faste
26520 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
26530 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65  "exact" paramete
26540 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20  r is not 0, and 
26550 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
26560 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a  nearby exists .*
26570 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
26580 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
26590 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65  n it is guarente
265a0 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
265b0 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  d. This.** is on
265c0 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  ly used by auto-
265d0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
265e0 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67   when allocating
265f0 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f   a new table..*/
26600 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
26610 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
26620 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
26630 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
26640 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50  age, .  Pgno *pP
26650 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61  gno, .  Pgno nea
26660 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a  rby,.  u8 exact.
26670 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
26680 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
26690 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
266a0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
266b0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
266c0 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
266d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
266e0 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
266f0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
26700 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
26710 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
26720 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
26730 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
26740 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
26750 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
26760 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
26770 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
26780 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
26790 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
267a0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
267b0 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
267c0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
267d0 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  t);.  n = get4by
267e0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
267f0 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
26800 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
26810 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
26820 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
26830 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
26840 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
26850 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
26860 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
26870 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
26880 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
26890 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
268a0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
268b0 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
268c0 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
268d0 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
268e0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
268f0 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
26900 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78     /* If the 'ex
26910 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77  act' parameter w
26920 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75  as true and a qu
26930 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
26940 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
26950 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
26960 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
26970 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
26980 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
26990 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
269a0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
269b0 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
269c0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
269d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
269e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
269f0 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61  if( exact && nea
26a00 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
26a10 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
26a20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
26a30 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  rby>0 );.      a
26a40 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
26a50 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
26a60 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
26a70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
26a80 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  pe, 0);.      if
26a90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
26aa0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
26ab0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
26ac0 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  GE ){.        se
26ad0 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
26ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67      }.      *pPg
26af0 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20  no = nearby;.   
26b00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
26b10 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
26b20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
26b30 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
26b40 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
26b50 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
26b60 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
26b70 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
26b80 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
26b90 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
26ba0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26bb0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
26bc0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
26bd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
26be0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
26bf0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
26c00 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
26c10 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
26c20 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
26c30 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
26c40 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
26c50 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
26c60 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
26c70 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
26c80 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
26c90 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
26ca0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
26cb0 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
26cc0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
26cd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ..    */.    do 
26ce0 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
26cf0 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
26d00 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
26d10 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
26d20 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
26d30 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
26d40 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
26d50 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
26d60 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
26d70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
26d80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26d90 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
26da0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
26db0 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
26dc0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
26dd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
26de0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
26df0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
26e00 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
26e10 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
26e20 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
26e30 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
26e40 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
26e50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
26e60 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
26e70 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  _page;.      }..
26e80 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
26e90 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
26ea0 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
26eb0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
26ec0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
26ed0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
26ee0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
26ef0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
26f00 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
26f10 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
26f20 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
26f30 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
26f40 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
26f50 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
26f60 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
26f70 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
26f80 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
26f90 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
26fa0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26fb0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
26fc0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
26fd0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
26fe0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
26ff0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
27000 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
27010 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
27020 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
27030 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
27040 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
27050 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
27060 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
27070 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
27080 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
27090 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
270a0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
270b0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
270c0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
270d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
270e0 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
270f0 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
27100 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
27110 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
27120 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
27130 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
27140 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27150 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27160 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
27170 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
27180 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27190 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
271a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
271b0 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65  searchList && ne
271c0 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a  arby==iTrunk ){.
271d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
271e0 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
271f0 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
27200 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
27210 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
27220 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
27230 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
27240 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
27250 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
27260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
27270 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a  Pgno==iTrunk );.
27280 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
27290 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
272a0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
272b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
272c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
272d0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
272e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
272f0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
27300 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
27310 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
27320 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
27330 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
27340 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
27350 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
27360 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
27370 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
27380 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
27390 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
273a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
273b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
273c0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
273d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
273e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
273f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27400 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
27410 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
27420 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27430 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
27440 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
27450 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
27460 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
27470 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27490 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
274a0 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
274b0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
274c0 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
274d0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
274e0 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
274f0 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
27500 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
27510 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
27520 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
27530 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
27540 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27550 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
27560 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
27570 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
27580 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
27590 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
275a0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
275b0 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
275c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
275d0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
275e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
275f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
27600 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
27610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27620 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77    testcase( iNew
27630 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
27640 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27650 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
27660 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
27670 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
27680 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
276a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
276b0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
276c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
276d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
276e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
276f0 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
27700 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27710 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27720 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
27730 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
27740 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
27750 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
27760 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
27770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
27780 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
27790 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
277a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
277b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
277c0 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
277d0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
277e0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
277f0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
27800 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
27810 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
27820 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
27830 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
27840 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
27850 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
27860 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
27870 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27880 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
27890 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
278a0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
278b0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
278c0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
278d0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
278e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
278f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27900 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
27910 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
27920 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
27930 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
27940 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
27950 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
27960 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27970 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
27980 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
27990 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
279a0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
279b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
279c0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
279d0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
279e0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
279f0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
27a00 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
27a10 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
27a20 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
27a30 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
27a40 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
27a50 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
27a60 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
27a70 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
27a80 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
27a90 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
27aa0 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
27ab0 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
27ac0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27ad0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
27ae0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
27af0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
27b00 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
27b10 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
27b20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27b30 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
27b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
27b50 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  2 i;.          i
27b60 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
27b70 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
27b80 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
27b90 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
27ba0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
27bb0 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
27bc0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
27bd0 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
27be0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
27bf0 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
27c00 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
27c10 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
27c20 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
27c30 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
27c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
27c50 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
27c60 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
27c70 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
27c80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
27c90 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27ca0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
27cb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
27cc0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
27cd0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
27ce0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
27cf0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27d00 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
27d10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
27d20 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
27d30 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27d40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
27d50 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
27d60 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
27d70 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
27d80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27d90 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
27da0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
27db0 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
27dc0 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
27dd0 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
27de0 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
27df0 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
27e00 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
27e10 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
27e20 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
27e30 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
27e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27e50 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
27e60 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
27e70 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
27e80 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
27e90 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
27ea0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1));.          i
27eb0 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
27ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
27ed0 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
27ee0 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
27ef0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
27f00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27f10 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
27f20 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
27f30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
27f40 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
27f50 74 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70  teable(pTrunk->p
27f60 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
27f70 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
27f80 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
27f90 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
27fa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
27fb0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
27fc0 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
27fd0 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
27fe0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28000 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
28010 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28020 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
28030 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
28040 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28050 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28060 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28070 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
28080 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28090 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
280a0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
280b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
280c0 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
280d0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
280e0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
280f0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
28100 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
28110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
28120 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
28130 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
28140 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
28150 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
28160 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
28170 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72  he file */.    r
28180 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28190 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
281a0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
281b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
281c0 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
281d0 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
281e0 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
281f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
28200 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
28210 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
28220 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
28230 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
28240 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
28250 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
28260 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
28270 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
28280 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
28290 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
282a0 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
282b0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
282c0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
282d0 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
282e0 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
282f0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
28300 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
28310 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
28320 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
28330 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
28340 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
28350 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
28360 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
28370 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
28380 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
28390 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
283a0 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
283b0 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
283c0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
283d0 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
283e0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
283f0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
28400 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 42  eGetPage(pBt, pB
28410 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
28420 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
28430 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28440 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28450 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
28460 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
28470 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
28480 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
28490 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
284a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
284b0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
284c0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
284d0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
284e0 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
284f0 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
28500 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
28510 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
28520 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
28530 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
28540 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
28550 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
28560 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
28570 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
28580 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
28590 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
285a0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
285b0 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  age, 1);.    if(
285c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
285d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
285e0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
285f0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
28600 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
28610 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28620 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
28630 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
28640 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
28650 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
28660 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
28670 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
28680 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
28690 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
286a0 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
286b0 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
286c0 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
286d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
286e0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
286f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28700 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
28710 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
28720 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
28730 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
28740 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
28750 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
28760 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
28770 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
28780 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
28790 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
287a0 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
287b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
287c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
287d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
287e0 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
287f0 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
28800 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
28810 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
28820 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
28830 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
28840 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
28850 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
28860 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
28870 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
28880 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
28890 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
288a0 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
288b0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
288c0 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
288d0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
288e0 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
288f0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
28900 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
28910 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
28920 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
28930 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
28940 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
28950 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
28960 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
28970 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
28980 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
28990 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
289a0 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
289b0 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
289c0 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
289d0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
289e0 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
289f0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
28a00 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
28a10 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
28a20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
28a30 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
28a40 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
28a50 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
28a60 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
28a70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
28a80 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
28a90 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
28aa0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
28ab0 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
28ac0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
28ad0 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
28ae0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
28af0 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
28b00 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28b20 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
28b30 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
28b40 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
28b70 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
28b80 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
28bb0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
28bc0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
28bd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
28be0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
28bf0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
28c00 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  t( iPage>1 );.  
28c10 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
28c20 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
28c30 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
28c40 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
28c50 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
28c60 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
28c70 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
28c80 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
28c90 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
28ca0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
28cb0 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
28cc0 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
28cd0 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
28ce0 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
28cf0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
28d00 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
28d10 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
28d20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
28d30 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
28d40 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
28d50 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
28d60 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
28d70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
28d80 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20  ], nFree+1);..  
28d90 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65 44  if( pBt->secureD
28da0 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20  elete ){.    /* 
28db0 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  If the secure_de
28dc0 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  lete option is e
28dd0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  nabled, then.   
28de0 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
28df0 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
28e00 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
28e10 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
28e20 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  /.    if( (!pPag
28e30 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65  e && ((rc = btre
28e40 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
28e50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
28e60 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20  !=0) ).     ||  
28e70 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d            ((rc =
28e80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28e90 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
28ea0 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  e))!=0).    ){. 
28eb0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
28ec0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
28ed0 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
28ee0 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
28ef0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
28f00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
28f10 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
28f20 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
28f30 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
28f40 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
28f50 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
28f60 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
28f70 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
28f80 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
28f90 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  UM ){.    ptrmap
28fa0 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
28fb0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
28fc0 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
28fd0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
28fe0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
28ff0 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
29000 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
29010 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
29020 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
29030 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
29040 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
29050 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
29060 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
29070 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
29080 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
29090 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
290a0 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
290b0 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
290c0 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
290d0 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
290e0 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
290f0 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
29100 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
29110 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
29120 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
29130 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
29140 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
29150 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
29160 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
29170 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
29180 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
29190 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
291a0 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
291b0 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
291c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
291d0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
291e0 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
291f0 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
29200 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
29210 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
29220 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
29230 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
29240 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
29250 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
29260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29270 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
29280 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
29290 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
292a0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
292b0 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
292c0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
292d0 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
292e0 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
292f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
29300 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
29310 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
29320 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
29330 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
29340 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
29350 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
29360 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
29370 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
29380 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
29390 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
293a0 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
293b0 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
293c0 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
293d0 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
293e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
293f0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
29400 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
29410 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
29420 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
29430 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
29440 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
29450 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
29460 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
29470 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
29480 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
29490 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
294a0 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
294b0 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
294c0 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
294d0 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
294e0 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
294f0 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
29500 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
29510 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
29520 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
29530 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
29540 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
29550 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
29560 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
29570 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
29580 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
29590 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
295a0 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
295b0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
295c0 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
295d0 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
295e0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
295f0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
29600 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
29610 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
29620 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
29630 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
29640 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
29650 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
29660 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
29670 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
29680 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
29690 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
296a0 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
296b0 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
296c0 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  4-8"..      */. 
296d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
296e0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
296f0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
29700 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29720 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
29730 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
29740 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
29750 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
29760 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
29770 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
29780 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
29790 21 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65  !pBt->secureDele
297a0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
297b0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
297c0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
297d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
297e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
297f0 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
29800 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
29810 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
29820 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
29830 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
29840 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
29850 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
29860 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
29870 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
29880 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
29890 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
298a0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
298b0 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
298c0 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
298d0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
298e0 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
298f0 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
29900 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
29910 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
29920 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
29930 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
29940 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
29950 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
29960 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
29970 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
29980 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
29990 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
299a0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
299b0 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
299c0 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
299d0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
299e0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
299f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
29a00 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  e==0 && SQLITE_O
29a10 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65  K!=(rc = btreeGe
29a20 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
29a30 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b  , &pPage, 0)) ){
29a40 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
29a50 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63  ge_out;.  }.  rc
29a60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
29a70 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
29a80 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
29a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29aa0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
29ab0 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
29ac0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
29ad0 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
29ae0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
29af0 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
29b00 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
29b10 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
29b20 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
29b30 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
29b40 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
29b50 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
29b60 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
29b70 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
29b80 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
29b90 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
29ba0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
29bb0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
29bc0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
29bd0 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
29be0 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
29bf0 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  d freePage(MemPa
29c00 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a  ge *pPage, int *
29c10 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
29c20 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
29c30 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65  .    *pRC = free
29c40 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74  Page2(pPage->pBt
29c50 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  , pPage, pPage->
29c60 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pgno);.  }.}../*
29c70 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
29c80 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
29c90 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
29ca0 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73  given Cell..*/.s
29cb0 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
29cc0 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
29cd0 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ge, unsigned cha
29ce0 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53  r *pCell){.  BtS
29cf0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
29d00 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49  ge->pBt;.  CellI
29d10 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f  nfo info;.  Pgno
29d20 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
29d30 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
29d40 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65  ;.  u32 ovflPage
29d50 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
29d60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29d70 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
29d80 6d 75 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65  mutex) );.  btre
29d90 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
29da0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
29db0 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  o);.  if( info.i
29dc0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
29dd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29de0 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
29df0 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
29e00 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
29e10 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
29e20 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
29e30 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
29e40 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
29e50 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
29e60 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
29e70 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
29e80 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
29e90 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
29ea0 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
29eb0 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
29ec0 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
29ed0 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
29ee0 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67    assert( ovflPg
29ef0 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30  no==0 || nOvfl>0
29f00 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76   );.  while( nOv
29f10 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  fl-- ){.    Pgno
29f20 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20   iNext = 0;.    
29f30 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
29f40 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c   0;.    if( ovfl
29f50 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67  Pgno<2 || ovflPg
29f60 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no>btreePagecoun
29f70 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
29f80 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65  /* 0 is not a le
29f90 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
29fa0 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f  and page 1 canno
29fb0 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a  t be an .      *
29fc0 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  * overflow page.
29fd0 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76   Therefore if ov
29fe0 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74  flPgno<2 or past
29ff0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2a000 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74  .      ** file t
2a010 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
2a020 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
2a030 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2a040 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2a050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2a060 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72  nOvfl ){.      r
2a070 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
2a080 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
2a090 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78  o, &pOvfl, &iNex
2a0a0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2a0b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2a0c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70    }..    if( ( p
2a0d0 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20  Ovfl || ((pOvfl 
2a0e0 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
2a0f0 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29  p(pBt, ovflPgno)
2a100 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20  )!=0) ).     && 
2a110 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2a120 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e  Refcount(pOvfl->
2a130 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20  pDbPage)!=1.    
2a140 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  ){.      /* Ther
2a150 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61  e is no reason a
2a160 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64  ny cursor should
2a170 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e   have an outstan
2a180 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a  ding reference .
2a190 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f        ** to an o
2a1a0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c  verflow page bel
2a1b0 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c  onging to a cell
2a1c0 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64   that is being d
2a1d0 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a  eleted/updated..
2a1e0 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74        ** So if t
2a1f0 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65  here exists more
2a200 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65   than one refere
2a210 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  nce to this page
2a220 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20  , then it .     
2a230 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61   ** must not rea
2a240 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  lly be an overfl
2a250 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  ow page and the 
2a260 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
2a270 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20   corrupt. .     
2a280 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75   ** It is helpfu
2a290 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73  l to detect this
2a2a0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
2a2b0 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20  freePage2(), as 
2a2c0 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61  .      ** freePa
2a2d0 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74  ge2() may zero t
2a2e0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  he page contents
2a2f0 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74   if secure-delet
2a300 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20  e mode is.      
2a310 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74  ** enabled. If t
2a320 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70  his 'overflow' p
2a330 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
2a340 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68  e a page that th
2a350 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65  e.      ** calle
2a360 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74  r is iterating t
2a370 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20  hrough or using 
2a380 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61  in some other wa
2a390 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  y, this.      **
2a3a0 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61   can be problema
2a3b0 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tic..      */.  
2a3c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a3d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2a3e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2a3f0 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42  c = freePage2(pB
2a400 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67  t, pOvfl, ovflPg
2a410 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  no);.    }..    
2a420 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20  if( pOvfl ){.   
2a430 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2a440 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50  nref(pOvfl->pDbP
2a450 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
2a460 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2a470 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f  rc;.    ovflPgno
2a480 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20   = iNext;.  }.  
2a490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a4a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2a4b0 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65  e the byte seque
2a4c0 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72  nce used to repr
2a4d0 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20  esent a cell on 
2a4e0 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e  page pPage.** an
2a4f0 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74  d write that byt
2a500 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20  e sequence into 
2a510 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c  pCell[].  Overfl
2a520 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ow pages are.** 
2a530 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69  allocated and fi
2a540 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73  lled in as neces
2a550 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69  sary.  The calli
2a560 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  ng procedure.** 
2a570 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
2a580 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73  or making sure s
2a590 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
2a5a0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
2a5b0 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b  ed.** for pCell[
2a5c0 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  ]..**.** Note th
2a5d0 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f  at pCell does no
2a5e0 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64  t necessary need
2a5f0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
2a600 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
2a610 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69   area.  pCell mi
2a620 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  ght point to som
2a630 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  e temporary stor
2a640 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77  age.  The cell w
2a650 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72  ill.** be constr
2a660 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65  ucted in this te
2a670 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65  mporary area the
2a680 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50  n copied into pP
2a690 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61  age->aData.** la
2a6a0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
2a6b0 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20  nt fillInCell(. 
2a6c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6e0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
2a6f0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
2a700 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
2a710 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
2a720 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
2a730 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
2a740 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ell */.  const v
2a750 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
2a760 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
2a770 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ey */.  const vo
2a780 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44  id *pData,int nD
2a790 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61  ata,   /* The da
2a7a0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  ta */.  int nZer
2a7b0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
2a7c0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
2a7d0 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70  zero bytes to ap
2a7e0 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f  pend to pData */
2a7f0 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20  .  int *pnSize  
2a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a810 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20    /* Write cell 
2a820 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  size here */.){.
2a830 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a    int nPayload;.
2a840 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63    const u8 *pSrc
2a850 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c  ;.  int nSrc, n,
2a860 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65   rc;.  int space
2a870 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Left;.  MemPage 
2a880 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65  *pOvfl = 0;.  Me
2a890 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
2a8a0 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 0;.  unsigne
2a8b0 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a  d char *pPrior;.
2a8c0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2a8d0 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53  *pPayload;.  BtS
2a8e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
2a8f0 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
2a900 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
2a910 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43  int nHeader;.  C
2a920 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
2a930 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a940 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2a950 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2a960 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
2a970 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
2a980 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65   writeable since
2a990 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20   pCell might be 
2a9a0 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62  auxiliary.  ** b
2a9b0 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74  uffer space that
2a9c0 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f   is separate fro
2a9d0 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66  m the pPage buff
2a9e0 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73  er area */.  ass
2a9f0 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65  ert( pCell<pPage
2aa00 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c  ->aData || pCell
2aa10 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2aa20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2aa30 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2aa40 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2aa50 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2aa60 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  Page) );..  /* F
2aa70 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
2aa80 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
2aa90 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  = 0;.  if( !pPag
2aaa0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e  e->leaf ){.    n
2aab0 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d  Header += 4;.  }
2aac0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61  .  if( pPage->ha
2aad0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65  sData ){.    nHe
2aae0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
2aaf0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
2ab00 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b  ], nData+nZero);
2ab10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44  .  }else{.    nD
2ab20 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b  ata = nZero = 0;
2ab30 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
2ab40 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
2ab50 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
2ab60 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74  64*)&nKey);.  bt
2ab70 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
2ab80 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
2ab90 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
2aba0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48  info.nHeader==nH
2abb0 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72  eader );.  asser
2abc0 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b  t( info.nKey==nK
2abd0 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
2abe0 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32  info.nData==(u32
2abf0 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29  )(nData+nZero) )
2ac00 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
2ac10 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
2ac20 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
2ac30 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
2ac40 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2ac50 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
2ac60 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
2ac70 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
2ac80 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20  a = 0;.  }else{ 
2ac90 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e  .    if( NEVER(n
2aca0 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c  Key>0x7fffffff |
2acb0 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20  | pKey==0) ){.  
2acc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2acd0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2ace0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
2acf0 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  ad += (int)nKey;
2ad00 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
2ad10 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e  ;.    nSrc = (in
2ad20 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70  t)nKey;.  }.  *p
2ad30 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
2ad40 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  ze;.  spaceLeft 
2ad50 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  = info.nLocal;. 
2ad60 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
2ad70 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70  ll[nHeader];.  p
2ad80 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69  Prior = &pCell[i
2ad90 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a  nfo.iOverflow];.
2ada0 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
2adb0 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
2adc0 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
2add0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ade0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2adf0 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
2ae00 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
2ae10 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
2ae20 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2ae30 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  try page */.    
2ae40 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2ae50 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
2ae60 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70   do{.          p
2ae70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20  gnoOvfl++;.     
2ae80 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20     } while( .   
2ae90 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53         PTRMAP_IS
2aea0 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76  PAGE(pBt, pgnoOv
2aeb0 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d  fl) || pgnoOvfl=
2aec0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2aed0 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20  GE(pBt) .       
2aee0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
2aef0 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
2af00 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2af10 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
2af20 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
2af30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
2af40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2af50 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
2af60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
2af70 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
2af80 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
2af90 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
2afa0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
2afb0 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
2afc0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
2afd0 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
2afe0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
2aff0 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
2b000 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
2b010 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
2b020 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
2b030 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
2b040 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
2b050 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
2b060 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
2b070 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
2b080 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
2b090 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
2b0a0 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
2b0b0 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
2b0c0 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
2b0d0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
2b0e0 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
2b0f0 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
2b100 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
2b110 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61  ialised values a
2b120 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
2b130 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
2b140 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
2b150 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
2b160 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
2b170 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
2b180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b190 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
2b1a0 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
2b1b0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
2b1c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
2b1d0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
2b1e0 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
2b1f0 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
2b200 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ap, &rc);.      
2b210 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2b220 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b230 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
2b240 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
2b250 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
2b260 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2b270 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2b280 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
2b290 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
2b2a0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52        /* If pToR
2b2b0 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
2b2c0 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70  ro than pPrior p
2b2d0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
2b2e0 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a  ata area.      *
2b2f0 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
2b300 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
2b310 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
2b320 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
2b330 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
2b340 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
2b350 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2b360 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
2b370 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2b380 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72      /* If pPrior
2b390 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2b3a0 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
2b3b0 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
2b3c0 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a  re pPage.      *
2b3d0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
2b3e0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  able */.      as
2b3f0 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61  sert( pPrior<pPa
2b400 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72  ge->aData || pPr
2b410 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ior>=&pPage->aDa
2b420 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
2b430 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
2b440 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2b450 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2b460 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2b470 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
2b480 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
2b490 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2b4a0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
2b4b0 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
2b4c0 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
2b4d0 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
2b4e0 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
2b4f0 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
2b500 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
2b510 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
2b520 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
2b530 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
2b540 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
2b550 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
2b560 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
2b570 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
2b580 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  eLeft;..    /* I
2b590 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
2b5a0 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
2b5b0 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e  ayload points in
2b5c0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
2b5d0 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65  .    ** of pToRe
2b5e0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
2b5f0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
2b600 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
2b610 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2b620 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
2b630 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2b640 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
2b650 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
2b660 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79  ..    /* If pPay
2b670 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20  load is part of 
2b680 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
2b690 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
2b6a0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
2b6b0 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
2b6c0 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73  teable */.    as
2b6d0 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70  sert( pPayload<p
2b6e0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
2b6f0 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d  Payload>=&pPage-
2b700 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
2b710 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
2b720 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
2b730 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2b740 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2b750 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20  .    if( nSrc>0 
2b760 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  ){.      if( n>n
2b770 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
2b780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
2b790 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rc );.      memc
2b7a0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
2b7b0 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
2b7c0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
2b7d0 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a  Payload, 0, n);.
2b7e0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
2b7f0 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61  ad -= n;.    pPa
2b800 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20  yload += n;.    
2b810 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e  pSrc += n;.    n
2b820 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70  Src -= n;.    sp
2b830 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20  aceLeft -= n;.  
2b840 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b    if( nSrc==0 ){
2b850 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  .      nSrc = nD
2b860 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20  ata;.      pSrc 
2b870 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  = pData;.    }. 
2b880 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
2b890 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
2b8a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b8b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
2b8c0 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
2b8d0 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
2b8e0 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
2b8f0 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
2b900 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
2b910 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
2b920 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
2b930 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
2b940 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
2b950 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
2b960 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
2b970 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
2b980 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
2b990 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
2b9a0 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
2b9b0 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
2b9c0 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
2b9d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2b9e0 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
2b9f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72  /.static void dr
2ba00 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
2ba10 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
2ba20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43  int sz, int *pRC
2ba30 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
2ba40 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2ba50 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 70 63  nter */.  u32 pc
2ba60 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
2ba70 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
2ba80 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
2ba90 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
2baa0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
2bab0 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
2bac0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
2bad0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
2bae0 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
2baf0 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
2bb00 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2bb10 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
2bb20 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2bb30 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  hdr;        /* B
2bb40 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2bb50 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20  header.  0 most 
2bb60 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65  pages.  100 page
2bb70 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52   1 */..  if( *pR
2bb80 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
2bb90 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
2bba0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
2bbb0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
2bbc0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
2bbd0 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
2bbe0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2bbf0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2bc00 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2bc10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2bc20 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2bc30 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2bc40 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
2bc50 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
2bc60 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
2bc70 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64  ellOffset + 2*id
2bc80 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
2bc90 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20  yte(ptr);.  hdr 
2bca0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
2bcb0 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  et;.  testcase( 
2bcc0 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  pc==get2byte(&da
2bcd0 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
2bce0 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
2bcf0 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
2bd00 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
2bd10 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62   pc < (u32)get2b
2bd20 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2bd30 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61  ) || pc+sz > pPa
2bd40 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2bd50 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ize ){.    *pRC 
2bd60 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2bd70 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
2bd80 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  n;.  }.  rc = fr
2bd90 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
2bda0 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
2bdb0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
2bdc0 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
2bdd0 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31   }.  for(i=idx+1
2bde0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
2bdf0 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a  ; i++, ptr+=2){.
2be00 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
2be10 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20  [2];.    ptr[1] 
2be20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20  = ptr[3];.  }.  
2be30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
2be40 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2be50 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
2be60 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
2be70 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a  >nFree += 2;.}..
2be80 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
2be90 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
2bea0 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
2beb0 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
2bec0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
2bed0 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
2bee0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
2bef0 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
2bf00 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
2bf10 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
2bf20 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
2bf30 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
2bf40 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
2bf50 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2bf60 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
2bf70 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
2bf80 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
2bf90 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
2bfa0 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
2bfb0 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
2bfc0 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
2bfd0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
2bfe0 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
2bff0 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
2c000 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
2c010 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
2c020 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
2c030 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
2c040 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
2c050 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
2c060 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
2c070 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2c080 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
2c090 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
2c0a0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2c0b0 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
2c0c0 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
2c0d0 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
2c0e0 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
2c0f0 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
2c100 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
2c110 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
2c120 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
2c130 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
2c140 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
2c150 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
2c160 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
2c170 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
2c180 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
2c190 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
2c1a0 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
2c1b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2c1c0 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
2c1d0 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
2c1e0 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
2c1f0 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
2c200 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
2c210 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
2c220 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
2c230 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
2c240 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2c250 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
2c260 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
2c270 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
2c280 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
2c290 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
2c2a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
2c2b0 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
2c2c0 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
2c2d0 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
2c2e0 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66  hild,      /* If
2c2f0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
2c300 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
2c310 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
2c320 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20   */.  int *pRC  
2c330 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
2c340 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e  and write return
2c350 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20   code from here 
2c360 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20  */.){.  int idx 
2c370 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65  = 0;      /* Whe
2c380 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
2c390 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
2c3a0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2c3b0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
2c3c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2c3d0 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
2c3e0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
2c3f0 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
2c400 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
2c410 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2c420 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
2c430 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
2c440 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
2c450 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
2c460 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65  rted */.  int ce
2c470 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
2c480 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
2c490 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
2c4a0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2c4b0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
2c4c0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
2c4d0 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
2c4e0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
2c4f0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
2c500 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
2c510 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
2c520 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20  ata[] */..  int 
2c530 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20  nSkip = (iChild 
2c540 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28  ? 4 : 0);..  if(
2c550 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
2c560 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
2c570 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
2c580 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
2c590 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
2c5a0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d   pPage->nCell<=M
2c5b0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2c5c0 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50  t) && MX_CELL(pP
2c5d0 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
2c5e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2c5f0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d  age->nOverflow<=
2c600 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
2c610 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  >aOvfl) );.  ass
2c620 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2c630 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2c640 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2c650 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75  /* The cell shou
2c660 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73  ld normally be s
2c670 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  ized correctly. 
2c680 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d   However, when m
2c690 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c  oving a.  ** mal
2c6a0 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d  formed cell from
2c6b0 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20   a leaf page to 
2c6c0 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  an interior page
2c6d0 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69  , if the cell si
2c6e0 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74  ze.  ** wanted t
2c6f0 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  o be less than 4
2c700 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64   but got rounded
2c710 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20   up to 4 on the 
2c720 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a  leaf, then size.
2c730 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65    ** might be le
2c740 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d  ss than 8 (leaf-
2c750 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20  size + pointer) 
2c760 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  on the interior 
2c770 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a  node.  Hence.  *
2c780 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72  * the term after
2c790 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66   the || in the f
2c7a0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
2c7b0 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
2c7c0 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
2c7d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
2c7e0 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
2c7f0 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
2c800 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
2c810 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
2c820 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
2c830 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
2c840 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
2c850 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
2c860 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
2c870 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
2c880 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
2c890 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
2c8a0 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
2c8b0 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2c8c0 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
2c8d0 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
2c8e0 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65  rt( j<(int)(size
2c8f0 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29  of(pPage->aOvfl)
2c900 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  /sizeof(pPage->a
2c910 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20  Ovfl[0])) );.   
2c920 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
2c930 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  .pCell = pCell;.
2c940 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
2c950 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69  [j].idx = (u16)i
2c960 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2c970 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
2c980 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2c990 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2c9a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c9b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
2c9c0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2c9d0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
2c9e0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2c9f0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2ca00 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2ca10 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
2ca20 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c  ->aData;.    cel
2ca30 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
2ca40 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
2ca50 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
2ca60 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
2ca70 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65  ll;.    ins = ce
2ca80 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
2ca90 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2caa0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
2cab0 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
2cac0 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63   rc ){ *pRC = rc
2cad0 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20  ; return; }.    
2cae0 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53  /* The allocateS
2caf0 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67  pace() routine g
2cb00 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f  uarantees the fo
2cb10 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70  llowing two prop
2cb20 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
2cb30 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
2cb40 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ess */.    asser
2cb50 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20  t( idx >= end+2 
2cb60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2cb70 64 78 2b 73 7a 20 3c 3d 20 70 50 61 67 65 2d 3e  dx+sz <= pPage->
2cb80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2cb90 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
2cba0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65  ell++;.    pPage
2cbb0 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29  ->nFree -= (u16)
2cbc0 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65  (2 + sz);.    me
2cbd0 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
2cbe0 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
2cbf0 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
2cc00 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2cc10 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2cc20 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
2cc30 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ld);.    }.    f
2cc40 6f 72 28 6a 3d 65 6e 64 2c 20 70 74 72 3d 26 64  or(j=end, ptr=&d
2cc50 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a  ata[j]; j>ins; j
2cc60 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20  -=2, ptr-=2){.  
2cc70 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
2cc80 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b  [-2];.      ptr[
2cc90 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20  1] = ptr[-1];.  
2cca0 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
2ccb0 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
2ccc0 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
2ccd0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
2cce0 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65  Offset+3], pPage
2ccf0 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  ->nCell);.#ifnde
2cd00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2cd10 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2cd20 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
2cd30 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2cd40 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
2cd50 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
2cd60 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
2cd70 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
2cd80 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
2cd90 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
2cda0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
2cdb0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
2cdc0 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
2cdd0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
2cde0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2cdf0 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65  , pRC);.    }.#e
2ce00 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
2ce10 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20  * Add a list of 
2ce20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e  cells to a page.
2ce30 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c    The page shoul
2ce40 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65  d be initially e
2ce50 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  mpty..** The cel
2ce60 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ls are guarantee
2ce70 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  d to fit on the 
2ce80 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
2ce90 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67  void assemblePag
2cea0 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
2ceb0 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  age,   /* The pa
2cec0 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c  ge to be assembl
2ced0 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ied */.  int nCe
2cee0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
2cef0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
2cf00 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
2cf10 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
2cf20 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
2cf30 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
2cf40 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36   bodies */.  u16
2cf50 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
2cf60 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
2cf70 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
2cf80 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
2cf90 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2cfa0 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
2cfb0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
2cfc0 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
2cfd0 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
2cfe0 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
2cff0 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
2d000 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
2d010 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
2d020 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
2d030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2d040 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
2d050 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  r pPage */.  con
2d060 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
2d070 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
2d080 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2d090 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
2d0a0 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
2d0b0 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70   int nUsable = p
2d0c0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2d0d0 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
2d0e0 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f   size of page */
2d0f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2d100 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2d110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2d120 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2d130 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2d140 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2d150 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c  nCell>=0 && nCel
2d160 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
2d170 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c  ->pBt) && MX_CEL
2d180 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
2d190 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74 28  0921);.  assert(
2d1a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2d1b0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2d1c0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
2d1d0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2d1e0 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62   page has just b
2d1f0 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65  een zeroed by ze
2d200 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73  roPage() */.  as
2d210 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2d220 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
2d230 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  t( get2byteNotZe
2d240 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
2d250 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20  ==nUsable );..  
2d260 70 43 65 6c 6c 70 74 72 20 3d 20 26 64 61 74 61  pCellptr = &data
2d270 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
2d280 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  et + nCell*2];. 
2d290 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61   cellbody = nUsa
2d2a0 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65  ble;.  for(i=nCe
2d2b0 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ll-1; i>=0; i--)
2d2c0 7b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d  {.    pCellptr -
2d2d0 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64  = 2;.    cellbod
2d2e0 79 20 2d 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  y -= aSize[i];. 
2d2f0 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
2d300 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  lptr, cellbody);
2d310 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
2d320 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43  a[cellbody], apC
2d330 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d  ell[i], aSize[i]
2d340 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74  );.  }.  put2byt
2d350 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
2d360 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79  nCell);.  put2by
2d370 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
2d380 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
2d390 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e  age->nFree -= (n
2d3a0 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65  Cell*2 + nUsable
2d3b0 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20   - cellbody);.  
2d3c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28  pPage->nCell = (
2d3d0 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a  u16)nCell;.}../*
2d3e0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2d3f0 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74  g parameters det
2d400 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20  ermine how many 
2d410 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67  adjacent pages g
2d420 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69  et involved.** i
2d430 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  n a balancing op
2d440 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20  eration.  NN is 
2d450 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  the number of ne
2d460 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2d470 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65  r side.** of the
2d480 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69   page that parti
2d490 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
2d4a0 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
2d4b0 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a  n.  NB is the.**
2d4c0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
2d4d0 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74   pages that part
2d4e0 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69  icipate, includi
2d4f0 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61  ng the target pa
2d500 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69  ge and.** NN nei
2d510 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
2d520 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   side..**.** The
2d530 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f   minimum value o
2d540 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f  f NN is 1 (of co
2d550 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69  urse).  Increasi
2d560 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a  ng NN above 1.**
2d570 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76   (to 2 or 3) giv
2d580 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72  es a modest impr
2d590 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43  ovement in SELEC
2d5a0 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72  T and DELETE per
2d5b0 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65  formance.** in e
2d5c0 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61  xchange for a la
2d5d0 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e  rger degradation
2d5e0 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55   in INSERT and U
2d5f0 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  PDATE performanc
2d600 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  e..** The value 
2d610 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f  of NN appears to
2d620 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72   give the best r
2d630 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a  esults overall..
2d640 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20  */.#define NN 1 
2d650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2d660 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
2d670 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
2d680 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64  e of pPage */.#d
2d690 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31  efine NB (NN*2+1
2d6a0 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  )      /* Total 
2d6b0 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  pages involved i
2d6c0 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f  n the balance */
2d6d0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
2d6e0 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
2d6f0 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
2d700 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
2d710 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
2d720 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
2d730 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
2d740 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
2d750 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
2d760 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
2d770 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
2d780 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
2d790 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
2d7a0 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
2d7b0 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
2d7c0 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
2d7d0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
2d7e0 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20  ad of trying to 
2d7f0 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
2d800 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
2d810 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
2d820 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
2d830 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
2d840 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
2d850 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
2d860 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
2d870 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
2d880 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
2d890 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
2d8a0 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
2d8b0 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
2d8c0 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
2d8d0 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
2d8e0 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
2d8f0 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
2d900 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
2d910 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
2d920 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
2d930 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
2d940 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
2d950 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
2d960 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
2d970 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
2d980 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
2d990 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
2d9a0 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
2d9b0 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
2d9c0 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
2d9d0 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
2d9e0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
2d9f0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
2da00 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66  * The pSpace buf
2da10 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73  fer is used to s
2da20 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79  tore a temporary
2da30 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76   copy of the div
2da40 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61  ider.** cell tha
2da50 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  t will be insert
2da60 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ed into pParent.
2da70 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e   Such a cell con
2da80 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20  sists of a 4.** 
2da90 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
2daa0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76   followed by a v
2dab0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2dac0 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72  nteger. In other
2dad0 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f  .** words, at mo
2dae0 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e  st 13 bytes. Hen
2daf0 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75  ce the pSpace bu
2db00 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a  ffer must be at.
2db10 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65  ** least 13 byte
2db20 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
2db30 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2db40 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a  _quick(MemPage *
2db50 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65  pParent, MemPage
2db60 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70   *pPage, u8 *pSp
2db70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ace){.  BtShared
2db80 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50   *const pBt = pP
2db90 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20  age->pBt;    /* 
2dba0 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20  B-Tree Database 
2dbb0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  */.  MemPage *pN
2dbc0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
2dbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2dbe0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ly allocated pag
2dbf0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
2dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2dc20 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
2dc30 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20  Pgno pgnoNew;   
2dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc50 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2dc60 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a  ber of pNew */..
2dc70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2dc80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2dc90 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2dca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2dcb0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2dcc0 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
2dcd0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2dce0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2dcf0 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  flow==1 );..  /*
2dd00 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64   This error cond
2dd10 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75  ition is now cau
2dd20 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
2dd30 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  ching this funct
2dd40 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ion */.  if( pPa
2dd50 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72  ge->nCell<=0 ) r
2dd60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2dd70 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a  RUPT_BKPT;..  /*
2dd80 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
2dd90 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20  page. This page 
2dda0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
2ddb0 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66  right-sibling of
2ddc0 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61   .  ** pPage. Ma
2ddd0 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ke the parent pa
2dde0 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20  ge writable, so 
2ddf0 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76  that the new div
2de00 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d  ider cell.  ** m
2de10 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ay be inserted. 
2de20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70  If both these op
2de30 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63  erations are suc
2de40 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64  cessful, proceed
2de50 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c  ..  */.  rc = al
2de60 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2de70 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
2de80 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  oNew, 0, 0);..  
2de90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dea0 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f  K ){..    u8 *pO
2deb0 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b  ut = &pSpace[4];
2dec0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
2ded0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d   pPage->aOvfl[0]
2dee0 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20  .pCell;.    u16 
2def0 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a  szCell = cellSiz
2df00 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
2df10 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f  l);.    u8 *pSto
2df20 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  p;..    assert( 
2df30 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2df40 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44  iteable(pNew->pD
2df50 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73  bPage) );.    as
2df60 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
2df70 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b  ta[0]==(PTF_INTK
2df80 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
2df90 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20  PTF_LEAF) );.   
2dfa0 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
2dfb0 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2dfc0 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
2dfd0 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
2dfe0 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43  age(pNew, 1, &pC
2dff0 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a  ell, &szCell);..
2e000 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2e010 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
2e020 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
2e030 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
2e040 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e  p.    ** with en
2e050 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
2e060 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
2e070 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
2e080 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e   .    ** cell on
2e090 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
2e0a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
2e0b0 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73  f either of thes
2e0c0 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  e.    ** operati
2e0d0 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72  ons fails, the r
2e0e0 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65  eturn code is se
2e0f0 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65  t, but the conte
2e100 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nts.    ** of th
2e110 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72  e parent page ar
2e120 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61  e still manipula
2e130 74 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20  ted by thh code 
2e140 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68  below..    ** Th
2e150 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69  at is Ok, at thi
2e160 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65  s point the pare
2e170 6e 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61  nt page is guara
2e180 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  nteed to.    ** 
2e190 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
2e1a0 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  ty. Returning an
2e1b0 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c   error code will
2e1c0 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20   cause a.    ** 
2e1d0 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e  rollback, undoin
2e1e0 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61  g any changes ma
2e1f0 64 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  de to the parent
2e200 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
2e210 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2e220 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  UM ){.      ptrm
2e230 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e  apPut(pBt, pgnoN
2e240 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ew, PTRMAP_BTREE
2e250 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c  , pParent->pgno,
2e260 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
2e270 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69   szCell>pNew->mi
2e280 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
2e290 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
2e2a0 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20  tr(pNew, pCell, 
2e2b0 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &rc);.      }.  
2e2c0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72    }.  .    /* Cr
2e2d0 65 61 74 65 20 61 20 64 69 76 69 64 65 72 20 63  eate a divider c
2e2e0 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ell to insert in
2e2f0 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20  to pParent. The 
2e300 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20  divider cell.   
2e310 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   ** consists of 
2e320 61 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75  a 4-byte page nu
2e330 6d 62 65 72 20 28 74 68 65 20 70 61 67 65 20 6e  mber (the page n
2e340 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29 20  umber of pPage) 
2e350 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72  and.    ** a var
2e360 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
2e370 20 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75   value (which mu
2e380 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 76  st be the same v
2e390 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20 20  alue as the.    
2e3a0 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f  ** largest key o
2e3b0 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a  n pPage)..    **
2e3c0 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20  .    ** To find 
2e3d0 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
2e3e0 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20  value on pPage, 
2e3f0 66 69 72 73 74 20 66 69 6e 64 20 74 68 65 20 72  first find the r
2e400 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a  ight-most .    *
2e410 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e  * cell on pPage.
2e420 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66   The first two f
2e430 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65  ields of this ce
2e440 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20 20  ll are the .    
2e450 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  ** record-length
2e460 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
2e470 67 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d  gth integer at m
2e480 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73  ost 32-bits in s
2e490 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ize).    ** and 
2e4a0 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61  the key value (a
2e4b0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
2e4c0 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61   integer, may ha
2e4d0 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20  ve any value).. 
2e4e0 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20     ** The first 
2e4f0 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e  of the while(...
2e500 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b  ) loops below sk
2e510 69 70 73 20 6f 76 65 72 20 74 68 65 20 72 65 63  ips over the rec
2e520 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ord-length.    *
2e530 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63  * field. The sec
2e540 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  ond while(...) l
2e550 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b  oop copies the k
2e560 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  ey value from th
2e570 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e  e.    ** cell on
2e580 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20   pPage into the 
2e590 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
2e5a0 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20     */.    pCell 
2e5b0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2e5c0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  , pPage->nCell-1
2e5d0 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
2e5e0 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
2e5f0 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29  ile( (*(pCell++)
2e600 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c  &0x80) && pCell<
2e610 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74  pStop );.    pSt
2e620 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
2e630 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70      while( ((*(p
2e640 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c  Out++) = *(pCell
2e650 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20 70 43  ++))&0x80) && pC
2e660 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20  ell<pStop );..  
2e670 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
2e680 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
2e690 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a   into pParent. *
2e6a0 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c  /.    insertCell
2e6b0 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e  (pParent, pParen
2e6c0 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65  t->nCell, pSpace
2e6d0 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70  , (int)(pOut-pSp
2e6e0 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ace),.          
2e6f0 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70       0, pPage->p
2e700 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  gno, &rc);..    
2e710 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74  /* Set the right
2e720 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
2e730 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69  f pParent to poi
2e740 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
2e750 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  ge. */.    put4b
2e760 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2e770 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2e780 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
2e790 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ew);.  .    /* R
2e7a0 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
2e7b0 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
2e7c0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c  page. */.    rel
2e7d0 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
2e7e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2e7f0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2e800 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
2e810 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30  ALANCE */..#if 0
2e820 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2e830 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  tion does not co
2e840 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e  ntribute anythin
2e850 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  g to the operati
2e860 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  on of SQLite..**
2e870 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73   it is sometimes
2e880 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f   activated tempo
2e890 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62  rarily while deb
2e8a0 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70  ugging code resp
2e8b0 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20  onsible .** for 
2e8c0 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d  setting pointer-
2e8d0 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  map entries..*/.
2e8e0 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
2e8f0 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50  pCheckPages(MemP
2e900 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e  age **apPage, in
2e910 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  t nPage){.  int 
2e920 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  i, j;.  for(i=0;
2e930 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a   i<nPage; i++){.
2e940 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20      Pgno n;.    
2e950 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  u8 e;.    MemPag
2e960 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67  e *pPage = apPag
2e970 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72  e[i];.    BtShar
2e980 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2e990 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
2e9a0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2e9b0 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  );..    for(j=0;
2e9c0 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   j<pPage->nCell;
2e9d0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c   j++){.      Cel
2e9e0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
2e9f0 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20    u8 *z;.     . 
2ea00 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c       z = findCel
2ea10 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20  l(pPage, j);.   
2ea20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
2ea30 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26  lPtr(pPage, z, &
2ea40 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  info);.      if(
2ea50 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
2ea60 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
2ea70 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
2ea80 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  &z[info.iOverflo
2ea90 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  w]);.        ptr
2eaa0 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c  mapGet(pBt, ovfl
2eab0 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
2eac0 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
2ead0 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
2eae0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
2eaf0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2eb00 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2eb10 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  af ){.        Pg
2eb20 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
2eb30 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  yte(z);.        
2eb40 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
2eb50 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
2eb60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2eb70 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2eb80 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
2eb90 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2eba0 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  }.    if( !pPage
2ebb0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2ebc0 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
2ebd0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2ebe0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2ebf0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20  fset+8]);.      
2ec00 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
2ec10 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
2ec20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2ec30 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2ec40 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
2ec50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2ec60 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2ec70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2ec80 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2ec90 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   copy the conten
2eca0 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ts of the b-tree
2ecb0 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a   node stored .**
2ecc0 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74   on page pFrom t
2ecd0 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  o page pTo. If p
2ece0 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f  age pFrom was no
2ecf0 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74  t a leaf page, t
2ed00 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  hen.** the point
2ed10 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
2ed20 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61  or each child pa
2ed30 67 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73  ge are updated s
2ed40 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  o that the.** pa
2ed50 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64  rent page stored
2ed60 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20   in the pointer 
2ed70 6d 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e  map is page pTo.
2ed80 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69   If pFrom contai
2ed90 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73  ned.** any cells
2eda0 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70   with overflow p
2edb0 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68  age pointers, th
2edc0 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
2edd0 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ding pointer.** 
2ede0 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20  map entries are 
2edf0 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20  also updated so 
2ee00 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20  that the parent 
2ee10 70 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f  page is page pTo
2ee20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
2ee30 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61   is currently ca
2ee40 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66  rrying any overf
2ee50 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69  low cells (entri
2ee60 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d  es in the.** Mem
2ee70 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72  Page.aOvfl[] arr
2ee80 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f  ay), they are no
2ee90 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e  t copied to pTo.
2eea0 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72   .**.** Before r
2eeb0 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70  eturning, page p
2eec0 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69  To is reinitiali
2eed0 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49  zed using btreeI
2eee0 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  nitPage()..**.**
2eef0 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   The performance
2ef00 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2ef10 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61  n is not critica
2ef20 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  l. It is only us
2ef30 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61  ed by .** the ba
2ef40 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
2ef50 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65  ) and balance_de
2ef60 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65  eper() procedure
2ef70 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a  s, neither of.**
2ef80 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65   which are calle
2ef90 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f  d often under no
2efa0 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63  rmal circumstanc
2efb0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
2efc0 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  id copyNodeConte
2efd0 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f  nt(MemPage *pFro
2efe0 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c  m, MemPage *pTo,
2eff0 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
2f000 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
2f010 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61  _OK ){.    BtSha
2f020 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20  red * const pBt 
2f030 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20  = pFrom->pBt;.  
2f040 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72    u8 * const aFr
2f050 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74  om = pFrom->aDat
2f060 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73  a;.    u8 * cons
2f070 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61  t aTo = pTo->aDa
2f080 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73  ta;.    int cons
2f090 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72  t iFromHdr = pFr
2f0a0 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  om->hdrOffset;. 
2f0b0 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f     int const iTo
2f0c0 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e  Hdr = ((pTo->pgn
2f0d0 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29  o==1) ? 100 : 0)
2f0e0 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
2f0f0 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a    int iData;.  .
2f100 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
2f110 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  From->isInit );.
2f120 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
2f130 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72  m->nFree>=iToHdr
2f140 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2f150 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
2f160 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42  iFromHdr+5])<=pB
2f170 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
2f180 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  .  .    /* Copy 
2f190 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20  the b-tree node 
2f1a0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67  content from pag
2f1b0 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
2f1c0 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74  pTo. */.    iDat
2f1d0 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 46  a = get2byte(&aF
2f1e0 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
2f1f0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54  ;.    memcpy(&aT
2f200 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d  o[iData], &aFrom
2f210 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73  [iData], pBt->us
2f220 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b  ableSize-iData);
2f230 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f  .    memcpy(&aTo
2f240 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d  [iToHdr], &aFrom
2f250 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f  [iFromHdr], pFro
2f260 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  m->cellOffset + 
2f270 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b  2*pFrom->nCell);
2f280 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69  .  .    /* Reini
2f290 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f  tialize page pTo
2f2a0 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
2f2b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d  tents of the Mem
2f2c0 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20  Page structure. 
2f2d0 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20     ** match the 
2f2e0 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e  new data. The in
2f2f0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
2f300 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79  pTo can actually
2f310 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20   fail under.    
2f320 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72  ** fairly obscur
2f330 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c  e circumstances,
2f340 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
2f350 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69  is a copy of ini
2f360 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
2f370 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20   page pFrom..   
2f380 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49   */.    pTo->isI
2f390 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  nit = 0;.    rc 
2f3a0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
2f3b0 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pTo);.    if( rc
2f3c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f3d0 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
2f3e0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2f3f0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
2f400 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2f410 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2f420 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2f430 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2f440 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20  .    ** for any 
2f450 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c  b-tree or overfl
2f460 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70 54  ow pages that pT
2f470 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74  o now contains t
2f480 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a  he pointers to..
2f490 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
2f4a0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2f4b0 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43       *pRC = setC
2f4c0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29  hildPtrmaps(pTo)
2f4d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2f4e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2f4f0 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
2f500 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61  cells on the iPa
2f510 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64  rentIdx'th child
2f520 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28   of pParent.** (
2f530 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20 70  hereafter "the p
2f540 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20  age") and up to 
2f550 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68  2 siblings so th
2f560 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
2f570 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73  e about the.** s
2f580 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
2f590 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c  ee space. Usuall
2f5a0 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69  y a single sibli
2f5b0 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  ng on either sid
2f5c0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  e of the.** page
2f5d0 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
2f5e0 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75   balancing, thou
2f5f0 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73  gh both siblings
2f600 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
2f610 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20   one.** side if 
2f620 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
2f630 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68  first or last ch
2f640 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
2f650 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 0a  t. If the page .
2f660 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68 61  ** has fewer tha
2f670 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f  n 2 siblings (so
2f680 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
2f690 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
2f6a0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   the page.** is 
2f6b0 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  a root page or a
2f6c0 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74   child of a root
2f6d0 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20   page) then all 
2f6e0 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
2f6f0 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74  gs.** participat
2f700 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
2f710 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  ng..**.** The nu
2f720 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73  mber of siblings
2f730 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69 67   of the page mig
2f740 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
2f750 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
2f760 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69  .** one or two i
2f770 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b  n an effort to k
2f780 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79  eep pages nearly
2f790 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76   full but not ov
2f7a0 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20  er full. .**.** 
2f7b0 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74  Note that when t
2f7c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2f7d0 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74  alled, some of t
2f7e0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  he cells on the 
2f7f0 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f  page.** might no
2f800 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74  t actually be st
2f810 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e  ored in MemPage.
2f820 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61  aData[]. This ca
2f830 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74  n happen.** if t
2f840 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  he page is overf
2f850 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ull. This routin
2f860 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 61  e ensures that a
2f870 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74  ll cells allocat
2f880 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  ed.** to the pag
2f890 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
2f8a0 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50  gs fit into MemP
2f8b0 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f  age.aData[] befo
2f8c0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
2f8d0 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
2f8e0 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
2f8f0 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
2f900 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20  siblings, cells 
2f910 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74  may be.** insert
2f920 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76  ed into or remov
2f930 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ed from the pare
2f940 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  nt page (pParent
2f950 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d  ). Doing so.** m
2f960 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61 72  ay cause the par
2f970 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f  ent page to beco
2f980 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
2f990 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69  nderfull. If thi
2f9a0 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74  s.** happens, it
2f9b0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
2f9c0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
2f9d0 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ller to invoke t
2f9e0 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61  he correct.** ba
2f9f0 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20  lancing routine 
2fa00 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f 62  to fix this prob
2fa10 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c  lem (see the bal
2fa20 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e  ance() routine).
2fa30 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20   .**.** If this 
2fa40 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
2fa50 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
2fa60 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
2fa70 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
2fa80 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
2fa90 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  e. So if this ro
2faa0 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
2fab0 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
2fac0 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
2fad0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68  ck..**.** The th
2fae0 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
2faf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
2fb00 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20  OvflSpace, is a 
2fb10 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20  pointer to a.** 
2fb20 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67  buffer big enoug
2fb30 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61  h to hold one pa
2fb40 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73  ge. If while ins
2fb50 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74  erting cells int
2fb60 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  o the parent.** 
2fb70 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 20 74  page (pParent) t
2fb80 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
2fb90 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
2fba0 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a   this buffer is.
2fbb0 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
2fbc0 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76   the parent's ov
2fbd0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65  erflow cells. Be
2fbe0 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
2fbf0 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61  ion inserts.** a
2fc00 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72   maximum of four
2fc10 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
2fc20 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
2fc30 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78  age, and the max
2fc40 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  imum.** size of 
2fc50 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69  a cell stored wi
2fc60 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  thin an internal
2fc70 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
2fc80 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a  less than 1/4.**
2fc90 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
2fca0 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  e, the aOvflSpac
2fcb0 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75  e[] buffer is gu
2fcc0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
2fcd0 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66  arge.** enough f
2fce0 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  or all overflow 
2fcf0 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cells..**.** If 
2fd00 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65  aOvflSpace is se
2fd10 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  t to a null poin
2fd20 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
2fd30 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
2fd40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
2fd50 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2fd60 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65  ce_nonroot(.  Me
2fd70 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fd90 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20   Parent page of 
2fda0 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62  siblings being b
2fdb0 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  alanced */.  int
2fdc0 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20   iParentIdx,    
2fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fde0 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61  Index of "the pa
2fdf0 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  ge" in pParent *
2fe00 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61  /.  u8 *aOvflSpa
2fe10 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
2fe20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65      /* page-size
2fe30 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2fe40 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20  for parent ovfl 
2fe50 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 20  */.  int isRoot 
2fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2fe80 70 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f  pParent is a roo
2fe90 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42  t-page */.){.  B
2fea0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
2feb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2fec0 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
2fed0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
2fee0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2fef0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ff00 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2ff10 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
2ff20 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
2ff30 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
2ff40 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
2ff50 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
2ff60 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   */.  int nNew =
2ff70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2ff80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ff90 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
2ffa0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
2ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ffd0 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
2ffe0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
2fff0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
30000 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
30010 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  ers */.  int nxD
30020 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
30030 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
30040 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
30050 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
30060 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
30070 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
30080 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
30090 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61  ode */.  u16 lea
300a0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
300b0 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
300c0 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
300d0 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
300e0 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
300f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
30100 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
30110 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
30120 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
30130 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
30140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
30150 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
30160 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
30170 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
30180 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
30190 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
301a0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
301b0 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
301c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
301d0 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
301e0 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
301f0 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
30200 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
30210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
30220 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
30230 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
30240 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65    int iOvflSpace
30250 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
30260 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
30270 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63  yte of aOvflSpac
30280 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  e[] */.  int szS
30290 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  cratch;         
302a0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
302b0 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
302c0 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d  requested */.  M
302d0 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
302e0 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
302f0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
30300 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
30310 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
30320 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
30330 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
30340 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
30350 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
30360 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
30370 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
30380 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
30390 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
303a0 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68  g */.  u8 *pRigh
303b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
303c0 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
303d0 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67  in parent of rig
303e0 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74  ht-sibling point
303f0 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  er */.  u8 *apDi
30400 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20  v[NB-1];        
30410 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
30420 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
30430 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
30440 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
30450 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
30460 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
30470 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
30480 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42  /.  int szNew[NB
30490 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
304a0 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a   /* Combined siz
304b0 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65  e of cells place
304c0 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
304d0 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
304e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
304f0 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
30500 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
30510 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
30520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30530 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
30540 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
30550 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  ll[] */.  u8 *aS
30560 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20  pace1;          
30570 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
30580 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
30590 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
305a0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
305b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
305c0 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74  * Temp var to st
305d0 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ore a page numbe
305e0 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d  r in */..  pBt =
305f0 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20   pParent->pBt;. 
30600 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30610 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
30620 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
30630 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
30640 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
30650 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
30660 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45  ;..#if 0.  TRACE
30670 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
30680 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
30690 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
306a0 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
306b0 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  pgno));.#endif..
306c0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
306d0 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68  nt pParent may h
306e0 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
306f0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41  overflow cell. A
30700 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20  nd if.  ** this 
30710 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
30720 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73   present, it mus
30730 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69  t be the cell wi
30740 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  th .  ** index i
30750 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20  ParentIdx. This 
30760 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61  scenario comes a
30770 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66  bout when this f
30780 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
30790 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74  called (indirect
307a0 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ly) from sqlite3
307b0 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20  BtreeDelete().. 
307c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
307d0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
307e0 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
307f0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
30800 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
30810 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
30820 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66  || pParent->aOvf
30830 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e  l[0].idx==iParen
30840 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21  tIdx );..  if( !
30850 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20  aOvflSpace ){.  
30860 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30870 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
30880 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e   Find the siblin
30890 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e  g pages to balan
308a0 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20  ce. Also locate 
308b0 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
308c0 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20  rent .  ** that 
308d0 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69  divide the sibli
308e0 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  ngs. An attempt 
308f0 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
30900 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a  NN siblings on .
30910 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65    ** either side
30920 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20   of pPage. More 
30930 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
30940 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
30950 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a  , however, .  **
30960 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65   if there are fe
30970 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c  wer than NN sibl
30980 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65  ings on the othe
30990 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65  r side. If pPare
309a0 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
309b0 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
309c0 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
309d0 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
309e0 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a  e taken.  .  **.
309f0 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
30a00 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69  lso drops the di
30a10 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
30a20 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
30a30 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c  . This.  ** way,
30a40 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
30a50 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
30a60 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
30a70 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20  deal with any.  
30a80 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ** overflow cell
30a90 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
30aa0 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61  page, since if a
30ab0 6e 79 20 65 78 69 73 74 65 64 20 74 68 65 79 20  ny existed they 
30ac0 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61  will.  ** have a
30ad0 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f  lready been remo
30ae0 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20  ved..  */.  i = 
30af0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
30b00 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43  ow + pParent->nC
30b10 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29  ell;.  if( i<2 )
30b20 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b  {.    nxDiv = 0;
30b30 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b  .    nOld = i+1;
30b40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f  .  }else{.    nO
30b50 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69 66 28 20  ld = 3;.    if( 
30b60 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b  iParentIdx==0 ){
30b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b80 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20   .      nxDiv = 
30b90 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
30ba0 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29   iParentIdx==i )
30bb0 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  {.      nxDiv = 
30bc0 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  i-2;.    }else{.
30bd0 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50        nxDiv = iP
30be0 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20  arentIdx-1;.    
30bf0 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d  }.    i = 2;.  }
30c00 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d  .  if( (i+nxDiv-
30c10 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
30c20 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  ow)==pParent->nC
30c30 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68  ell ){.    pRigh
30c40 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44  t = &pParent->aD
30c50 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
30c60 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c  Offset+8];.  }el
30c70 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d  se{.    pRight =
30c80 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
30c90 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
30ca0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
30cb0 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74    }.  pgno = get
30cc0 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20  4byte(pRight);. 
30cd0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
30ce0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
30cf0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
30d00 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  &apOld[i]);.    
30d10 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
30d20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
30d30 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65   (i+1)*sizeof(Me
30d40 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
30d50 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
30d60 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
30d70 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
30d80 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
30d90 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
30da0 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d  ow;.    if( (i--
30db0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  )==0 ) break;.. 
30dc0 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d     if( i+nxDiv==
30dd0 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
30de0 5d 2e 69 64 78 20 26 26 20 70 50 61 72 65 6e 74  ].idx && pParent
30df0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
30e00 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
30e10 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
30e20 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70  ].pCell;.      p
30e30 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
30e40 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
30e50 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
30e60 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
30e70 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
30e80 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
30e90 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  low = 0;.    }el
30ea0 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b  se{.      apDiv[
30eb0 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
30ec0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
30ed0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
30ee0 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d  w);.      pgno =
30ef0 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
30f00 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77  i]);.      szNew
30f10 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
30f20 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
30f30 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  [i]);..      /* 
30f40 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72  Drop the cell fr
30f50 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
30f60 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69  ge. apDiv[i] sti
30f70 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20  ll points to.   
30f80 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77     ** the cell w
30f90 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ithin the parent
30fa0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  , even though it
30fb0 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65   has been droppe
30fc0 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  d..      ** This
30fd0 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65   is safe because
30fe0 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c   dropping a cell
30ff0 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73   only overwrites
31000 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
31010 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
31020 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66  f it, and this f
31030 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
31040 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74 0a   need the first.
31050 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
31060 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  tes of the divid
31070 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20  er cell. So the 
31080 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65 20  pointer is safe 
31090 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  to use.      ** 
310a0 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20  later on.  .    
310b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
310c0 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73 20 63  less SQLite is c
310d0 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63 75 72  ompiled in secur
310e0 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
310f0 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20 20 20  n this case,.   
31100 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65     ** the dropCe
31110 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ll() routine wil
31120 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
31130 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68  entire cell with
31140 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a   zeroes..      *
31150 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
31160 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79  temporarily copy
31170 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74   the cell into t
31180 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a  he aOvflSpace[].
31190 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
311a0 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69   It will be copi
311b0 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20  ed out again as 
311c0 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61  soon as the aSpa
311d0 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20  ce[] buffer.    
311e0 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65    ** is allocate
311f0 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
31200 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65   pBt->secureDele
31210 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  te ){.        in
31220 74 20 69 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f  t iOff = SQLITE_
31230 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76  PTR_TO_INT(apDiv
31240 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50 54  [i]) - SQLITE_PT
31250 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74  R_TO_INT(pParent
31260 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
31270 20 20 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65    if( (iOff+szNe
31280 77 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74 2d 3e  w[i])>(int)pBt->
31290 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
312a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
312b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
312c0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  ;.          mems
312d0 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b  et(apOld, 0, (i+
312e0 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  1)*sizeof(MemPag
312f0 65 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e*));.          
31300 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
31310 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 65  anup;.        }e
31320 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
31330 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63  emcpy(&aOvflSpac
31340 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69  e[iOff], apDiv[i
31350 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20  ], szNew[i]);.  
31360 20 20 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d          apDiv[i]
31370 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61   = &aOvflSpace[a
31380 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d  pDiv[i]-pParent-
31390 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20 20 20 20  >aData];.       
313a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
313b0 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
313c0 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
313d0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73  nt->nOverflow, s
313e0 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  zNew[i], &rc);. 
313f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
31400 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20  ake nMaxCells a 
31410 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e  multiple of 4 in
31420 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72   order to preser
31430 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61  ve 8-byte.  ** a
31440 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d  lignment */.  nM
31450 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43  axCells = (nMaxC
31460 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20  ells + 3)&~3;.. 
31470 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
31480 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
31490 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20  ry structures.  
314a0 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61  */.  k = pBt->pa
314b0 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28  geSize + ROUND8(
314c0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
314d0 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a  ;.  szScratch =.
314e0 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73         nMaxCells
314f0 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20  *sizeof(u8*)    
31500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31510 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a     /* apCell */.
31520 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73       + nMaxCells
31530 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20  *sizeof(u16)    
31540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31550 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a     /* szCell */.
31560 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65       + pBt->page
31570 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
31580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31590 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f     /* aSpace1 */
315a0 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20  .     + k*nOld; 
315b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315d0 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69      /* Page copi
315e0 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20  es (apCopy) */. 
315f0 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65   apCell = sqlite
31600 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20  3ScratchMalloc( 
31610 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20  szScratch ); .  
31620 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b  if( apCell==0 ){
31630 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
31640 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
31650 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
31660 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d  ;.  }.  szCell =
31670 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e   (u16*)&apCell[n
31680 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70  MaxCells];.  aSp
31690 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43  ace1 = (u8*)&szC
316a0 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
316b0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
316c0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61  BYTE_ALIGNMENT(a
316d0 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a  Space1) );..  /*
316e0 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74  .  ** Load point
316f0 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73  ers to all cells
31700 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65   on sibling page
31710 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  s and the divide
31720 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
31730 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65  o the local apCe
31740 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b  ll[] array.  Mak
31750 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
31760 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
31770 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  ** into space ob
31780 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61  tained from aSpa
31790 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65  ce1[] and remove
317a0 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72   the the divider
317b0 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d   Cells.  ** from
317c0 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20   pParent..  **. 
317d0 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   ** If the sibli
317e0 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20  ngs are on leaf 
317f0 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
31800 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f  child pointers o
31810 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64  f the.  ** divid
31820 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72  er cells are str
31830 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  ipped from the c
31840 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79  ells before they
31850 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a   are copied.  **
31860 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e   into aSpace1[].
31870 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
31880 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
31890 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
318a0 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
318b0 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
318c0 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
318d0 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
318e0 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
318f0 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
31900 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
31910 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
31920 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
31930 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
31940 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
31950 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
31960 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
31970 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
31980 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
31990 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
319a0 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
319b0 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
319c0 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
319d0 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61  keys..  */.  lea
319e0 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70  fCorrection = ap
319f0 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a  Old[0]->leaf*4;.
31a00 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f    leafData = apO
31a10 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a  ld[0]->hasData;.
31a20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
31a30 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  d; i++){.    int
31a40 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20   limit;.    .   
31a50 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
31a60 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
31a70 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  take a copy of t
31a80 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c  he i'th original
31a90 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20   sibling.    ** 
31aa0 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  The rest of this
31ab0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75   function will u
31ac0 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  se data from the
31ad0 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20   copies rather. 
31ae0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f     ** that the o
31af0 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69  riginal pages si
31b00 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nce the original
31b10 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69   pages will be i
31b20 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f  n the.    ** pro
31b30 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76  cess of being ov
31b40 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20  erwritten.  */. 
31b50 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
31b60 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28   = apCopy[i] = (
31b70 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61 63 65  MemPage*)&aSpace
31b80 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  1[pBt->pageSize 
31b90 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63  + k*i];.    memc
31ba0 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69  py(pOld, apOld[i
31bb0 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  ], sizeof(MemPag
31bc0 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61  e));.    pOld->a
31bd0 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70  Data = (void*)&p
31be0 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  Old[1];.    memc
31bf0 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20  py(pOld->aData, 
31c00 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c  apOld[i]->aData,
31c10 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
31c20 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f  ..    limit = pO
31c30 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e  ld->nCell+pOld->
31c40 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66  nOverflow;.    f
31c50 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
31c60 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   j++){.      ass
31c70 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
31c80 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70  ells );.      ap
31c90 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
31ca0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
31cb0 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73  Old, j);.      s
31cc0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
31cd0 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
31ce0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
31cf0 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a  .      nCell++;.
31d00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
31d10 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44  nOld-1 && !leafD
31d20 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20  ata){.      u16 
31d30 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b  sz = (u16)szNew[
31d40 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  i];.      u8 *pT
31d50 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  emp;.      asser
31d60 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
31d70 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  ls );.      szCe
31d80 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a  ll[nCell] = sz;.
31d90 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
31da0 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b  Space1[iSpace1];
31db0 0a 20 20 20 20 20 20 69 53 70 61 63 65 31 20 2b  .      iSpace1 +
31dc0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
31dd0 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78  rt( sz<=pBt->max
31de0 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20  Local+23 );.    
31df0 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
31e00 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1<=pBt->pageSize
31e10 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
31e20 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
31e30 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43  , sz);.      apC
31e40 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65  ell[nCell] = pTe
31e50 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  mp+leafCorrectio
31e60 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
31e70 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
31e80 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63  =0 || leafCorrec
31e90 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
31ea0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
31eb0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d   szCell[nCell] -
31ec0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
31ed0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64  .      if( !pOld
31ee0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
31ef0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
31f00 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
31f10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
31f20 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  Old->hdrOffset==
31f30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
31f40 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65  The right pointe
31f50 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
31f60 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73  age pOld becomes
31f70 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20   the left.      
31f80 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
31f90 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
31fa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
31fb0 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
31fc0 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38  , &pOld->aData[8
31fd0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ], 4);.      }el
31fe0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
31ff0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
32000 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20  on==4 );.       
32010 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
32020 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
32030 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
32040 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c  w any cells smal
32050 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73  ler than 4 bytes
32060 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
32070 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34  zCell[nCell] = 4
32080 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32090 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b    }.      nCell+
320a0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
320b0 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
320c0 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
320d0 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
320e0 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
320f0 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
32100 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
32110 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
32120 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
32130 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
32140 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
32150 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
32160 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
32170 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
32180 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
32190 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
321a0 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
321b0 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
321c0 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
321d0 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
321e0 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
321f0 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
32200 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
32210 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
32220 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
32230 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
32240 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
32250 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
32260 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
32270 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
32280 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
32290 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
322a0 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
322b0 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
322c0 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
322d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
322e0 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
322f0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
32300 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
32310 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
32320 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
32330 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
32340 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
32350 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
32360 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
32370 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
32380 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
32390 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
323a0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
323b0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
323c0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
323d0 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
323e0 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
323f0 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
32400 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
32410 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
32420 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
32430 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
32440 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
32450 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
32460 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
32470 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
32480 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e  ++;.      if( k>
32490 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c  NB+1 ){ rc = SQL
324a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
324b0 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ; goto balance_c
324c0 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a  leanup; }.    }.
324d0 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
324e0 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
324f0 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
32500 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
32510 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
32520 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
32530 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
32540 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
32550 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
32560 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
32570 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
32580 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
32590 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
325a0 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
325b0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
325c0 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
325d0 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
325e0 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
325f0 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
32600 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
32610 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
32620 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
32630 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
32640 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
32650 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
32660 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
32670 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
32680 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
32690 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
326a0 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
326b0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
326c0 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
326d0 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
326e0 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
326f0 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
32700 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
32710 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
32720 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
32730 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
32740 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
32750 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
32760 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
32770 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
32780 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
32790 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
327a0 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
327b0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
327c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
327d0 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
327e0 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
327f0 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
32800 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
32810 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
32820 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
32830 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
32840 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
32850 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
32860 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
32870 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
32880 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
32890 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
328a0 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
328b0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
328c0 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69  Right==0 || szRi
328d0 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
328e0 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
328f0 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73  r]+2) ){.      s
32900 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c  zRight += szCell
32910 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  [d] + 2;.      s
32920 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b  zLeft -= szCell[
32930 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e  r] + 2;.      cn
32940 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20  tNew[i-1]--;.   
32950 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
32960 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20  1] - 1;.      d 
32970 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
32980 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ta;.    }.    sz
32990 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74  New[i] = szRight
329a0 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d  ;.    szNew[i-1]
329b0 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a   = szLeft;.  }..
329c0 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66    /* Either we f
329d0 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ound one or more
329e0 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30   cells (cntnew[0
329f0 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69  ])>0) or pPage i
32a00 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c  s.  ** a virtual
32a10 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76   root page.  A v
32a20 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
32a30 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61   is when the rea
32a40 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65  l root.  ** page
32a50 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77   is page 1 and w
32a60 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63  e are the only c
32a70 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67  hild of that pag
32a80 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
32a90 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c  ( cntNew[0]>0 ||
32aa0 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d   (pParent->pgno=
32ab0 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  =1 && pParent->n
32ac0 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 54  Cell==0) );..  T
32ad0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
32ae0 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 22  old: %d %d %d  "
32af0 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ,.    apOld[0]->
32b00 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e  pgno, .    nOld>
32b10 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70  =2 ? apOld[1]->p
32b20 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c  gno : 0,.    nOl
32b30 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d  d>=3 ? apOld[2]-
32b40 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a  >pgno : 0.  ));.
32b50 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
32b60 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e  ate k new pages.
32b70 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65    Reuse old page
32b80 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  s where possible
32b90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f  ..  */.  if( apO
32ba0 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29  ld[0]->pgno<=1 )
32bb0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
32bc0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
32bd0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
32be0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
32bf0 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c  pageFlags = apOl
32c00 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a  d[0]->aData[0];.
32c10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
32c20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
32c30 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28  e *pNew;.    if(
32c40 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20   i<nOld ){.     
32c50 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d   pNew = apNew[i]
32c60 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20   = apOld[i];.   
32c70 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
32c80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
32c90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
32ca0 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ew->pDbPage);.  
32cb0 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20      nNew++;.    
32cc0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
32cd0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
32ce0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32cf0 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
32d00 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
32d10 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
32d20 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c  t, &pNew, &pgno,
32d30 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20   pgno, 0);.     
32d40 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
32d50 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
32d60 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
32d70 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65   pNew;.      nNe
32d80 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  w++;..      /* S
32d90 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
32da0 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ap entry for the
32db0 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
32dc0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
32dd0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
32de0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
32df0 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e  t(pBt, pNew->pgn
32e00 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
32e10 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20   pParent->pgno, 
32e20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
32e30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
32e50 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
32e60 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
32e70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
32e80 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
32e90 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
32ea0 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
32eb0 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
32ec0 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
32ed0 29 7b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28  ){.    freePage(
32ee0 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a  apOld[i], &rc);.
32ef0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
32f00 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
32f10 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
32f20 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
32f30 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
32f40 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
32f50 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
32f60 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
32f70 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
32f80 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
32f90 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
32fa0 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
32fb0 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
32fc0 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
32fd0 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
32fe0 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
32ff0 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
33000 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
33010 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
33020 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
33030 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
33040 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
33050 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
33060 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
33070 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
33080 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
33090 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
330a0 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
330b0 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
330c0 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
330d0 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
330e0 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
330f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
33100 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
33110 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
33120 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
33130 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
33140 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
33150 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
33160 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
33170 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
33180 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
33190 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e  inV = apNew[i]->
331a0 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69  pgno;.    int mi
331b0 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28  nI = i;.    for(
331c0 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29  j=i+1; j<k; j++)
331d0 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65  {.      if( apNe
331e0 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69  w[j]->pgno<(unsi
331f0 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
33200 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
33210 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70         minV = ap
33220 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[j]->pgno;.  
33230 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
33240 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
33250 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b      MemPage *pT;
33260 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65  .      pT = apNe
33270 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  w[i];.      apNe
33280 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e  w[i] = apNew[min
33290 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  I];.      apNew[
332a0 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20  minI] = pT;.    
332b0 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  }.  }.  TRACE(("
332c0 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25  new: %d(%d) %d(%
332d0 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
332e0 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
332f0 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20  apNew[0]->pgno, 
33300 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e  szNew[0],.    nN
33310 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d  ew>=2 ? apNew[1]
33320 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
33330 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
33340 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
33350 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f  ? apNew[2]->pgno
33360 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20   : 0, nNew>=3 ? 
33370 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20  szNew[2] : 0,.  
33380 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65    nNew>=4 ? apNe
33390 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[3]->pgno : 0, 
333a0 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b  nNew>=4 ? szNew[
333b0 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  3] : 0,.    nNew
333c0 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e  >=5 ? apNew[4]->
333d0 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
333e0 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30  5 ? szNew[4] : 0
333f0 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ));..  assert( s
33400 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
33410 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
33420 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75  pDbPage) );.  pu
33430 74 34 62 79 74 65 28 70 52 69 67 68 74 2c 20 61  t4byte(pRight, a
33440 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67  pNew[nNew-1]->pg
33450 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  no);..  /*.  ** 
33460 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74  Evenly distribut
33470 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70  e the data in ap
33480 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68  Cell[] across th
33490 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  e new pages..  *
334a0 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72  * Insert divider
334b0 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72   cells into pPar
334c0 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79  ent as necessary
334d0 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a  ..  */.  j = 0;.
334e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
334f0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  w; i++){.    /* 
33500 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77  Assemble the new
33510 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
33520 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
33530 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a  New = apNew[i];.
33540 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
33550 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a  axCells );.    z
33560 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61  eroPage(pNew, pa
33570 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73  geFlags);.    as
33580 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
33590 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
335a0 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
335b0 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
335c0 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
335d0 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
335e0 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
335f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
33600 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
33610 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e  );..    j = cntN
33620 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
33630 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
33640 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
33650 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
33660 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
33670 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
33680 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
33690 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
336a0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
336b0 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d   assert( i<nNew-
336c0 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  1 || j==nCell );
336d0 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c  .    if( j<nCell
336e0 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   ){.      u8 *pC
336f0 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  ell;.      u8 *p
33700 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Temp;.      int 
33710 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  sz;..      asser
33720 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
33730 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
33740 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  apCell[j];.     
33750 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20   sz = szCell[j] 
33760 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
33770 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
33780 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66  &aOvflSpace[iOvf
33790 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69  lSpace];.      i
337a0 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29  f( !pNew->leaf )
337b0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
337c0 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d  (&pNew->aData[8]
337d0 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  , pCell, 4);.   
337e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
337f0 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
33800 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20   /* If the tree 
33810 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  is a leaf-data t
33820 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62  ree, and the sib
33830 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73  lings are leaves
33840 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
33850 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  en there is no d
33860 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61  ivider cell in a
33870 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64  pCell[]. Instead
33880 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20  , the divider . 
33890 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63         ** cell c
338a0 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69  onsists of the i
338b0 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
338c0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  he right-most ce
338d0 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a  ll of .        *
338e0 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61  * the sibling-pa
338f0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
33900 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20  ve only..       
33910 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   */.        Cell
33920 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
33930 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
33940 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
33950 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a  r(pNew, apCell[j
33960 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ], &info);.     
33970 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
33980 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34  ;.        sz = 4
33990 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43   + putVarint(&pC
339a0 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65  ell[4], info.nKe
339b0 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  y);.        pTem
339c0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
339d0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
339e0 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
339f0 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
33a00 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
33a10 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
33a20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
33a30 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
33a40 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
33a50 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
33a60 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20  nd its reported 
33a70 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
33a80 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
33a90 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
33aa0 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
33ab0 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
33ac0 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72  ** (see btreePar
33ad0 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62  seCellPtr(), 4 b
33ae0 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69  ytes is the mini
33af0 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  mum size of.    
33b00 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29      ** any cell)
33b10 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f  . But it is impo
33b20 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68  rtant to pass th
33b30 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74  e correct size t
33b40 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  o .        ** in
33b50 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72  sertCell(), so r
33b60 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20  eparse the cell 
33b70 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  now..        **.
33b80 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
33b90 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65  that this can ne
33ba0 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e  ver happen in an
33bb0 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c   SQLite data fil
33bc0 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20  e, as all.      
33bd0 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61    ** cells are a
33be0 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e  t least 4 bytes.
33bf0 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73   It only happens
33c00 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64   in b-trees used
33c10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65  .        ** to e
33c20 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c  valuate "IN (SEL
33c30 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69  ECT ...)" and si
33c40 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20  milar clauses.. 
33c50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
33c60 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d    if( szCell[j]=
33c70 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
33c80 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65  assert(leafCorre
33c90 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20  ction==4);.     
33ca0 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
33cb0 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70  zePtr(pParent, p
33cc0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cell);.        }
33cd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33ce0 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b  OvflSpace += sz;
33cf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
33d00 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  z<=pBt->maxLocal
33d10 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  +23 );.      ass
33d20 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 3c  ert( iOvflSpace<
33d30 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
33d40 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65  ;.      insertCe
33d50 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
33d60 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
33d70 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  emp, pNew->pgno,
33d80 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
33d90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33da0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
33db0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
33dc0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
33dd0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
33de0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
33df0 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ;..      j++;.  
33e00 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
33e10 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
33e20 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
33e30 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
33e40 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
33e50 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
33e60 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
33e70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
33e80 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
33e90 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
33ea0 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
33eb0 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
33ec0 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
33ed0 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   4);.  }..  if( 
33ee0 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e  isRoot && pParen
33ef0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  t->nCell==0 && p
33f00 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
33f10 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t<=apNew[0]->nFr
33f20 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ee ){.    /* The
33f30 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
33f40 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e  e b-tree now con
33f50 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
33f60 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67  The only sibling
33f70 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20  .    ** page is 
33f80 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
33f90 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43  of the parent. C
33fa0 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
33fb0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
33fc0 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74  hild page into t
33fd0 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65  he parent, decre
33fe0 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c  asing the overal
33ff0 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a  l height of the.
34000 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74      ** b-tree st
34010 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20  ructure by one. 
34020 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65  This is describe
34030 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63  d as the "balanc
34040 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20  e-shallower".   
34050 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68   ** sub-algorith
34060 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65  m in some docume
34070 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a  ntation..    **.
34080 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
34090 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
340a0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
340b0 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43  all to copyNodeC
340c0 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a  ontent() .    **
340d0 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65   sets all pointe
340e0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
340f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64  rresponding to d
34100 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61  atabase image pa
34110 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ges .    ** for 
34120 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65  which the pointe
34130 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68  r is stored with
34140 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62  in the content b
34150 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20  eing copied..   
34160 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
34170 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c  econd assert bel
34180 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74  ow verifies that
34190 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
341a0 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a  is defragmented.
341b0 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20      ** (it must 
341c0 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75  be, as it was ju
341d0 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64  st reconstructed
341e0 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50   using assembleP
341f0 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20  age()). This.   
34200 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   ** is important
34210 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   if the parent p
34220 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
34230 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  e page 1 of the 
34240 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
34250 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61  image.  */.    a
34260 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29  ssert( nNew==1 )
34270 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
34280 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d  New[0]->nFree ==
34290 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62   .        (get2b
342a0 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61  yte(&apNew[0]->a
342b0 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30  Data[5])-apNew[0
342c0 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70  ]->cellOffset-ap
342d0 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29  New[0]->nCell*2)
342e0 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70   .    );.    cop
342f0 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e  yNodeContent(apN
34300 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20  ew[0], pParent, 
34310 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61  &rc);.    freePa
34320 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63  ge(apNew[0], &rc
34330 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49  );.  }else if( I
34340 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
34350 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f     /* Fix the po
34360 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
34370 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65  s for all the ce
34380 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68  lls that were sh
34390 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20  ifted around. . 
343a0 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
343b0 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
343c0 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74  t types of point
343d0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74  er-map entries t
343e0 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  hat need to.    
343f0 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
34400 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
34410 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  . Some of these 
34420 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c  have been set al
34430 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a  ready, but.    *
34440 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e  * many have not.
34450 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
34460 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20  s a summary:.   
34470 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20   **.    **   1) 
34480 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f  The entries asso
34490 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20  ciated with new 
344a0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68  sibling pages th
344b0 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20  at were not.    
344c0 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73  **      siblings
344d0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
344e0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  ion was called. 
344f0 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61  These have alrea
34500 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  dy.    **      b
34510 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27  een set. We don'
34520 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20  t need to worry 
34530 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e  about old siblin
34540 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20  gs that were.   
34550 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74   **      moved t
34560 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
34570 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29  - the freePage()
34580 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20   code has taken 
34590 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  care.    **     
345a0 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a   of those..    *
345b0 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68  *.    **   2) Th
345c0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
345d0 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
345e0 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
345f0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20  overflow.    ** 
34600 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79       page in any
34610 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73   overflow chains
34620 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76   used by new div
34630 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73  ider cells. Thes
34640 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68  e .    **      h
34650 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79  ave also already
34660 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65   been taken care
34670 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72   of by the inser
34680 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20  tCell() code..  
34690 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29    **.    **   3)
346a0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
346b0 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
346c0 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  aves, then the c
346d0 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20  hild pages of.  
346e0 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20    **      cells 
346f0 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69  stored on the si
34700 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20  bling pages may 
34710 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
34720 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
34730 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69  *   4) If the si
34740 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
34750 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74  not internal int
34760 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20  key nodes, then 
34770 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  any.    **      
34780 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75  overflow pages u
34790 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c  sed by these cel
347a0 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  ls may need to b
347b0 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a  e updated.    **
347c0 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20        (internal 
347d0 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76  intkey nodes nev
347e0 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  er contain point
347f0 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  ers to overflow 
34800 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20  pages)..    **. 
34810 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68     **   5) If th
34820 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
34830 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
34840 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  then the pointer
34850 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20  -map.    **     
34860 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
34870 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67   right-child pag
34880 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69  es of each sibli
34890 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  ng may need.    
348a0 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70  **      to be up
348b0 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
348c0 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64    ** Cases 1 and
348d0 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74   2 are dealt wit
348e0 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72  h above by other
348f0 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a   code. The next.
34900 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61      ** block dea
34910 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20  ls with cases 3 
34920 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e  and 4 and the on
34930 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61  e after that, ca
34940 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20  se 5. Since.    
34950 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69  ** setting a poi
34960 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69  nter map entry i
34970 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65  s a relatively e
34980 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
34990 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  on, this.    ** 
349a0 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70  code only sets p
349b0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
349c0 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20  es for child or 
349d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
349e0 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20  hat have.    ** 
349f0 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62  actually moved b
34a00 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a  etween pages.  *
34a10 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
34a20 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a  New = apNew[0];.
34a30 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
34a40 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20  d = apCopy[0];. 
34a50 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77     int nOverflow
34a60 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
34a70 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78  ow;.    int iNex
34a80 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  tOld = pOld->nCe
34a90 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a  ll + nOverflow;.
34aa0 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f      int iOverflo
34ab0 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f  w = (nOverflow ?
34ac0 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
34ad0 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a  idx : -1);.    j
34ae0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
34af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b00 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c    /* Current 'ol
34b10 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  d' sibling page 
34b20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20  */.    k = 0;   
34b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
34b50 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69  rent 'new' sibli
34b60 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66  ng page */.    f
34b70 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
34b80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
34b90 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a   isDivider = 0;.
34ba0 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d        while( i==
34bb0 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20  iNextOld ){.    
34bc0 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
34bd0 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
34be0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
34bf0 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
34c00 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   old.        ** 
34c10 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20  sibling page j. 
34c20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
34c30 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
34c40 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
34c50 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
34c60 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77  e, then cell i w
34c70 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  as a divider cel
34c80 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f  l. */.        pO
34c90 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d  ld = apCopy[++j]
34ca0 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f  ;.        iNextO
34cb0 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61  ld = i + !leafDa
34cc0 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ta + pOld->nCell
34cd0 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   + pOld->nOverfl
34ce0 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
34cf0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  pOld->nOverflow 
34d00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76  ){.          nOv
34d10 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e  erflow = pOld->n
34d20 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20  Overflow;.      
34d30 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20      iOverflow = 
34d40 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
34d50 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
34d60 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dx;.        }.  
34d70 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20        isDivider 
34d80 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20  = !leafData;  . 
34d90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
34da0 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30  sert(nOverflow>0
34db0 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20   || iOverflow<i 
34dc0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
34dd0 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70  nOverflow<2 || p
34de0 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
34df0 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31  x==pOld->aOvfl[1
34e00 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20  ].idx-1);.      
34e10 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
34e20 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66  <3 || pOld->aOvf
34e30 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e  l[1].idx==pOld->
34e40 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b  aOvfl[2].idx-1);
34e50 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f  .      if( i==iO
34e60 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
34e70 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 31     isDivider = 1
34e80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 2d  ;.        if( (-
34e90 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b  -nOverflow)>0 ){
34ea0 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72  .          iOver
34eb0 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20  flow++;.        
34ec0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
34ed0 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b   if( i==cntNew[k
34ee0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
34ef0 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
34f00 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
34f10 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
34f20 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20  t cell on new.  
34f30 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
34f40 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20   page k. If the 
34f50 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
34f60 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
34f70 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
34f80 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
34f90 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76   cell i is a div
34fa0 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20  ider cell.  */. 
34fb0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70         pNew = ap
34fc0 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20  New[++k];.      
34fd0 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61 20    if( !leafData 
34fe0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
34ff0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
35000 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20  ( j<nOld );.    
35010 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77    assert( k<nNew
35020 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
35030 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72   the cell was or
35040 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72  iginally divider
35050 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f   cell (and is no
35060 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20  t now) or.      
35070 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ** an overflow c
35080 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ell, or if the c
35090 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20  ell was located 
350a0 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  on a different s
350b0 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ibling.      ** 
350c0 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20  page before the 
350d0 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20  balancing, then 
350e0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
350f0 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
35100 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  ed.      ** with
35110 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76   any child or ov
35120 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65  erflow pages nee
35130 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
35140 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
35150 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64  sDivider || pOld
35160 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
35170 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  no ){.        if
35180 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ( !leafCorrectio
35190 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  n ){.          p
351a0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65  trmapPut(pBt, ge
351b0 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d  t4byte(apCell[i]
351c0 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
351d0 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63   pNew->pgno, &rc
351e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
351f0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
35200 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61  i]>pNew->minLoca
35210 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
35220 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
35230 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  pNew, apCell[i],
35240 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d   &rc);.        }
35250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
35260 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72      if( !leafCor
35270 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  rection ){.     
35280 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
35290 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
352a0 75 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62 79  u32 key = get4by
352b0 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44  te(&apNew[i]->aD
352c0 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
352d0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
352e0 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  key, PTRMAP_BTRE
352f0 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e  E, apNew[i]->pgn
35300 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  o, &rc);.      }
35310 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  .    }..#if 0.  
35320 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43    /* The ptrmapC
35330 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74  heckPages() cont
35340 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73 74  ains assert() st
35350 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65  atements that ve
35360 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a  rify that.    **
35370 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70   all pointer map
35380 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20 63   pages are set c
35390 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69  orrectly. This i
353a0 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20  s helpful while 
353b0 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e  .    ** debuggin
353c0 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  g. This is usual
353d0 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63 61  ly disabled beca
353e0 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64 61  use a corrupt da
353f0 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a  tabase may.    *
35400 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65 72  * cause an asser
35410 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  t() statement to
35420 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70   fail.  */.    p
35430 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
35440 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20  apNew, nNew);.  
35450 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67    ptrmapCheckPag
35460 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b  es(&pParent, 1);
35470 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61  .#endif.  }..  a
35480 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
35490 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43  isInit );.  TRAC
354a0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
354b0 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65  ished: old=%d ne
354c0 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22  w=%d cells=%d\n"
354d0 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64  ,.          nOld
354e0 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b  , nNew, nCell));
354f0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61  ..  /*.  ** Clea
35500 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
35510 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
35520 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
35530 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
35540 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28  (apCell);.  for(
35550 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
35560 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
35570 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
35580 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
35590 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  New; i++){.    r
355a0 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77  eleasePage(apNew
355b0 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  [i]);.  }..  ret
355c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
355d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
355e0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
355f0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
35600 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  a b-tree structu
35610 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c  re is.** overful
35620 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  l (has one or mo
35630 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
35640 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  s)..**.** A new 
35650 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c  child page is al
35660 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
35670 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
35680 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20  current root.** 
35690 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  page, including 
356a0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20  overflow cells, 
356b0 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  are copied into 
356c0 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72  the child. The r
356d0 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74  oot.** page is t
356e0 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20  hen overwritten 
356f0 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d  to make it an em
35700 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68  pty page with th
35710 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a  e right-child .*
35720 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  * pointer pointi
35730 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ng to the new pa
35740 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ge..**.** Before
35750 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20   returning, all 
35760 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
35770 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ies correspondin
35780 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74  g to pages .** t
35790 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c  hat the new chil
357a0 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61  d-page now conta
357b0 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
357c0 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65  are updated. The
357d0 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73  .** entry corres
357e0 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e  ponding to the n
357f0 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  ew right-child p
35800 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f  ointer of the ro
35810 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c  ot.** page is al
35820 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  so updated..**.*
35830 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
35840 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74   *ppChild is set
35850 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65   to contain a re
35860 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
35870 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e  hild .** page an
35880 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
35890 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
358a0 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72   case the caller
358b0 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20   is required.** 
358c0 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
358d0 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c  age() on *ppChil
358e0 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20  d exactly once. 
358f0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
35900 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  rs,.** an error 
35910 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
35920 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73   and *ppChild is
35930 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74   set to 0..*/.st
35940 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
35950 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
35960 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20  *pRoot, MemPage 
35970 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e  **ppChild){.  in
35980 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
35990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
359a0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
359b0 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
359c0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
359d0 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20  hild = 0;       
359e0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
359f0 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
35a00 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
35a10 6f 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20  oChild = 0;     
35a20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
35a30 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
35a40 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
35a50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
35a60 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20   pRoot->pBt;    
35a70 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a  /* The BTree */.
35a80 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
35a90 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b  ->nOverflow>0 );
35aa0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35ab0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
35ac0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
35ad0 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74  /* Make pRoot, t
35ae0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
35af0 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74  the b-tree, writ
35b00 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61  able. Allocate a
35b10 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20   new .  ** page 
35b20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
35b30 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63   the new right-c
35b40 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43  hild of pPage. C
35b50 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
35b60 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64  .  ** of the nod
35b70 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f  e stored on pRoo
35b80 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63  t into the new c
35b90 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  hild page..  */.
35ba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35bb0 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
35bc0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
35bd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35be0 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
35bf0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
35c00 26 70 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69  &pChild,&pgnoChi
35c10 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30  ld,pRoot->pgno,0
35c20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43  );.    copyNodeC
35c30 6f 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43  ontent(pRoot, pC
35c40 68 69 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20  hild, &rc);.    
35c50 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
35c60 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
35c70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 43 68 69  Put(pBt, pgnoChi
35c80 6c 64 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ld, PTRMAP_BTREE
35c90 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26  , pRoot->pgno, &
35ca0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
35cb0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
35cc0 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20  ppChild = 0;.   
35cd0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
35ce0 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
35cf0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
35d00 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
35d10 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c  swriteable(pChil
35d20 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  d->pDbPage) );. 
35d30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
35d40 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
35d50 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
35d60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
35d70 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f  hild->nCell==pRo
35d80 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ot->nCell );..  
35d90 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
35da0 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e   copy root %d in
35db0 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d  to %d\n", pRoot-
35dc0 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70  >pgno, pChild->p
35dd0 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70  gno));..  /* Cop
35de0 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  y the overflow c
35df0 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20  ells from pRoot 
35e00 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d  to pChild */.  m
35e10 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f  emcpy(pChild->aO
35e20 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66  vfl, pRoot->aOvf
35e30 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66  l, pRoot->nOverf
35e40 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74  low*sizeof(pRoot
35e50 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20  ->aOvfl[0]));.  
35e60 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
35e70 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72  w = pRoot->nOver
35e80 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f  flow;..  /* Zero
35e90 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
35ea0 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73   pRoot. Then ins
35eb0 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74  tall pChild as t
35ec0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20  he right-child. 
35ed0 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  */.  zeroPage(pR
35ee0 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  oot, pChild->aDa
35ef0 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41  ta[0] & ~PTF_LEA
35f00 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  F);.  put4byte(&
35f10 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
35f20 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
35f30 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20  , pgnoChild);.. 
35f40 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69   *ppChild = pChi
35f50 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ld;.  return SQL
35f60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
35f70 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70   The page that p
35f80 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  Cur currently po
35f90 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74  ints to has just
35fa0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69   been modified i
35fb0 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54  n.** some way. T
35fc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67  his function fig
35fd0 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73  ures out if this
35fe0 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65   modification me
35ff0 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20  ans the.** tree 
36000 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61  needs to be bala
36010 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20  nced, and if so 
36020 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70  calls the approp
36030 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20  riate balancing 
36040 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c  .** routine. Bal
36050 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  ancing routines 
36060 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c  are:.**.**   bal
36070 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20  ance_quick().** 
36080 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72    balance_deeper
36090 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  ().**   balance_
360a0 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61  nonroot().*/.sta
360b0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
360c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
360d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
360e0 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69  TE_OK;.  const i
360f0 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e  nt nMin = pCur->
36100 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
36110 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42  * 2 / 3;.  u8 aB
36120 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
36130 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65  [13];.  u8 *pFre
36140 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e  e = 0;..  TESTON
36150 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  LY( int balance_
36160 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30  quick_called = 0
36170 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20   );.  TESTONLY( 
36180 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
36190 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b  er_called = 0 );
361a0 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74  ..  do {.    int
361b0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
361c0 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  Page;.    MemPag
361d0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
361e0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a  >apPage[iPage];.
361f0 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d  .    if( iPage==
36200 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
36210 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
36220 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
36230 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
36240 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65  he b-tree is ove
36250 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63  rfull. In this c
36260 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20  ase call the.   
36270 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f       ** balance_
36280 64 65 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f  deeper() functio
36290 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  n to create a ne
362a0 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20  w child for the 
362b0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
362c0 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68    ** and copy th
362d0 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
362e0 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ts of the root-p
362f0 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20  age to it. The. 
36300 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69         ** next i
36310 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
36320 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c  do-loop will bal
36330 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20 70  ance the child p
36340 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20  age..        */ 
36350 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36360 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72   (balance_deeper
36370 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b  _called++)==0 );
36380 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61  .        rc = ba
36390 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61  lance_deeper(pPa
363a0 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ge, &pCur->apPag
363b0 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  e[1]);.        i
363c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
363d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
363e0 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20  ur->iPage = 1;. 
363f0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
36400 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  iIdx[0] = 0;.   
36410 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
36420 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  dx[1] = 0;.     
36430 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
36440 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f  r->apPage[1]->nO
36450 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20  verflow );.     
36460 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
36470 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
36480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
36490 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  se if( pPage->nO
364a0 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50  verflow==0 && pP
364b0 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e  age->nFree<=nMin
364c0 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
364d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
364e0 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73    MemPage * cons
364f0 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72  t pParent = pCur
36500 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31  ->apPage[iPage-1
36510 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e  ];.      int con
36520 73 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e  st iIdx = pCur->
36530 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a  aiIdx[iPage-1];.
36540 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
36550 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
36560 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
36570 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
36580 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e  QLITE_OK ){.#ifn
36590 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
365a0 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20  QUICKBALANCE.   
365b0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
365c0 68 61 73 44 61 74 61 0a 20 20 20 20 20 20 20 20  hasData.        
365d0 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
365e0 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20  flow==1.        
365f0 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c   && pPage->aOvfl
36600 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e  [0].idx==pPage->
36610 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26  nCell.         &
36620 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21  & pParent->pgno!
36630 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =1.         && p
36640 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69  Parent->nCell==i
36650 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  Idx.        ){. 
36660 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c           /* Call
36670 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
36680 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
36690 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67   sibling of pPag
366a0 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20  e on which.     
366b0 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65       ** to store
366c0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
366d0 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  ll. balance_quic
366e0 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65  k() inserts a ne
366f0 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  w cell.         
36700 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74   ** into pParent
36710 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73  , which may caus
36720 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c  e pParent overfl
36730 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20  ow. If this.    
36740 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73        ** happens
36750 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72  , the next inter
36760 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
36770 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63  loop will balanc
36780 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20  e pParent .     
36790 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68       ** use eith
367a0 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  er balance_nonro
367b0 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f  ot() or balance_
367c0 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20  deeper(). Until 
367d0 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
367e0 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f  * happens, the o
367f0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
36800 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42  stored in the aB
36810 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
36820 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  [].          ** 
36830 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20  buffer. .       
36840 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
36850 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  ** The purpose o
36860 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
36870 61 73 73 65 72 74 28 29 20 69 73 20 74 6f 20 63  assert() is to c
36880 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61  heck that only a
36890 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
368a0 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c  ngle call to bal
368b0 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
368c0 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20 63 61  made for each ca
368d0 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20  ll to this.     
368e0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
368f0 2e 20 49 66 20 74 68 69 73 20 77 65 72 65 20 6e  . If this were n
36900 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61 20 73  ot verified, a s
36910 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76  ubtle bug involv
36920 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20 20  ing reuse.      
36930 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42      ** of the aB
36940 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
36950 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69  [] might sneak i
36960 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  n..          */.
36970 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
36980 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  ( (balance_quick
36990 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b  _called++)==0 );
369a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
369b0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50  balance_quick(pP
369c0 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42  arent, pPage, aB
369d0 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
369e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
369f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
36a00 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
36a10 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c  n this case, cal
36a20 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  l balance_nonroo
36a30 74 28 29 20 74 6f 20 72 65 64 69 73 74 72 69 62  t() to redistrib
36a40 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20  ute cells.      
36a50 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70      ** between p
36a60 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32  Page and up to 2
36a70 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20   of its sibling 
36a80 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f  pages. This invo
36a90 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  lves.          *
36aa0 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  * modifying the 
36ab0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72  contents of pPar
36ac0 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63  ent, which may c
36ad0 61 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a  ause pParent to.
36ae0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
36af0 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
36b00 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e  underfull. The n
36b10 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
36b20 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20   the do-loop.   
36b30 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62         ** will b
36b40 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
36b50 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63  t page to correc
36b60 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20  t this..        
36b70 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20    ** .          
36b80 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e 74  ** If the parent
36b90 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76   page becomes ov
36ba0 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72  erfull, the over
36bb0 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c  flow cell or cel
36bc0 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ls.          ** 
36bd0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
36be0 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
36bf0 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69  allocated immedi
36c00 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20  ately below. .  
36c10 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62          ** A sub
36c20 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f  sequent iteratio
36c30 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
36c40 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20   will deal with 
36c50 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20  this by.        
36c60 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c    ** calling bal
36c70 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28  ance_nonroot() (
36c80 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
36c90 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
36ca0 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  irst,.          
36cb0 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27  ** but it doesn'
36cc0 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72  t deal with over
36cd0 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73  flow cells - jus
36ce0 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20  t moves them to 
36cf0 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  a.          ** d
36d00 69 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20  ifferent page). 
36d10 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73 65 71  Once this subseq
36d20 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c  uent call to bal
36d30 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a  ance_nonroot() .
36d40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73            ** has
36d50 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69   completed, it i
36d60 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73  s safe to releas
36d70 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  e the pSpace buf
36d80 66 65 72 20 75 73 65 64 20 62 79 0a 20 20 20 20  fer used by.    
36d90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65        ** the pre
36da0 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74  vious call, as t
36db0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
36dc0 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20   data will have 
36dd0 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20  been .          
36de0 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65 72  ** copied either
36df0 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
36e00 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
36e10 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65  e or into the ne
36e20 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  w.          ** p
36e30 53 70 61 63 65 20 62 75 66 66 65 72 20 70 61 73  Space buffer pas
36e40 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65  sed to the latte
36e50 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  r call to balanc
36e60 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20  e_nonroot()..   
36e70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
36e80 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d      u8 *pSpace =
36e90 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
36ea0 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61  oc(pCur->pBt->pa
36eb0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
36ec0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
36ed0 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c  nonroot(pParent,
36ee0 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69   iIdx, pSpace, i
36ef0 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20  Page==1);.      
36f00 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b      if( pFree ){
36f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
36f20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20  If pFree is not 
36f30 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20  NULL, it points 
36f40 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75  to the pSpace bu
36f50 66 66 65 72 20 75 73 65 64 20 0a 20 20 20 20 20  ffer used .     
36f60 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70         ** by a p
36f70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20  revious call to 
36f80 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
36f90 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20  ). Its contents 
36fa0 61 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  are.            
36fb0 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69  ** now stored ei
36fc0 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74  ther on real dat
36fd0 61 62 61 73 65 20 70 61 67 65 73 20 6f 72 20 77  abase pages or w
36fe0 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20  ithin the .     
36ff0 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53         ** new pS
37000 70 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20  pace buffer, so 
37010 69 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79  it may be safely
37020 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a   freed here. */.
37030 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
37040 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65  te3PageFree(pFre
37050 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
37060 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
37070 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
37080 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66  will be freed af
37090 74 65 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c  ter the next cal
370a0 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  l to.          *
370b0 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  * balance_nonroo
370c0 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66  t(), or just bef
370d0 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
370e0 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68  n returns, which
370f0 65 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ever.          *
37100 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a  * comes first. *
37110 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 65  /.          pFre
37120 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20  e = pSpace;.    
37130 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
37140 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
37150 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20  rflow = 0;..    
37160 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74    /* The next it
37170 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
37180 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20  o-loop balances 
37190 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
371a0 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
371b0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
371c0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d      pCur->iPage-
371d0 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  -;.    }.  }whil
371e0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
371f0 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65   );..  if( pFree
37200 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
37210 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a  ageFree(pFree);.
37220 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37230 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  .}.../*.** Inser
37240 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
37250 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20  nto the BTree.  
37260 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e  The key is given
37270 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a   by (pKey,nKey).
37280 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20  ** and the data 
37290 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61  is given by (pDa
372a0 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20  ta,nData).  The 
372b0 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f  cursor is used o
372c0 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65  nly to.** define
372d0 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20   what table the 
372e0 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65  record should be
372f0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20   inserted into. 
37300 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
37310 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
37320 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
37330 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tion..**.** For 
37340 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c  an INTKEY table,
37350 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76   only the nKey v
37360 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20  alue of the key 
37370 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69  is used.  pKey i
37380 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46  s.** ignored.  F
37390 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61  or a ZERODATA ta
373a0 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61  ble, the pData a
373b0 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74  nd nData are bot
373c0 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  h ignored..**.**
373d0 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75   If the seekResu
373e0 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  lt parameter is 
373f0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
37400 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c   successful call
37410 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70   to.** MovetoUnp
37420 61 63 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20  acked() to seek 
37430 63 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28  cursor pCur to (
37440 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20  pKey, nKey) has 
37450 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
37460 70 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52  performed. seekR
37470 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 65 61  esult is the sea
37480 72 63 68 20 72 65 73 75 6c 74 20 72 65 74 75 72  rch result retur
37490 6e 65 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a  ned (a negative.
374a0 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75  ** number if pCu
374b0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65  r points at an e
374c0 6e 74 72 79 20 74 68 61 74 20 69 73 20 73 6d 61  ntry that is sma
374d0 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c  ller than (pKey,
374e0 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20   nKey), or.** a 
374f0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
37500 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  f pCur points at
37510 20 61 6e 20 65 74 72 79 20 74 68 61 74 20 69 73   an etry that is
37520 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a   larger than .**
37530 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20   (pKey, nKey)). 
37540 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
37550 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74  ekResult paramet
37560 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
37570 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
37580 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a  guarantees that.
37590 2a 2a 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  ** cursor pCur i
375a0 73 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  s pointing at th
375b0 65 20 65 78 69 73 74 69 6e 67 20 63 6f 70 79 20  e existing copy 
375c0 6f 66 20 61 20 72 6f 77 20 74 68 61 74 20 69 73  of a row that is
375d0 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72   to be.** overwr
375e0 69 74 74 65 6e 2e 20 20 49 66 20 74 68 65 20 73  itten.  If the s
375f0 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65  eekResult parame
37600 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 63  ter is 0, then c
37610 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79 0a 2a  ursor pCur may.*
37620 2a 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 65  * point to any e
37630 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e  ntry or to no en
37640 74 72 79 20 61 74 20 61 6c 6c 20 61 6e 64 20 73  try at all and s
37650 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
37660 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74  has to seek.** t
37670 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65  he cursor before
37680 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e   the new key can
37690 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
376a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
376b0 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72  eInsert(.  BtCur
376c0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
376d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
376e0 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
376f0 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20  e table of this 
37700 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
37710 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
37720 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
37730 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77  e key of the new
37740 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
37750 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
37760 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54  int nData,  /* T
37770 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e  he data of the n
37780 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ew record */.  i
37790 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
377a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
377b0 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
377c0 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65   0 bytes to appe
377d0 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20  nd to data */.  
377e0 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20  int appendBias, 
377f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37800 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
37810 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65  s likely an appe
37820 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b  nd */.  int seek
37830 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
37840 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
37850 20 6f 66 20 70 72 69 6f 72 20 4d 6f 76 65 74 6f   of prior Moveto
37860 55 6e 70 61 63 6b 65 64 28 29 20 63 61 6c 6c 20  Unpacked() call 
37870 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
37880 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b    int loc = seek
37890 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
378a0 20 2f 2a 20 2d 31 3a 20 62 65 66 6f 72 65 20 64   /* -1: before d
378b0 65 73 69 72 65 64 20 6c 6f 63 61 74 69 6f 6e 20  esired location 
378c0 20 2b 31 3a 20 61 66 74 65 72 20 2a 2f 0a 20 20   +1: after */.  
378d0 69 6e 74 20 73 7a 4e 65 77 20 3d 20 30 3b 0a 20  int szNew = 0;. 
378e0 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
378f0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
37900 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
37910 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
37920 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
37930 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
37940 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
37950 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
37960 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ell = 0;..  if( 
37970 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
37980 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
37990 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
379a0 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
379b0 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 65 74 75 72  _OK );.    retur
379c0 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
379d0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
379e0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
379f0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
37a00 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61  ert( pCur->wrFla
37a10 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
37a20 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
37a30 52 49 54 45 20 26 26 20 21 70 42 74 2d 3e 72 65  RITE && !pBt->re
37a40 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65  adOnly );.  asse
37a50 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
37a60 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70  heTableLock(p, p
37a70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
37a80 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30  Cur->pKeyInfo!=0
37a90 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  , 2) );..  /* As
37aa0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
37ab0 6c 6c 65 72 20 68 61 73 20 62 65 65 6e 20 63 6f  ller has been co
37ac0 6e 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68 69  nsistent. If thi
37ad0 73 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  s cursor was ope
37ae0 6e 65 64 0a 20 20 2a 2a 20 65 78 70 65 63 74 69  ned.  ** expecti
37af0 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  ng an index b-tr
37b00 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ee, then the cal
37b10 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ler should be in
37b20 73 65 72 74 69 6e 67 20 62 6c 6f 62 0a 20 20 2a  serting blob.  *
37b30 2a 20 6b 65 79 73 20 77 69 74 68 20 6e 6f 20 61  * keys with no a
37b40 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20  ssociated data. 
37b50 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  If the cursor wa
37b60 73 20 6f 70 65 6e 65 64 20 65 78 70 65 63 74 69  s opened expecti
37b70 6e 67 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 6b 65  ng an.  ** intke
37b80 79 20 74 61 62 6c 65 2c 20 74 68 65 20 63 61 6c  y table, the cal
37b90 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ler should be in
37ba0 73 65 72 74 69 6e 67 20 69 6e 74 65 67 65 72 20  serting integer 
37bb0 6b 65 79 73 20 77 69 74 68 20 61 0a 20 20 2a 2a  keys with a.  **
37bc0 20 62 6c 6f 62 20 6f 66 20 61 73 73 6f 63 69 61   blob of associa
37bd0 74 65 64 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20  ted data.  */.  
37be0 61 73 73 65 72 74 28 20 28 70 4b 65 79 3d 3d 30  assert( (pKey==0
37bf0 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
37c00 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
37c10 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
37c20 73 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62 6c  sert into a tabl
37c30 65 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69  e b-tree, invali
37c40 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f  date any incrblo
37c50 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20  b .  ** cursors 
37c60 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20  open on the row 
37c70 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 28  being replaced (
37c80 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73  assuming this is
37c90 20 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20   a replace.  ** 
37ca0 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20 69  operation - if i
37cb0 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66 6f  t is not, the fo
37cc0 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 2d  llowing is a no-
37cd0 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  op).  */.  if( p
37ce0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
37cf0 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   ){.    invalida
37d00 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
37d10 73 28 70 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a 20  s(p, nKey, 0);. 
37d20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
37d30 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
37d40 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
37d50 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
37d60 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
37d70 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
37d80 65 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 4d  e call to btreeM
37d90 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73  oveto() below is
37da0 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20   a no-op. For.  
37db0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  ** example, when
37dc0 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20   inserting data 
37dd0 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74  into a table wit
37de0 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64  h auto-generated
37df0 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65   integer.  ** ke
37e00 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79  ys, the VDBE lay
37e10 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  er invokes sqlit
37e20 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f  e3BtreeLast() to
37e30 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
37e40 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65  .  ** integer ke
37e50 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65  y to use. It the
37e60 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  n calls this fun
37e70 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c  ction to actuall
37e80 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20  y insert the .  
37e90 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  ** data into the
37ea0 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20   intkey B-Tree. 
37eb0 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 74 72  In this case btr
37ec0 65 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f 67  eeMoveto() recog
37ed0 6e 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  nizes.  ** that 
37ee0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
37ef0 72 65 61 64 79 20 77 68 65 72 65 20 69 74 20 6e  ready where it n
37f00 65 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20 72  eeds to be and r
37f10 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a 20  eturns without. 
37f20 20 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f   ** doing any wo
37f30 72 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 77  rk. To avoid thw
37f40 61 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70 74  arting these opt
37f50 69 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69  imizations, it i
37f60 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a  s important.  **
37f70 20 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74 68   not to clear th
37f80 65 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a 20  e cursor here.. 
37f90 20 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41   */.  rc = saveA
37fa0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
37fb0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
37fc0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
37fd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
37fe0 28 20 21 6c 6f 63 20 29 7b 0a 20 20 20 20 72 63  ( !loc ){.    rc
37ff0 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
38000 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  Cur, pKey, nKey,
38010 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f   appendBias, &lo
38020 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
38030 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
38040 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
38050 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
38060 41 4c 49 44 20 7c 7c 20 28 70 43 75 72 2d 3e 65  ALID || (pCur->e
38070 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
38080 56 41 4c 49 44 20 26 26 20 6c 6f 63 29 20 29 3b  VALID && loc) );
38090 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
380a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
380b0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
380c0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c   pPage->intKey |
380d0 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  | nKey>=0 );.  a
380e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
380f0 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e  af || !pPage->in
38100 74 4b 65 79 20 29 3b 0a 0a 20 20 54 52 41 43 45  tKey );..  TRACE
38110 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65  (("INSERT: table
38120 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64  =%d nkey=%lld nd
38130 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25  ata=%d page=%d %
38140 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
38150 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
38160 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61  nKey, nData, pPa
38170 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  ge->pgno,.      
38180 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76      loc==0 ? "ov
38190 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20  erwrite" : "new 
381a0 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65  entry"));.  asse
381b0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
381c0 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54  t );.  allocateT
381d0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
381e0 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e   newCell = pBt->
381f0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28  pTmpSpace;.  if(
38200 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65   newCell==0 ) re
38210 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
38220 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e  M;.  rc = fillIn
38230 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43  Cell(pPage, newC
38240 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  ell, pKey, nKey,
38250 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e   pData, nData, n
38260 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20  Zero, &szNew);. 
38270 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
38280 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73  nd_insert;.  ass
38290 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c  ert( szNew==cell
382a0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e  SizePtr(pPage, n
382b0 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73  ewCell) );.  ass
382c0 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43  ert( szNew<=MX_C
382d0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
382e0 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  .  idx = pCur->a
382f0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
38300 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20  ];.  if( loc==0 
38310 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64  ){.    u16 szOld
38320 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
38330 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
38340 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
38350 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
38360 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
38370 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
38380 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72    goto end_inser
38390 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64  t;.    }.    old
383a0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
383b0 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20  pPage, idx);.   
383c0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
383d0 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  f ){.      memcp
383e0 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65  y(newCell, oldCe
383f0 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 4);.    }.  
38400 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69    szOld = cellSi
38410 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64  zePtr(pPage, old
38420 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  Cell);.    rc = 
38430 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
38440 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 64   oldCell);.    d
38450 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ropCell(pPage, i
38460 64 78 2c 20 73 7a 4f 6c 64 2c 20 26 72 63 29 3b  dx, szOld, &rc);
38470 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
38480 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a