/ Hex Artifact Content
Login

Artifact c13f6d1a469f7bac963fff7f17980919acd5f3ee:


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 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
03f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0400: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0410: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0420: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0430: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0440: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0450: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0460: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0470: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0480: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0490: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
04a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
04b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
04c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
04d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
04e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
04f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0500: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0510: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0520: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0530: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0540: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0550: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0560: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0570: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0580: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0590: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
05a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
05b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
05c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
05d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
05e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
05f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0600: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0610: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0620: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0630: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0640: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0650: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0660: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0670: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0680: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0690: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
06a0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
06b0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
06c0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
06d0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
06e0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
06f0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0700: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0710: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0720: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0730: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0740: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0750: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0770: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0780: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0790: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
07a0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
07b0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
07c0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
07d0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
07e0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
07f0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0800: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0810: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0820: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0830: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0840: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0850: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0860: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0870: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0880: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0890: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
08a0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
08b0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
08c0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
08d0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
08e0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
08f0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0900: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0910: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0920: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0930: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0940: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0950: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0960: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0970: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0980: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0990: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
09a0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
09b0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
09c0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
09d0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
09e0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
09f0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0a00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0a10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0a20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0a30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0a40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0a50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0a60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0a70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0a80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0a90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0aa0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0ab0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ac0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ad0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ae0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0af0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0b00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0b10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0b20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0b30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0b40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0b50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0b60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0b70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0b80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0b90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0ba0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0bb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0bc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0bd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0be0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0bf0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
0c00: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
0c10: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c20: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
0c30: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
0c40: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
0c50: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
0c60: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
0c70: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
0c80: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
0c90: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
0ca0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
0cb0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
0cc0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
0cd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
0ce0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
0cf0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
0d00: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
0d10: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
0d20: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
0d30: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
0d40: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
0d50: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
0d60: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
0d70: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
0d80: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
0d90: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
0da0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
0db0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
0dc0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
0dd0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
0de0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
0df0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
0e00: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
0e10: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
0e20: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
0e30: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
0e40: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
0e50: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
0e60: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
0e70: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
0e80: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
0e90: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0ea0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
0eb0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
0ec0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
0ed0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
0ee0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
0ef0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
0f00: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
0f10: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
0f20: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0f30: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
0f40: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
0f50: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
0f60: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
0f70: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
0f80: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
0f90: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
0fa0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
0fb0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
0fc0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
0fd0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
0fe0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
0ff0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1000: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1010: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1020: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1030: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1040: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1050: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1060: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1070: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1080: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1090: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
10a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
10b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
10c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
10d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
10e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
10f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1100: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1110: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1120: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1130: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1140: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1150: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1160: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1170: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1180: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1190: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
11a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
11b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
11c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
11d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
11e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
11f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1200: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1210: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1220: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1230: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1240: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1250: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1260: 2d 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d  ->flags&DB_Schem
1270: 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a  aLoaded)==0) ){.
1280: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1290: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
12a0: 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ut the root-page
12b0: 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73   that the lock s
12c0: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e  hould be held on
12d0: 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a  . For table.  **
12e0: 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69   b-trees, this i
12f0: 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20  s just the root 
1300: 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1310: 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  ee being read or
1320: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46  .  ** written. F
1330: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  or index b-trees
1340: 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  , it is the root
1350: 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73   page of the ass
1360: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62  ociated.  ** tab
1370: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  le.  */.  if( is
1380: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73  Index ){.    Has
1390: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f  hElem *p;.    fo
13a0: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
13b0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
13c0: 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  xHash); p; p=sql
13d0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
13e0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
13f0: 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71  dx = (Index *)sq
1400: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
1410: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1420: 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f  >tnum==(int)iRoo
1430: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61  t ){.        iTa
1440: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1450: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1460: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1470: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1480: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1490: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
14a0: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
14b0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
14c0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
14d0: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
14e0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
14f0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1500: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1510: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1520: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1530: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1540: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1550: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1560: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1570: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1580: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1590: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
15a0: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
15b0: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
15c0: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
15d0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
15e0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
15f0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1600: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1610: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1620: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1630: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1640: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1650: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1660: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1670: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1680: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1690: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
16a0: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
16b0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
16c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16d0: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
16e0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
16f0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1700: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1710: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1720: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1730: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
1740: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
1750: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
1760: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
1770: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
1780: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
1790: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
17a0: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
17b0: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
17c0: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
17d0: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
17e0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
17f0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
1800: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
1810: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
1820: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
1830: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
1840: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1850: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
1860: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
1870: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
1880: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
1890: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
18a0: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
18b0: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
18c0: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
18d0: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
18e0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
18f0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
1900: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
1910: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
1920: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
1930: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
1940: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
1950: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
1960: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
1970: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
1980: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
1990: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
19a0: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
19b0: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
19c0: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
19d0: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
19e0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
19f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1a00: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1a10: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
1a20: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
1a30: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
1a40: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
1a50: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
1a60: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
1a70: 6d 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20  mitted).    ){. 
1a80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1a90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1aa0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20  n 0;.}.#endif   
1ab0: 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54   /* #ifdef SQLIT
1ac0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
1ad0: 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69  * Query to see i
1ae0: 66 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  f Btree handle p
1af0: 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f   may obtain a lo
1b00: 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b  ck of type eLock
1b10: 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20   .** (READ_LOCK 
1b20: 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f  or WRITE_LOCK) o
1b30: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
1b40: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e   root-page iTab.
1b50: 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   Return.** SQLIT
1b60: 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b  E_OK if the lock
1b70: 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64   may be obtained
1b80: 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   (by calling.** 
1b90: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1ba0: 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53  bleLock()), or S
1bb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
1bc0: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
1bd0: 6e 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61  nt querySharedCa
1be0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72  cheTableLock(Btr
1bf0: 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62  ee *p, Pgno iTab
1c00: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
1c10: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1c20: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
1c30: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
1c40: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1c50: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1c60: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
1c70: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
1c80: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1c90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1ca0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
1cb0: 74 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67  t( !(p->db->flag
1cc0: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
1cd0: 6f 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b  ommitted)||eLock
1ce0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54  ==WRITE_LOCK||iT
1cf0: 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a  ab==1 );.  .  /*
1d00: 20 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61   If requesting a
1d10: 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65   write-lock, the
1d20: 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74  n the Btree must
1d30: 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1d40: 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ite.  ** transac
1d50: 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c  tion on this fil
1d60: 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c  e. And, obviousl
1d70: 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62  y, for this to b
1d80: 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a  e so there .  **
1d90: 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
1da0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1db0: 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  on on the file i
1dc0: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73  tself..  */.  as
1dd0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1de0: 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42  D_LOCK || (p==pB
1df0: 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d  t->pWriter && p-
1e00: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e10: 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65  WRITE) );.  asse
1e20: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
1e30: 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  LOCK || pBt->inT
1e40: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1e50: 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20  S_WRITE );.  .  
1e60: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
1e70: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1e80: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1e90: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1ea0: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1eb0: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1ec0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1ed0: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f  ..  /* If some o
1ee0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1ef0: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  is holding an ex
1f00: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68  clusive lock, th
1f10: 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  e.  ** requested
1f20: 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65   lock may not be
1f30: 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a   obtained..  */.
1f40: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
1f50: 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e 69 73  er!=p && pBt->is
1f60: 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
1f70: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1f80: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1f90: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1fa0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
1fb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
1fc0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
1fd0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1fe0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1ff0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2000: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2010: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2020: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2030: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2040: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2050: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2060: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2070: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2080: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2090: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
20a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
20b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
20c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
20d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
20e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
20f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2100: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2110: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2120: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2130: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2140: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2150: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2160: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2170: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2180: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2190: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
21a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
21b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
21d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
21e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
21f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2200: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2210: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2220: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2230: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2240: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2250: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2260: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2270: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2280: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2290: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
22a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
22b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
22c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
22d0: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
22e0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
22f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2300: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
2310: 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  HE;.    }.  }.  
2320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2330: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  ;.}.#endif /* !S
2340: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2350: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e  D_CACHE */..#ifn
2360: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2370: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
2380: 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e  ** Add a lock on
2390: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
23a0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
23b0: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
23c0: 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20  tree used.** by 
23d0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20  Btree handle p. 
23e0: 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20  Parameter eLock 
23f0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52  must be either R
2400: 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20  EAD_LOCK or .** 
2410: 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  WRITE_LOCK..**.*
2420: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2430: 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c  assumes the foll
2440: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  owing:.**.**   (
2450: 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65 64  a) The specified
2460: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20   Btree object p 
2470: 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  is connected to 
2480: 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20  a sharable.**   
2490: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e      database (on
24a0: 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68 61  e with the BtSha
24b0: 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61  red.sharable fla
24c0: 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  g set), and.**.*
24d0: 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72  *   (b) No other
24e0: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68   Btree objects h
24f0: 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20  old a lock that 
2500: 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20  conflicts.**    
2510: 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75     with the requ
2520: 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e  ested lock (i.e.
2530: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
2540: 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73  eTableLock() has
2550: 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64  .**       alread
2560: 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e  y been called an
2570: 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  d returned SQLIT
2580: 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  E_OK)..**.** SQL
2590: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
25a0: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
25b0: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
25c0: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d  ully. SQLITE_NOM
25d0: 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  EM .** is return
25e0: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61  ed if a malloc a
25f0: 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f  ttempt fails..*/
2600: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53  .static int setS
2610: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
2620: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
2630: 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c  no iTable, u8 eL
2640: 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ock){.  BtShared
2650: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2660: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
2670: 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  = 0;.  BtLock *p
2680: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2690: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
26a0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
26b0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
26c0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
26d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
26e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
26f0: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63  !=0 );..  /* A c
2700: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74  onnection with t
2710: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
2720: 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c  ted flag set wil
2730: 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20  l never try to. 
2740: 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61   ** obtain a rea
2750: 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69  d-lock using thi
2760: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  s function. The 
2770: 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  only read-lock o
2780: 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20  btained.  ** by 
2790: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  a connection in 
27a0: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
27b0: 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20   mode is on the 
27c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20  sqlite_master . 
27d0: 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74   ** table, and t
27e0: 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  hat lock is obta
27f0: 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67  ined in BtreeBeg
2800: 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20  inTrans().  */. 
2810: 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e   assert( 0==(p->
2820: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
2830: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
2840: 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  ) || eLock==WRIT
2850: 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
2860: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
2870: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
2880: 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c  led on a sharabl
2890: 65 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 69  e b-tree after i
28a0: 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  t .  ** has been
28b0: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
28c0: 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65   no other b-tree
28d0: 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63   holds a conflic
28e0: 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  ting lock.  */. 
28f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72   assert( p->shar
2900: 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  able );.  assert
2910: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65  ( SQLITE_OK==que
2920: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
2930: 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
2940: 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f  , eLock) );..  /
2950: 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74  * First search t
2960: 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65  he list for an e
2970: 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20  xisting lock on 
2980: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
2990: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
29a0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
29b0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
29c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
29d0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
29e0: 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65   && pIter->pBtre
29f0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c  e==p ){.      pL
2a00: 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ock = pIter;.   
2a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2a20: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2a30: 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69   above search di
2a40: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c  d not find a BtL
2a50: 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63  ock struct assoc
2a60: 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20  iating Btree p. 
2a70: 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69   ** with table i
2a80: 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20  Table, allocate 
2a90: 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20  one and link it 
2aa0: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20  into the list.. 
2ab0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b   */.  if( !pLock
2ac0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
2ad0: 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65  (BtLock *)sqlite
2ae0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
2af0: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
2b00: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2b10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2b30: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
2b40: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
2b50: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
2b60: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
2b70: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
2b80: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
2b90: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
2ba0: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
2bb0: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
2bc0: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
2bd0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2be0: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
2bf0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2c00: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
2c10: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
2c20: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
2c30: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
2c40: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
2c50: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
2c60: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
2c70: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
2c80: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
2c90: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
2ca0: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
2cb0: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
2cc0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
2cd0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
2ce0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2cf0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2d00: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2d10: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2d20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2d30: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
2d40: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
2d50: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
2d60: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
2d70: 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65  lls to.** the se
2d80: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2d90: 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72  eLock() procedur
2da0: 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  e) held by Btree
2db0: 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a   object p..**.**
2dc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2dd0: 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65  ssumes that Btre
2de0: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
2df0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
2e00: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2e10: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
2e20: 68 65 6e 20 74 68 65 20 42 74 53 68 61 72 65 64  hen the BtShared
2e30: 2e 69 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61  .isPending varia
2e40: 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  ble.** may be in
2e50: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
2e60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
2e70: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
2e80: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
2e90: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
2ea0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2eb0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
2ec0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
2ed0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
2ee0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2ef0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2f00: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
2f10: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
2f20: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2f30: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
2f40: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
2f50: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
2f60: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
2f70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
2f80: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  ->isExclusive==0
2f90: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
2fa0: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
2fb0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2fc0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e  Lock->pBtree->in
2fd0: 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c  Trans>=pLock->eL
2fe0: 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ock );.    if( p
2ff0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3000: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
3010: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
3020: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3030: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3040: 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f  || pLock==&p->lo
3050: 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
3060: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31  pLock->iTable!=1
3070: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3080: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
3090: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
30a0: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
30b0: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
30c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
30d0: 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65  ssert( pBt->isPe
30e0: 6e 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d  nding==0 || pBt-
30f0: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66  >pWriter );.  if
3100: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3110: 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57  p ){.    pBt->pW
3120: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3130: 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
3140: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73  = 0;.    pBt->is
3150: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d  Pending = 0;.  }
3160: 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54  else if( pBt->nT
3170: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b  ransaction==2 ){
3180: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
3190: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31a0: 77 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20  when Btree p is 
31b0: 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a  concluding its .
31c0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
31d0: 6f 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72  on. If there cur
31e0: 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20  rently exists a 
31f0: 77 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73  writer, and p is
3200: 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   not.    ** that
3210: 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68   writer, then th
3220: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  e number of lock
3230: 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
3240: 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20  tions other.    
3250: 2a 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74  ** than the writ
3260: 65 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74  er must be about
3270: 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f   to drop to zero
3280: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20  . In this case. 
3290: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 69 73     ** set the is
32a0: 50 65 6e 64 69 6e 67 20 66 6c 61 67 20 74 6f 20  Pending flag to 
32b0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
32c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
32d0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
32e0: 74 65 72 2c 20 74 68 65 6e 20 42 74 53 68 61 72  ter, then BtShar
32f0: 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 6d 75 73  ed.isPending mus
3300: 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f  t.    ** be zero
3310: 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69   already. So thi
3320: 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68  s next line is h
3330: 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20  armless in that 
3340: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
3350: 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20   pBt->isPending 
3360: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
3370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3380: 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69 74  changes all writ
3390: 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  e-locks held by 
33a0: 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65 61  Btree p into rea
33b0: 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74  d-locks..*/.stat
33c0: 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61 64  ic void downgrad
33d0: 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
33e0: 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20  ableLocks(Btree 
33f0: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
3400: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
3410: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3420: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f  r==p ){.    BtLo
3430: 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70  ck *pLock;.    p
3440: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3450: 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c  .    pBt->isExcl
3460: 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70  usive = 0;.    p
3470: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
3480: 30 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b  0;.    for(pLock
3490: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f  =pBt->pLock; pLo
34a0: 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d  ck; pLock=pLock-
34b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
34c0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c  ssert( pLock->eL
34d0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
34e0: 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  | pLock->pBtree=
34f0: 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63  =p );.      pLoc
3500: 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  k->eLock = READ_
3510: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
3520: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3530: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3540: 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63  CACHE */..static
3550: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
3560: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
3570: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
3580: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a  eference */../*.
3590: 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  ***** This routi
35a0: 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  ne is used insid
35b0: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e  e of assert() on
35c0: 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65  ly ****.**.** Ve
35d0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75  rify that the cu
35e0: 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d  rsor holds the m
35f0: 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68  utex on its BtSh
3600: 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ared.*/.#ifdef S
3610: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
3620: 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c  ic int cursorHol
3630: 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72  dsMutex(BtCursor
3640: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   *p){.  return s
3650: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3660: 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
3670: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
3680: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3690: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
36a0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
36b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
36c0: 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73  t cache for curs
36d0: 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e  or pCur, if any.
36e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36f0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3700: 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72  owCache(BtCursor
3710: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
3720: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
3730: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
3740: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
3750: 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
3760: 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
3770: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
3780: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3790: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
37a0: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
37b0: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
37c0: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
37d0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
37e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
37f0: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
3800: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
3810: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
3820: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
3830: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3840: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
3850: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
3860: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
3870: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
3880: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
3890: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
38a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
38c0: 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  ed before modify
38d0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
38e0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74   of a table.** t
38f0: 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  o invalidate any
3900: 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
3910: 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  s that are open 
3920: 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72  on the.** row or
3930: 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73   one of the rows
3940: 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e   being modified.
3950: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
3960: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3970: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
3980: 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
3990: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s of the.** tabl
39a0: 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  e is about to be
39b0: 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69   deleted. In thi
39c0: 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74  s case invalidat
39d0: 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a  e all incrblob.*
39e0: 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  * cursors open o
39f0: 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e  n any row within
3a00: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
3a10: 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f  root-page pgnoRo
3a20: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ot..**.** Otherw
3a30: 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74  ise, if argument
3a40: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
3a50: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65   false, then the
3a60: 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77   row with.** row
3a70: 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67  id iRow is being
3a80: 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c   replaced or del
3a90: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
3aa0: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a  se invalidate.**
3ab0: 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72   only those incr
3ac0: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
3ad0: 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66  n on that specif
3ae0: 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  ic row..*/.stati
3af0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3b00: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3b10: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
3b20: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
3b30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3b40: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
3b50: 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20  64 iRow,        
3b60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
3b70: 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62  wid that might b
3b80: 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20  e changing */.  
3b90: 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  int isClearTable
3ba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3bb0: 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
3bc0: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
3bd0: 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
3be0: 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  p;.  BtShared *p
3bf0: 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74  Bt = pBtree->pBt
3c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c10: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
3c20: 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20  ex(pBtree) );.  
3c30: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3c40: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3c50: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  t){.    if( p->i
3c60: 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
3c70: 26 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65  && (isClearTable
3c80: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
3c90: 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20  ==iRow) ){.     
3ca0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
3cb0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
3cc0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
3cd0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
3ce0: 6f 6e 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ons when INCRBLO
3cf0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
3d00: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3d10: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3d20: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
3d30: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3d40: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23  flowCache(x).  #
3d50: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
3d60: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3d70: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  (x,y,z).#endif /
3d80: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
3d90: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
3da0: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
3db0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
3dc0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
3dd0: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
3de0: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
3df0: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
3e00: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
3e10: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
3e20: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
3e30: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
3e40: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
3e50: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
3e60: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
3e70: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
3e80: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
3e90: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
3ea0: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
3eb0: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
3ec0: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
3ed0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
3ee0: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
3ef0: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
3f00: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
3f10: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
3f20: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
3f30: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
3f40: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
3f50: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
3f60: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3f70: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
3f80: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
3f90: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
3fa0: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
3fb0: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
3fc0: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
3fd0: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
3fe0: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
3ff0: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
4000: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
4010: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
4020: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
4030: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4040: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
4050: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
4060: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
4070: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4080: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
4090: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
40a0: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
40b0: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
40c0: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
40d0: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
40e0: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
40f0: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
4100: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
4110: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
4120: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
4130: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
4140: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
4150: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
4160: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
4170: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
4180: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4190: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
41a0: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
41b0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
41c0: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
41d0: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
41e0: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
41f0: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
4200: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4210: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
4220: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
4230: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
4240: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4250: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
4260: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
4270: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4280: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4290: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
42a0: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
42b0: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
42c0: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
42d0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
42e0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
42f0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
4300: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
4310: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
4320: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4330: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4340: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
4350: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
4360: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4370: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
4380: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4390: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
43a0: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
43b0: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
43c0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
43d0: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
43e0: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
43f0: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
4400: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4410: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
4420: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
4430: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
4440: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4450: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
4460: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
4470: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
4480: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4490: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
44a0: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
44b0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
44c0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
44d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
44e0: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
44f0: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  ntent ){.    int
4500: 20 6e 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20   nPage = 100;.  
4510: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
4520: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
4530: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
4540: 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 50    /* If sqlite3P
4550: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20  agerPagecount() 
4560: 66 61 69 6c 73 20 74 68 65 72 65 20 69 73 20 6e  fails there is n
4570: 6f 20 68 61 72 6d 20 62 65 63 61 75 73 65 20 74  o harm because t
4580: 68 65 0a 20 20 20 20 2a 2a 20 6e 50 61 67 65 20  he.    ** nPage 
4590: 76 61 72 69 61 62 6c 65 20 69 73 20 75 6e 63 68  variable is unch
45a0: 61 6e 67 65 64 20 66 72 6f 6d 20 69 74 73 20 64  anged from its d
45b0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
45c0: 31 30 30 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  100 */.    pBt->
45d0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
45e0: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
45f0: 65 28 28 75 33 32 29 6e 50 61 67 65 29 3b 0a 20  e((u32)nPage);. 
4600: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4610: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4620: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4630: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4640: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4650: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4660: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4670: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4680: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4690: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
46a0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
46b0: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
46c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
46d0: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
46e0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
46f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4700: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4710: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4720: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4730: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4740: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4750: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4760: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4770: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4780: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4790: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
47a0: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
47b0: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
47c0: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
47d0: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
47e0: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
47f0: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4800: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4810: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4820: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4830: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4840: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4850: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4860: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4870: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4880: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4890: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
48a0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
48b0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
48c0: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
48d0: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
48e0: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
48f0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4900: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4910: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4920: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4930: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4940: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4960: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4970: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
4980: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
4990: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
49a0: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
49b0: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
49c0: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
49d0: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
49e0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
49f0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
4a00: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
4a10: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
4a20: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
4a30: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
4a40: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
4a50: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
4a60: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
4a70: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
4a80: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
4a90: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
4aa0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4ab0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
4ac0: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
4ad0: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
4ae0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
4af0: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
4b00: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
4b10: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
4b20: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
4b30: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
4b40: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
4b50: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
4b60: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
4b70: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
4b80: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
4b90: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
4ba0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
4bb0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
4bc0: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
4bd0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
4be0: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
4bf0: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
4c00: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
4c10: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
4c20: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
4c30: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
4c40: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
4c50: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
4c60: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
4c70: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
4c80: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
4c90: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
4ca0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
4cb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
4cc0: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
4cd0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f  intKey ){.    vo
4ce0: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
4cf0: 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70  e3Malloc( (int)p
4d00: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
4d10: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
4d20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4d30: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
4d40: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
4d50: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
4d60: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
4d80: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
4d90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4da0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4db0: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
4dc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4dd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4de0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
4df0: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61  assert( !pCur->a
4e00: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
4e10: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
4e20: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
4e30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
4e40: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
4e50: 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
4e60: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
4e70: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
4e80: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
4e90: 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
4ea0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
4eb0: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
4ec0: 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  -1;.    pCur->eS
4ed0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45  tate = CURSOR_RE
4ee0: 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a  QUIRESEEK;.  }..
4ef0: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
4f00: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
4f10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4f20: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
4f30: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
4f40: 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74   cursors (except
4f50: 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61   pExcept) that a
4f60: 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  re open on.** th
4f70: 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72 6f  e table  with ro
4f80: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
4f90: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
4fa0: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
4fb0: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
4fc0: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
4fd0: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
4fe0: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
4ff0: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
5000: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
5010: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
5020: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
5030: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
5040: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
5050: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
5060: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5070: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
5080: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
5090: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
50a0: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
50b0: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
50c0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
50d0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
50e0: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
50f0: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
5100: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
5110: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
5120: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
5130: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
5140: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
5150: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
5160: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
5170: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5180: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5190: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
51a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
51b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
51c0: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
51d0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
51e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
51f0: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
5200: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5210: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
5220: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5230: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
5240: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
5250: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
5260: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
5270: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
5280: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
5290: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
52a0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
52b0: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
52c0: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
52d0: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
52e0: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
52f0: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
5300: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
5310: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
5320: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
5330: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
5340: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
5350: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
5360: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
5370: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
5380: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
5390: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
53a0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
53b0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
53c0: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
53d0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
53e0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
53f0: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5400: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5410: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5420: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5430: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
5440: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
5450: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
5460: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
5470: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
5480: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
5490: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
54a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
54b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
54c0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
54d0: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
54e0: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
54f0: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5500: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5510: 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30 5d  char aSpace[150]
5520: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5530: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
5540: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
5550: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69  a malloc */..  i
5560: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
5570: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
5580: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
5590: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
55a0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
55b0: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
55c0: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
55d0: 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  pKey,.          
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61              aSpa
5600: 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63  ce, sizeof(aSpac
5610: 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  e));.    if( pId
5620: 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  xKey==0 ) return
5630: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
5650: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
5660: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5670: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
5680: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
5690: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
56a0: 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
56b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
56c0: 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
56d0: 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d  rd(pIdxKey);.  }
56e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
56f0: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
5700: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
5710: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
5720: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
5730: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
5740: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
5750: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
5760: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
5770: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
5780: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
5790: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
57a0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
57b0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
57c0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
57d0: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
57e0: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
57f0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5800: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
5810: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
5820: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
5830: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
5840: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
5850: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
5860: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
5870: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5880: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
5890: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
58a0: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
58b0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
58c0: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
58d0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
58e0: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
58f0: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
5900: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
5910: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
5920: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
5930: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
5940: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
5950: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72  ->nKey, 0, &pCur
5960: 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69  ->skipNext);.  i
5970: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5980: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5990: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
59a0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
59b0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
59c0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
59d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
59e0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
59f0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
5a00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5a10: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
5a20: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
5a30: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
5a40: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
5a50: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
5a60: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
5a70: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5a80: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
5a90: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
5aa0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
5ab0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
5ac0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
5ad0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
5ae0: 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
5af0: 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73 6f  laced at.  Curso
5b00: 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e  rs can move when
5b10: 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72   the row they ar
5b20: 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74  e pointing.** at
5b30: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20   is deleted out 
5b40: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e  from under them.
5b50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5b60: 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ine returns an e
5b70: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f 6d  rror code if som
5b80: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5b90: 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67  g.  The.** integ
5ba0: 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69 73  er *pHasMoved is
5bb0: 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20 74   set to one if t
5bc0: 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f  he cursor has mo
5bd0: 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74  ved and 0 if not
5be0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5bf0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
5c00: 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ved(BtCursor *pC
5c10: 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76  ur, int *pHasMov
5c20: 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ed){.  int rc;..
5c30: 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
5c40: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
5c50: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
5c60: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
5c70: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   1;.    return r
5c80: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
5c90: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
5ca0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
5cb0: 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29 7b 0a  >skipNext!=0 ){.
5cc0: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
5cd0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
5ce0: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b   *pHasMoved = 0;
5cf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
5d00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
5d10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5d20: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
5d30: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
5d40: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
5d50: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
5d60: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
5d70: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
5d80: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
5d90: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
5da0: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
5db0: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
5dc0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
5dd0: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
5de0: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
5df0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
5e00: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
5e10: 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20  MapPage;.  Pgno 
5e20: 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20  iPtrMap, ret;.  
5e30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5e40: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
5e50: 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67  mutex) );.  nPag
5e60: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
5e70: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
5e80: 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20  5)+1;.  iPtrMap 
5e90: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
5ea0: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72  sPerMapPage;.  r
5eb0: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
5ec0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
5ed0: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
5ee0: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
5ef0: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
5f00: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
5f10: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
5f20: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
5f30: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
5f40: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
5f50: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
5f60: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
5f70: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
5f80: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
5f90: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
5fa0: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
5fb0: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
5fc0: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
5fd0: 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20  *.** If *pRC is 
5fe0: 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65  initially non-ze
5ff0: 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f  ro (non-SQLITE_O
6000: 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  K) then this rou
6010: 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tine is.** a no-
6020: 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  op.  If an error
6030: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70   occurs, the app
6040: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
6050: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
6060: 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a  * into *pRC..*/.
6070: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
6080: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
6090: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
60a0: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
60b0: 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b  rent, int *pRC){
60c0: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
60d0: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
60e0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
60f0: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6100: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
6110: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
6120: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
6130: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6140: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
6150: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
6160: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
6170: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
6180: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
6190: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rc;           /*
61a0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
61b0: 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
61c0: 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
61d0: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
61e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
61f0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6200: 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61  ) );.  /* The ma
6210: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
6220: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
6230: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
6240: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6250: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
6260: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
6270: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
6280: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
6290: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
62a0: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
62b0: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
62c0: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
62d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
62e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
62f0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
6300: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
6310: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6320: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
6330: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
6340: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
6350: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6360: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
6370: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6380: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
6390: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
63a0: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
63b0: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
63c0: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
63d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
63e0: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
63f0: 69 74 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  it;.  }.  pPtrma
6400: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
6410: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
6420: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
6430: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
6440: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
6450: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6460: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
6470: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
6480: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
6490: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
64a0: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
64b0: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
64c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
64d0: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
64e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
64f0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
6500: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
6510: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
6520: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
6530: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
6540: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
6550: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
6560: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
6570: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
6580: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
6590: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
65a0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
65b0: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
65c0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
65d0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
65e0: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
65f0: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
6600: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
6610: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
6620: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
6630: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
6640: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
6650: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
6660: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
6670: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
6680: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
6690: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
66a0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
66b0: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
66c0: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
66d0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
66e0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
66f0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
6700: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
6710: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
6720: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
6730: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
6740: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6750: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
6760: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
6770: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
6780: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
6790: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
67a0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
67b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
67c0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
67d0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
67e0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
67f0: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
6800: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
6810: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
6820: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
6830: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
6840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6850: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
6860: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
6870: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
6880: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
6890: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
68a0: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61 73  rmap, key);.  as
68b0: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
68c0: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
68d0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
68e0: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
68f0: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
6900: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
6910: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
6920: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
6930: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
6940: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
6950: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
6960: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6970: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6980: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
6990: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
69a0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
69b0: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
69c0: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c  rmapPut(w,x,y,z,
69d0: 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74  rc).  #define pt
69e0: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
69f0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
6a00: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
6a10: 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a  flPtr(x, y, rc).
6a20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
6a30: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
6a40: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
6a50: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
6a60: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
6a70: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
6a80: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
6a90: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
6aa0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
6ab0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
6ac0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
6ad0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
6ae0: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
6af0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
6b00: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
6b10: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
6b20: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
6b30: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
6b40: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
6b50: 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d  & get2byte(&(P)-
6b60: 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c  >aData[(P)->cell
6b70: 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29  Offset+2*(I)])))
6b80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
6b90: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
6ba0: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
6bb0: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
6bc0: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
6bd0: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
6be0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
6bf0: 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72  tic u8 *findOver
6c00: 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65  flowCell(MemPage
6c10: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
6c20: 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ll){.  int i;.  
6c30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6c40: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
6c50: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
6c60: 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e  .  for(i=pPage->
6c70: 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d  nOverflow-1; i>=
6c80: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
6c90: 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f   k;.    struct _
6ca0: 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b  OvflCell *pOvfl;
6cb0: 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50  .    pOvfl = &pP
6cc0: 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20  age->aOvfl[i];. 
6cd0: 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64     k = pOvfl->id
6ce0: 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43  x;.    if( k<=iC
6cf0: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
6d00: 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k==iCell ){.   
6d10: 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66       return pOvf
6d20: 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  l->pCell;.      
6d30: 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b  }.      iCell--;
6d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6d50: 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  urn findCell(pPa
6d60: 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f  ge, iCell);.}../
6d70: 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c  *.** Parse a cel
6d80: 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20  l content block 
6d90: 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  and fill in the 
6da0: 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75  CellInfo structu
6db0: 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72  re.  There.** ar
6dc0: 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  e two versions o
6dd0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  f this function.
6de0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
6df0: 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63  () takes a .** c
6e00: 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65  ell index as the
6e10: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6e20: 20 61 6e 64 20 62 74 72 65 65 50 61 72 73 65 43   and btreeParseC
6e30: 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b  ellPtr() .** tak
6e40: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
6e50: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
6e60: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
6e70: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
6e80: 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66  ** Within this f
6e90: 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65  ile, the parseCe
6ea0: 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62  ll() macro can b
6eb0: 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  e called instead
6ec0: 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73   of.** btreePars
6ed0: 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e  eCellPtr(). Usin
6ee0: 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  g some compilers
6ef0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66  , this will be f
6f00: 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aster..*/.static
6f10: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
6f20: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
6f30: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
6f40: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
6f50: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
6f60: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
6f80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
6f90: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
6fa0: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
6fb0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
6fc0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
6fd0: 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20  */.){.  u16 n;  
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
7000: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
7010: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
7020: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
7030: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7040: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
7050: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
7060: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7070: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7080: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
7090: 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20   pInfo->pCell = 
70a0: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
70b0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
70c0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
70d0: 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65  1 );.  n = pPage
70e0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
70f0: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34    assert( n==4-4
7100: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
7110: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
7120: 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Key ){.    if( p
7130: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
7140: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  .      n += getV
7150: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
7160: 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
7170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
7180: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
7190: 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56   }.    n += getV
71a0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
71b0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
71c0: 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Key);.    pInfo-
71d0: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
71e0: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
71f0: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30  pInfo->nData = 0
7200: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
7210: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
7220: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
7230: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
7240: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70  Payload;.  }.  p
7250: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
7260: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
7270: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
7280: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
7290: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
72a0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
72b0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
72c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
72d0: 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  1 );.  if( likel
72e0: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
72f0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
7300: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
7310: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
7320: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
7330: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
7340: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
7350: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
7360: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
7370: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
7380: 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20     int nSize;   
7390: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
73a0: 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  size of cell con
73b0: 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  tent in bytes */
73c0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61  .    nSize = nPa
73d0: 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70  yload + n;.    p
73e0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
73f0: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
7400: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
7410: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ow = 0;.    if( 
7420: 28 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20  (nSize & ~3)==0 
7430: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
7440: 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69   4;        /* Mi
7450: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
7460: 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  is 4 */.    }.  
7470: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
7480: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d   (u16)nSize;.  }
7490: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
74a0: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
74b0: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
74c0: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
74d0: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
74e0: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
74f0: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
7500: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
7510: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
7520: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
7530: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
7540: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
7550: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
7560: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
7570: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
7580: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
7590: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
75a0: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
75b0: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
75c0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
75d0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
75e0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
75f0: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
7600: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
7610: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
7620: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
7630: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
7640: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
7650: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
7660: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
7670: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
7680: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
7690: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
76a0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
76b0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
76c0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
76d0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
76e0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
76f0: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
7700: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
7710: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
7720: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
7730: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
7740: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
7750: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
7760: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
7770: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
7780: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
7790: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
77a0: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
77b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
77c0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
77d0: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
77e0: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
77f0: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
7800: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
7810: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
7820: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
7830: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
7840: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20  u16)surplus;.   
7850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
7860: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7870: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  16)minLocal;.   
7880: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
7890: 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28  verflow = (u16)(
78a0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
78b0: 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  n);.    pInfo->n
78c0: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
78d0: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
78e0: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
78f0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7900: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74  l, pInfo) \.  bt
7910: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7920: 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c  (pPage), findCel
7930: 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c  l((pPage), (iCel
7940: 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74  l)), (pInfo)).st
7950: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
7960: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
7970: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
7980: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
7990: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
79a0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
79c0: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
79d0: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
79e0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
79f0: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
7a00: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
7a10: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
7a20: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
7a30: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   iCell, pInfo);.
7a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
7a50: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
7a60: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
7a70: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
7a80: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
7a90: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
7aa0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
7ab0: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
7ac0: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
7ad0: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
7ae0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
7af0: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
7b00: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
7b10: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
7b20: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
7b30: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
7b40: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
7b50: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
7b60: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
7b70: 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65  u8 *pIter = &pCe
7b80: 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ll[pPage->childP
7b90: 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e  trSize];.  u32 n
7ba0: 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51  Size;..#ifdef SQ
7bb0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
7bc0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
7bd0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
7be0: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
7bf0: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
7c00: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
7c10: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
7c20: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
7c30: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
7c40: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
7c50: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
7c60: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
7c70: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
7c80: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
7c90: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
7ca0: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
7cb0: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
7cc0: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
7cd0: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
7ce0: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
7cf0: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
7d00: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
7d10: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
7d20: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
7d30: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20      u8 *pEnd;.  
7d40: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
7d50: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49  Data ){.      pI
7d60: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
7d70: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
7d80: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7d90: 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20     nSize = 0;.  
7da0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65    }..    /* pIte
7db0: 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
7dc0: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
7dd0: 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20  er key value, a 
7de0: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
7df0: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e  .    ** integer.
7e00: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7e10: 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72  lock moves pIter
7e20: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
7e30: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
7e40: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
7e50: 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  of the key value
7e60: 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20  . */.    pEnd = 
7e70: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77  &pIter[9];.    w
7e80: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
7e90: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
7ea0: 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  End );.  }else{.
7eb0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
7ec0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
7ed0: 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74  nSize);.  }..  t
7ee0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
7ef0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
7f00: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
7f10: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
7f20: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
7f30: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
7f40: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  xLocal ){.    in
7f50: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
7f60: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
7f70: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
7f80: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
7f90: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
7fa0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
7fb0: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
7fc0: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
7fd0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
7fe0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
7ff0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8000: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
8010: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
8020: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
8030: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
8040: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
8050: 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e  ze += 4;.  }.  n
8060: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
8070: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20  ter - pCell);.. 
8080: 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20   /* The minimum 
8090: 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c  size of any cell
80a0: 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a   is 4 bytes. */.
80b0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
80c0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  .    nSize = 4;.
80d0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
80e0: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
80f0: 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72  nSize );.  retur
8100: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
8110: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8120: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
8130: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
8140: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
8150: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
8160: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
8170: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
8180: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
8190: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
81a0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
81b0: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
81c0: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
81d0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
81e0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
81f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8200: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
8210: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
8220: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
8230: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
8240: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
8250: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
8260: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
8270: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
8280: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
8290: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
82a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
82b0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
82c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
82d0: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
82e0: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
82f0: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
8300: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8310: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
8320: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8330: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
8340: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
8350: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
8360: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
8370: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
8380: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
8390: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
83a0: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
83b0: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
83c0: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
83d0: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
83e0: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
83f0: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
8400: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
8410: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
8420: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
8430: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
8440: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
8450: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
8460: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
8470: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
8480: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
8490: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
84a0: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
84b0: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
84c0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
84d0: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
84e0: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
84f0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
8500: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
8510: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
8520: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
8530: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
8540: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8550: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8560: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
8570: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
8580: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
8590: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
85a0: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
85d0: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
85e0: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8600: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
8610: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
8620: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8630: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
8640: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
8650: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
8660: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
8670: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
8680: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
8690: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
86a0: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
86b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
86c0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
86d0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
86e0: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
86f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8700: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
8710: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
8720: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
8730: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
8740: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
8750: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
8760: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
8770: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
8780: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
8790: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
87a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
87b0: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
87c0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
87d0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
87e0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
87f0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
8800: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
8810: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8820: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8830: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
8840: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
8850: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
8860: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
8870: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
8880: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
8890: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
88a0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
88b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
88c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
88d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
88e0: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
88f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
8900: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
8910: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
8920: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
8930: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
8940: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
8950: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
8960: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
8970: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
8980: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
8990: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
89a0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
89b0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
89c0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
89d0: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
89e0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
89f0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
8a00: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
8a10: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
8a20: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
8a30: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
8a40: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
8a50: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
8a60: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
8a70: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
8a80: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
8a90: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
8aa0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
8ab0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
8ac0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
8ad0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
8ae0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
8af0: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
8b00: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
8b10: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8b20: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
8b30: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8b40: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
8b50: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8b60: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
8b70: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
8b80: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
8b90: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
8ba0: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
8bb0: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
8bc0: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
8bd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
8be0: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
8bf0: 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20  K is defined .  
8c00: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
8c10: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
8c20: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
8c30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8c40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8c50: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
8c60: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
8c70: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
8c80: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
8c90: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
8ca0: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
8cb0: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
8cc0: 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69  = size;.#if defi
8cd0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
8ce0: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
8cf0: 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63  CHECK).    if( c
8d00: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29  brk<iCellFirst )
8d10: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8d20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8d30: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  PT;.    }.#else.
8d40: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
8d50: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
8d60: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
8d70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8d80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8d90: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
8da0: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
8db0: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
8dc0: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
8dd0: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
8de0: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
8df0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
8e00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
8e10: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
8e20: 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e );.    memcpy(
8e30: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
8e40: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
8e50: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
8e60: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
8e70: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
8e80: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
8e90: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8ea0: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
8eb0: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
8ec0: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
8ed0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
8ee0: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
8ef0: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
8f00: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
8f10: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
8f20: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
8f30: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
8f40: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
8f50: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
8f60: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
8f70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8f80: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8f90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
8fa0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8fb0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
8fc0: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8fd0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
8fe0: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
8ff0: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
9000: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
9010: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
9020: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
9030: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
9040: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
9050: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
9060: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
9070: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
9080: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
9090: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
90a0: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
90b0: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
90c0: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
90d0: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
90e0: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
90f0: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
9100: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9110: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
9120: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
9130: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
9140: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
9150: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
9160: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
9170: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
9180: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
9190: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
91a0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
91b0: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
91c0: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
91d0: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
91e0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
91f0: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
9200: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
9210: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
9220: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
9230: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
9240: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
9250: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
9260: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
9270: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
9280: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
9290: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
92a0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
92b0: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
92c0: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
92d0: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
92e0: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
92f0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
9300: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
9310: 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20    int nFrag;    
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9330: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9340: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62   of fragmented b
9350: 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ytes on pPage */
9360: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9390: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
93a0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
93b0: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
93c0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
93d0: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
93e0: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
93f0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
9400: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9410: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
9420: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 0a 20 20  rn code */.  .  
9430: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9440: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9450: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9460: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9470: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
9480: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9490: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
94a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
94b0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
94c0: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
94d0: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
94e0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
94f0: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
9500: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9510: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
9520: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
9530: 79 74 65 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e  yte<pPage->pBt->
9540: 75 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a  usableSize-8 );.
9550: 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b  .  nFrag = data[
9560: 68 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74  hdr+7];.  assert
9570: 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  ( pPage->cellOff
9580: 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20  set == hdr + 12 
9590: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  - 4*pPage->leaf 
95a0: 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65  );.  gap = pPage
95b0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
95c0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
95d0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
95e0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
95f0: 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72   if( gap>top ) r
9600: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9610: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73  RUPT_BKPT;.  tes
9620: 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f  tcase( gap+2==to
9630: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
9640: 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20   gap+1==top );. 
9650: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d   testcase( gap==
9660: 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46  top );..  if( nF
9670: 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f  rag>=60 ){.    /
9680: 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d  * Always defragm
9690: 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d  ent highly fragm
96a0: 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20  ented pages */. 
96b0: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
96c0: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
96d0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
96e0: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
96f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9700: 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65  hdr+5]);.  }else
9710: 20 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20   if( gap+2<=top 
9720: 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  ){.    /* Search
9730: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f   the freelist lo
9740: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
9750: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
9760: 20 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20   to satisfy .   
9770: 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e   ** the request.
9780: 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   The allocation 
9790: 69 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65  is made from the
97a0: 20 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74   first free slot
97b0: 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   in .    ** the 
97c0: 6c 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72  list that is lar
97d0: 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63  ge enough to acc
97e0: 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20  omadate it..    
97f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  */.    int pc, a
9800: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
9810: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
9820: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
9830: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
9840: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
9850: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
9860: 74 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f  ta[pc+2]);     /
9870: 2a 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73  * Size of free s
9880: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
9890: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
98a0: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
98b0: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
98c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
98d0: 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  x==4 );.        
98e0: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29  testcase( x==3 )
98f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
9900: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  4 ){.          /
9910: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
9920: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
9930: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
9940: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
9950: 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74       ** fragment
9960: 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20  ed bytes within 
9970: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
9980: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64         memcpy(&d
9990: 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61  ata[addr], &data
99a0: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
99b0: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
99c0: 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78  = (u8)(nFrag + x
99d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
99e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
99f0: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
9a00: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
9a10: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
9a20: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
9a30: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
9a40: 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62  e portion used b
9a50: 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  y the new alloca
9a60: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
9a70: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
9a80: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
9a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
9aa0: 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20  pIdx = pc + x;. 
9ab0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9ac0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
9ad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9ae0: 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
9af0: 75 72 65 20 74 68 65 72 65 20 69 73 20 65 6e 6f  ure there is eno
9b00: 75 67 68 20 73 70 61 63 65 20 69 6e 20 74 68 65  ugh space in the
9b10: 20 67 61 70 20 74 6f 20 73 61 74 69 73 66 79 0a   gap to satisfy.
9b20: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74    ** the allocat
9b30: 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64 65  ion.  If not, de
9b40: 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  fragment..  */. 
9b50: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
9b60: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
9b70: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
9b80: 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  >top ){.    rc =
9b90: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
9ba0: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
9bb0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
9bc0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
9bd0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
9be0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61  ;.    assert( ga
9bf0: 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  p+nByte<=top );.
9c00: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
9c10: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
9c20: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
9c30: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
9c40: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
9c50: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
9c60: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
9c70: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
9c80: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
9c90: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
9ca0: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
9cb0: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
9cc0: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
9cd0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
9ce0: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
9cf0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
9d00: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
9d10: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
9d20: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
9d30: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
9d40: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
9d50: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
9d60: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
9d70: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9d80: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
9d90: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
9da0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9db0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
9dc0: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
9dd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9de0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
9df0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
9e00: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
9e10: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
9e20: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
9e30: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
9e40: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
9e50: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
9e60: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
9e70: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
9e80: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
9e90: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
9ea0: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
9eb0: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
9ec0: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
9ed0: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
9ee0: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
9ef0: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
9f00: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
9f10: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9f20: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
9f30: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
9f40: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69  pbegin, hdr;.  i
9f50: 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20  nt iLast;       
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f70: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
9f80: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
9f90: 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ffset */.  unsig
9fa0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
9fb0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
9fc0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9fd0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
9fe0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9ff0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
a000: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
a010: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e    assert( start>
a020: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
a030: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
a040: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
a050: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
a060: 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ze)<=pPage->pBt-
a070: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
a080: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a090: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a0a0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a0b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
a0c0: 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=0 );   /* Mini
a0d0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
a0e0: 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   4 */..#ifdef SQ
a0f0: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
a100: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
a110: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
a120: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
a130: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
a140: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
a150: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
a160: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
a170: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
a180: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
a190: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
a1a0: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
a1b0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
a1c0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
a1d0: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68  blocks.  Note th
a1e0: 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  at.  ** even tho
a1f0: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
a200: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
a210: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
a220: 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65  age(),.  ** btre
a230: 65 49 6e 69 74 50 61 67 65 28 29 20 64 69 64 20  eInitPage() did 
a240: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
a250: 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a  apping cells or.
a260: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20    ** freeblocks 
a270: 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20  that overlapped 
a280: 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65  cells.   Nor doe
a290: 73 20 69 74 20 64 65 74 65 63 74 20 77 68 65 6e  s it detect when
a2a0: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63   the.  ** cell c
a2b0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63 65  ontent area exce
a2c0: 65 64 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e  eds the value in
a2d0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
a2e0: 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a  .  If these.  **
a2f0: 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73   situations aris
a300: 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
a310: 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  nt insert operat
a320: 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75  ions might corru
a330: 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65  pt.  ** the free
a340: 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20  list.  So we do 
a350: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f  need to check fo
a360: 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69  r corruption whi
a370: 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a  le scanning.  **
a380: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
a390: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
a3a0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
a3b0: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
a3c0: 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d    iLast = pPage-
a3d0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a3e0: 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20   - 4;.  assert( 
a3f0: 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  start<=iLast );.
a400: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
a410: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a420: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
a430: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
a440: 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64     if( pbegin<ad
a450: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65  dr+4 ){.      re
a460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a470: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
a480: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
a490: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65  n;.  }.  if( pbe
a4a0: 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20  gin>iLast ){.   
a4b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a4c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
a4d0: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
a4e0: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
a4f0: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
a500: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
a510: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
a520: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
a530: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
a540: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
a550: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
a560: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
a570: 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29  e->nFree + (u16)
a580: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
a590: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
a5a0: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
a5b0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
a5c0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
a5d0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a5e0: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
a5f0: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
a600: 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72  ze, x;.    asser
a610: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
a620: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
a630: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
a640: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
a650: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
a660: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
a670: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
a680: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a690: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
a6a0: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
a6b0: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
a6c0: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
a6d0: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
a6e0: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
a6f0: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  +psize);.      i
a700: 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28  f( (frag<0) || (
a710: 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 68  frag>(int)data[h
a720: 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20  dr+7]) ){.      
a730: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a740: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a750: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61      }.      data
a760: 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66  [hdr+7] -= (u8)f
a770: 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  rag;.      x = g
a780: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
a790: 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74  ext]);.      put
a7a0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
a7b0: 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78  in], x);.      x
a7c0: 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62   = pnext + get2b
a7d0: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b  yte(&data[pnext+
a7e0: 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20  2]) - pbegin;.  
a7f0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
a800: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29  ta[pbegin+2], x)
a810: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a820: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
a830: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
a840: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
a850: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
a860: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
a870: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
a880: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
a890: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
a8a0: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
a8b0: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
a8c0: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
a8d0: 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79   pbegin = get2by
a8e0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
a8f0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
a900: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
a910: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
a920: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
a930: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b  (&data[hdr+5]) +
a940: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a950: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
a960: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
a970: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d  dr+5], top);.  }
a980: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a990: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a9a0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a9b0: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
a9c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a9d0: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
a9e0: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
a9f0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
aa00: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
aa10: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
aa20: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
aa30: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
aa40: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
aa50: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
aa60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
aa70: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
aa80: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
aa90: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
aaa0: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
aab0: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
aac0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
aad0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
aae0: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
aaf0: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
ab00: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
ab10: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
ab20: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
ab30: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
ab40: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
ab50: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
ab60: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
ab70: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
ab80: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
ab90: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
aba0: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
abb0: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
abc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
abd0: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
abe0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
abf0: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
ac00: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ac10: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
ac20: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
ac30: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
ac40: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
ac50: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
ac60: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
ac70: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
ac80: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
ac90: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
aca0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
acb0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
acc0: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
acd0: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
ace0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
acf0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
ad00: 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ey = 1;.    pPag
ad10: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61  e->hasData = pPa
ad20: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
ad30: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
ad40: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
ad50: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
ad60: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
ad70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
ad80: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
ad90: 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67  DATA ){.    pPag
ada0: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
adb0: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
adc0: 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  a = 0;.    pPage
add0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
ade0: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
adf0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
ae00: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
ae10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
ae20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ae30: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
ae40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ae50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
ae60: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
ae70: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
ae80: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
ae90: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
aea0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
aeb0: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
aec0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
aed0: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
aee0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
aef0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
af00: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
af10: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
af20: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
af30: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
af40: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
af50: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
af60: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
af70: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
af80: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
af90: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
afa0: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
afb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
afc0: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
afd0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
afe0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
aff0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b000: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b010: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b020: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
b030: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
b040: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
b050: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
b060: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b070: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
b080: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
b090: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
b0a0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
b0b0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
b0c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b0d0: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
b0e0: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
b0f0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
b100: 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20  .    u16 pc;    
b110: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
b120: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
b130: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
b140: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
b150: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
b160: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
b170: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
b180: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
b190: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
b1a0: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
b1b0: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
b1c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
b1d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
b1e0: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
b1f0: 75 72 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 75  ure */.    u16 u
b200: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
b210: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
b220: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
b230: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
b240: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
b250: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
b260: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
b270: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
b280: 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46 72  r */.    u16 nFr
b290: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
b2a0: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
b2b0: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
b2c0: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f 70  e */.    u16 top
b2d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
b2e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
b2f0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
b300: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
b310: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
b320: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b330: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
b340: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
b350: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b360: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
b370: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
b380: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
b390: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
b3a0: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
b3b0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
b3c0: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
b3d0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
b3e0: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
b3f0: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
b400: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
b410: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b420: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
b430: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
b440: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
b450: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20 20 70  <=32768 );.    p
b460: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
b470: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
b480: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   1;.    pPage->n
b490: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
b4a0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
b4b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
b4c0: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
b4d0: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
b4e0: 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  et = hdr + 12 - 
b4f0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
b500: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
b510: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b520: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b530: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b540: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b550: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b560: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b570: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b580: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b590: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b5a0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b5b0: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b5c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b5d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b5e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b5f0: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b600: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b610: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b620: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b630: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
b640: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
b650: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
b660: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
b670: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
b680: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
b690: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
b6a0: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
b6b0: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
b6c0: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
b6d0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
b6e0: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
b6f0: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
b700: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
b710: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
b720: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
b730: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
b740: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
b750: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
b760: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
b770: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
b780: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
b790: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
b7a0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
b7b0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
b7c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
b7d0: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
b7e0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
b7f0: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
b800: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
b810: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
b820: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
b830: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
b840: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
b850: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
b860: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
b870: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
b880: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
b890: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
b8a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b8b0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
b8c0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b8d0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
b8e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
b8f0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
b900: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
b910: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
b920: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b930: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
b940: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
b950: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
b960: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
b970: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b980: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
b990: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
b9a0: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
b9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
b9c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b9d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
b9e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b9f0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
ba00: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
ba10: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
ba20: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
ba30: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
ba40: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
ba50: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
ba60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ba70: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
ba80: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
ba90: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
baa0: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
bab0: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
bac0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
bad0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
bae0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
baf0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65   /* Start of fre
bb00: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
bb10: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
bb20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bb30: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bb40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
bb50: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
bb60: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
bb70: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
bb80: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
bb90: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
bba0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
bbb0: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
bbc0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
bbd0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
bbe0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
bbf0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
bc00: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
bc10: 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65  e of..** the fre
bc20: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
bc30: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
bc40: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
bc50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bc60: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bc70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
bc80: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
bc90: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
bca0: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
bcb0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
bcc0: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
bcd0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
bce0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
bcf0: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
bd00: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
bd10: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
bd20: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
bd30: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
bd40: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
bd50: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
bd60: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
bd70: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
bd80: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
bd90: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
bda0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
bdb0: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
bdc0: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
bdd0: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
bde0: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
bdf0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
be00: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
be10: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
be20: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
be30: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
be40: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
be50: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
be60: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
be70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
be80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
be90: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
bea0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
beb0: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
bec0: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
bed0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
bee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
bef0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
bf00: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
bf10: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
bf20: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
bf30: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
bf40: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
bf50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
bf60: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
bf70: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
bf80: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
bf90: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
bfa0: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
bfb0: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
bfc0: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
bfd0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
bfe0: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
bff0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c000: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c010: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c020: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c040: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c050: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c060: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
c070: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c080: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c090: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c0a0: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
c0b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c0c0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c0d0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c0e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c0f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c100: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 23  pBt->mutex) );.#
c110: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
c120: 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 6d 65 6d  URE_DELETE.  mem
c130: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
c140: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
c150: 7a 65 20 2d 20 68 64 72 29 3b 0a 23 65 6e 64 69  ze - hdr);.#endi
c160: 66 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  f.  data[hdr] = 
c170: 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
c180: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
c190: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
c1a0: 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20  EAF)==0 ?1:0);. 
c1b0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
c1c0: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
c1d0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
c1e0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c1f0: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
c200: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
c210: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ge->nFree = pBt-
c220: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
c230: 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  rst;.  decodeFla
c240: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
c250: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
c260: 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50  fset = hdr;.  pP
c270: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
c280: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
c290: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
c2a0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
c2b0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
c2c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
c2d0: 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67 65  32768 );.  pPage
c2e0: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
c2f0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
c300: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
c310: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
c320: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
c330: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
c340: 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
c350: 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
c360: 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
c370: 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
c380: 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
c390: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
c3a0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
c3b0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
c3c0: 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
c3d0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
c3e0: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
c3f0: 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
c400: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
c410: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
c420: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
c430: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
c440: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
c450: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
c460: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
c470: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
c480: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
c490: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
c4a0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
c4b0: 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75   100 : 0;.  retu
c4c0: 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
c4d0: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
c4e0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
c4f0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
c500: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
c510: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
c520: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
c530: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
c540: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
c550: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
c560: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
c570: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
c580: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
c590: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
c5a0: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
c5b0: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
c5c0: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
c5d0: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
c5e0: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
c5f0: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
c600: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
c610: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
c620: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
c630: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
c640: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
c650: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
c660: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
c670: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
c680: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
c690: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
c6a0: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
c6b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
c6c0: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
c6d0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
c6e0: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
c6f0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
c700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c710: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
c720: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
c730: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
c740: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
c750: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
c760: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
c770: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
c780: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
c790: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
c7a0: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
c7b0: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
c7c0: 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
c7d0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c7e0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
c7f0: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
c800: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
c810: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
c820: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
c830: 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  DbPage, noConten
c840: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
c850: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
c860: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
c870: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
c880: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
c890: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c8a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
c8b0: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
c8c0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
c8d0: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
c8e0: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
c8f0: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
c900: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
c910: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
c920: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
c930: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
c940: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
c950: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
c960: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
c970: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
c980: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
c990: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
c9a0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
c9b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c9c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
c9d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
c9e0: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
c9f0: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
ca00: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
ca10: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
ca20: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
ca30: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
ca40: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
ca50: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ca60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
ca70: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
ca80: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ca90: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
caa0: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
cab0: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
cac0: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
cad0: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
cae0: 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67 65  c Pgno pagerPage
caf0: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
cb00: 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  pBt){.  int nPag
cb10: 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63  e = -1;.  int rc
cb20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
cb30: 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63 20  >pPage1 );.  rc 
cb40: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
cb50: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
cb60: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
cb70: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
cb80: 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d  TE_OK || nPage==
cb90: 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  -1 );.  return (
cba0: 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f  Pgno)nPage;.}../
cbb0: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
cbc0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
cbd0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
cbe0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
cbf0: 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e  is just a.** con
cc00: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
cc10: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
cc20: 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47   calls to btreeG
cc30: 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a  etPage() and .**
cc40: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
cc50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
cc60: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
cc70: 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61   the value *ppPa
cc80: 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73 20  ge is set to is 
cc90: 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
cca0: 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
ccb0: 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
ccc0: 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
ccd0: 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
cce0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
ccf0: 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
cd00: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
cd10: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
cd20: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
cd30: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
cd40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cd50: 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
cd60: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
cd70: 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72  ppPage     /* Wr
cd80: 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
cd90: 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  nter here */.){.
cda0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 45 53 54    int rc;.  TEST
cdb0: 4f 4e 4c 59 28 20 50 67 6e 6f 20 69 4c 61 73 74  ONLY( Pgno iLast
cdc0: 50 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  Pg = pagerPageco
cdd0: 75 6e 74 28 70 42 74 29 3b 20 29 0a 20 20 61 73  unt(pBt); ).  as
cde0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
cdf0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
ce00: 74 65 78 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  tex) );..  rc = 
ce10: 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
ce20: 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
ce30: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
ce40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
ce50: 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
ce60: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
ce70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ce80: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
ce90: 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
cea0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ceb0: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
cec0: 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 77 61  d page number wa
ced0: 73 20 65 69 74 68 65 72 20 30 20 6f 72 20 67 72  s either 0 or gr
cee0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70  eater than the p
cef0: 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
cf00: 6f 66 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  of the last page
cf10: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
cf20: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
cf30: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 20 20  should return.  
cf40: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
cf50: 54 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  T or some other 
cf60: 65 72 72 6f 72 20 28 69 2e 65 2e 20 53 51 4c 49  error (i.e. SQLI
cf70: 54 45 5f 46 55 4c 4c 29 2e 20 43 68 65 63 6b 20  TE_FULL). Check 
cf80: 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69  that this.  ** i
cf90: 73 20 74 68 65 20 63 61 73 65 2e 20 20 2a 2f 0a  s the case.  */.
cfa0: 20 20 61 73 73 65 72 74 28 20 28 70 67 6e 6f 3e    assert( (pgno>
cfb0: 30 20 26 26 20 70 67 6e 6f 3c 3d 69 4c 61 73 74  0 && pgno<=iLast
cfc0: 50 67 29 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  Pg) || rc!=SQLIT
cfd0: 45 5f 4f 4b 20 29 3b 0a 20 20 74 65 73 74 63 61  E_OK );.  testca
cfe0: 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
cff0: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d000: 3d 69 4c 61 73 74 50 67 20 29 3b 0a 0a 20 20 72  =iLastPg );..  r
d010: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d020: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
d030: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
d040: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
d050: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
d060: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
d070: 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
d080: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
d090: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
d0a0: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
d0b0: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
d0c0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
d0d0: 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  w==0 || sqlite3P
d0e0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d0f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d100: 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >1 );.    assert
d110: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
d120: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
d130: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
d140: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d150: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
d160: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
d170: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
d180: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d190: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
d1a0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
d1b0: 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
d1c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
d1d0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d1e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
d1f0: 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
d200: 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
d210: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
d220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67  .}../*.** During
d230: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65   a rollback, whe
d240: 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f  n the pager relo
d250: 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ads information 
d260: 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a  into the cache.*
d270: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  * so that the ca
d280: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
d290: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
d2a0: 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61  state at the sta
d2b0: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61  rt of.** the tra
d2c0: 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61  nsaction, for ea
d2d0: 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64  ch page restored
d2e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d2f0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d300: 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  his routine need
d310: 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65  s to reset the e
d320: 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f  xtra data sectio
d330: 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  n at the end of 
d340: 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61  the.** page to a
d350: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
d360: 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  stored data..*/.
d370: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
d380: 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70  Reinit(DbPage *p
d390: 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Data){.  MemPage
d3a0: 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65   *pPage;.  pPage
d3b0: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
d3c0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
d3d0: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73  ra(pData);.  ass
d3e0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
d3f0: 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
d400: 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20  ata)>0 );.  if( 
d410: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
d420: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
d430: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d440: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
d450: 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  x) );.    pPage-
d460: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
d470: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
d480: 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
d490: 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  ata)>1 ){.      
d4a0: 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e  /* pPage might n
d4b0: 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61  ot be a btree pa
d4c0: 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65  ge;  it might be
d4d0: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
d4e0: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74  e.      ** or pt
d4f0: 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66  rmap page or a f
d500: 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68  ree page.  In th
d510: 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66  ose cases, the f
d520: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  ollowing.      *
d530: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49  * call to btreeI
d540: 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c  nitPage() will l
d550: 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c  ikely return SQL
d560: 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20  ITE_CORRUPT..   
d570: 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72     ** But no har
d580: 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69  m is done by thi
d590: 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65  s.  And it is ve
d5a0: 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ry important tha
d5b0: 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65  t.      ** btree
d5c0: 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61  InitPage() be ca
d5d0: 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74  lled on every bt
d5e0: 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d  ree page so we m
d5f0: 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ake.      ** the
d600: 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20   call for every 
d610: 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20  page that comes 
d620: 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e  in for re-initin
d630: 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65  g. */.      btre
d640: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
d650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
d660: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
d670: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72  busy handler for
d680: 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61   a btree..*/.sta
d690: 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76  tic int btreeInv
d6a0: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76  okeBusyHandler(v
d6b0: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74  oid *pArg){.  Bt
d6c0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42  Shared *pBt = (B
d6d0: 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20  tShared*)pArg;. 
d6e0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62   assert( pBt->db
d6f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d700: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d710: 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  (pBt->db->mutex)
d720: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
d730: 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
d740: 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e  ndler(&pBt->db->
d750: 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a  busyHandler);.}.
d760: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61  ./*.** Open a da
d770: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
d780: 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73  .** zFilename is
d790: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d7a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
d7b0: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
d7c0: 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64   NULL.** a new d
d7d0: 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72  atabase with a r
d7e0: 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72  andom name is cr
d7f0: 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e  eated.  This ran
d800: 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64  domly named.** d
d810: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
d820: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
d830: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
d840: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
d850: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
d860: 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
d870: 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
d880: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
d890: 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
d8a0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
d8b0: 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
d8c0: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
d8d0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
d8e0: 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
d8f0: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
d900: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d910: 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
d920: 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
d930: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
d940: 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
d950: 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
d960: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
d970: 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
d980: 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
d990: 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
d9a0: 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
d9b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d9c0: 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
d9d0: 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
d9e0: 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
d9f0: 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
da00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
da10: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
da20: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
da30: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
da40: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
da50: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
da60: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
da70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
da80: 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
da90: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
daa0: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
dab0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
dac0: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
dad0: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
dae0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
daf0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
db00: 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
db10: 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
db20: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
db30: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
db40: 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
db50: 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73  Open() */.){.  s
db60: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
db70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
db80: 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   The VFS to use 
db90: 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a  for this btree *
dba0: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
dbb0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
dbc0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
dbd0: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
dbe0: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
dbf0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
dc00: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
dc10: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
dc20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
dc30: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
dc40: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
dc50: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
dc60: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
dc70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
dc80: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
dc90: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
dca0: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
dcb0: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
dcc0: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
dcd0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
dce0: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
dcf0: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
dd00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
dd10: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
dd20: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
dd30: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
dd40: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
dd50: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
dd60: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
dd70: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
dd80: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
dd90: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
dda0: 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79  atabase. This sy
ddb0: 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71  mbol is only req
ddc0: 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69  uired if.  ** ei
ddd0: 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72  ther of the shar
dde0: 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76  ed-data or autov
ddf0: 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61  acuum features a
de00: 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a  re compiled .  *
de10: 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61  * into the libra
de20: 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ry..  */.#if !de
de30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
de40: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
de50: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
de60: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
de70: 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c  UM).  #ifdef SQL
de80: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
de90: 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  B.    const int 
dea0: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23  isMemdb = 0;.  #
deb0: 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
dec0: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69  nt isMemdb = zFi
ded0: 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d  lename && !strcm
dee0: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
def0: 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64  emory:");.  #end
df00: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  if.#endif..  ass
df10: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
df20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
df30: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
df40: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73  utex) );..  pVfs
df50: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70   = db->pVfs;.  p
df60: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
df70: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
df80: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
df90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
dfa0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
dfb0: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
dfc0: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
dfd0: 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
dfe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
dff0: 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
e000: 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
e010: 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
e020: 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
e030: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e040: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
e050: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
e060: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
e070: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
e080: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
e090: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
e0a0: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
e0b0: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
e0c0: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
e0d0: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
e0e0: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
e0f0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d    */.  if( isMem
e100: 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e 61  db==0 && zFilena
e110: 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
e120: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66  0] ){.    if( vf
e130: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
e140: 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
e150: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   ){.      int nF
e160: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56  ullPathname = pV
e170: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
e180: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46  ;.      char *zF
e190: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
e1a0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c  lite3Malloc(nFul
e1b0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e1c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
e1d0: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20  *mutexShared;.  
e1e0: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
e1f0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
e200: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
e210: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e220: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
e230: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e240: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
e250: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75       sqlite3OsFu
e260: 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
e270: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c   zFilename, nFul
e280: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
e290: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
e2a0: 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
e2b0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
e2c0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
e2d0: 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
e2e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e2f0: 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
e300: 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
e310: 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
e320: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
e330: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
e340: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e350: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
e360: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
e370: 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28   for(pBt=GLOBAL(
e380: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
e390: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
e3a0: 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  ); pBt; pBt=pBt-
e3b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
e3c0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
e3d0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ef>0 );.        
e3e0: 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46  if( 0==strcmp(zF
e3f0: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c  ullPathname, sql
e400: 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
e410: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a  e(pBt->pPager)).
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
e440: 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
e450: 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
e460: 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
e470: 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
e480: 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
e490: 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
e4a0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
e4b0: 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
e4c0: 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
e4d0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
e4e0: 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
e4f0: 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e510: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e520: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e540: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e550: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
e560: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e570: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
e580: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
e590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
e5a0: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
e5b0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e5c0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
e5d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
e5e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e5f0: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
e600: 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
e610: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
e620: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e630: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
e640: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
e650: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
e660: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e670: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
e680: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
e690: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
e6a0: 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
e6b0: 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
e6c0: 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
e6d0: 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
e6e0: 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
e6f0: 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
e700: 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
e710: 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
e720: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
e730: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
e740: 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
e750: 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
e760: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
e770: 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
e780: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
e790: 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
e7a0: 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
e7b0: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
e7c0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
e7d0: 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
e7e0: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
e7f0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
e800: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
e810: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
e820: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
e830: 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
e840: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
e850: 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
e860: 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
e870: 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
e880: 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
e890: 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
e8a0: 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
e8b0: 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
e8c0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
e8d0: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
e8e0: 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  || sizeof(i64)==
e8f0: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
e900: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
e910: 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
e920: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
e930: 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
e940: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
e950: 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
e960: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e970: 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
e980: 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
e990: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
e9a0: 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
e9b0: 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
e9c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
e9d0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
e9e0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
e9f0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
ea00: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ea10: 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
ea20: 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
ea30: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
ea50: 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
ea60: 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
ea70: 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
ea80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ea90: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
eaa0: 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
eab0: 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
eac0: 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
ead0: 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
eae0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
eaf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
eb00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
eb10: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
eb20: 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  }.    pBt->db = 
eb30: 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
eb40: 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
eb50: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
eb60: 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
eb70: 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
eb80: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
eb90: 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
eba0: 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
ebb0: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
ebc0: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
ebd0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  = sqlite3PagerIs
ebe0: 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
ebf0: 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
ec00: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
ec10: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31  yte(&zDbHeader[1
ec20: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  6]);.    if( pBt
ec30: 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
ec40: 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
ec50: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
ec60: 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
ec70: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
ec80: 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
ec90: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
eca0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
ecb0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
ecc0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
ecd0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
ece0: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
ecf0: 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
ed00: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
ed10: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
ed20: 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
ed30: 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
ed40: 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
ed50: 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
ed60: 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
ed70: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
ed80: 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
ed90: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
eda0: 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
edb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
edc0: 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
edd0: 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
ede0: 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
edf0: 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
ee00: 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
ee10: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
ee20: 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
ee30: 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
ee40: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ee50: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
ee60: 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
ee70: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
ee80: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
ee90: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
eea0: 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
eeb0: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
eec0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
eed0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
eee0: 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
eef0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ef00: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
ef10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ef20: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
ef30: 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
ef40: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
ef50: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
ef60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ef70: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
ef80: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
ef90: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
efa0: 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
efb0: 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
efc0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
efd0: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
efe0: 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
eff0: 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
f000: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
f010: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
f020: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
f030: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
f040: 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69  nReserve);.    i
f050: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72  f( rc ) goto btr
f060: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
f070: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
f080: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
f090: 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
f0a0: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
f0b0: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
f0c0: 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
f0d0: 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
f0e0: 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21  ize */.   .#if !
f0f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f100: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
f110: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
f120: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
f130: 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
f140: 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
f150: 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
f160: 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
f170: 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
f180: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  */.    if( p->sh
f190: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
f1a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
f1b0: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
f1c0: 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
f1d0: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
f1e0: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
f1f0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
f200: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
f210: 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  R);.      if( SQ
f220: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
f230: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
f240: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
f250: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
f260: 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
f270: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
f280: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
f290: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
f2a0: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
f2b0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f2c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
f2d0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
f2e0: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  iled = 0;.      
f2f0: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
f300: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
f310: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f320: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f330: 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
f340: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
f350: 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
f360: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
f370: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
f380: 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
f390: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
f3a0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
f3b0: 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
f3c0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f3d0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
f3e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
f3f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
f400: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
f410: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
f420: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
f430: 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
f440: 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
f450: 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
f460: 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
f470: 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
f480: 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
f490: 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
f4a0: 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
f4b0: 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
f4c0: 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
f4d0: 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
f4e0: 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
f4f0: 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
f500: 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
f510: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
f520: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
f530: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
f540: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
f550: 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
f560: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f570: 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
f580: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
f590: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
f5a0: 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
f5b0: 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
f5c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74        if( p->pBt
f5d0: 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  <pSib->pBt ){.  
f5e0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
f5f0: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
f600: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
f610: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
f620: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
f630: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f640: 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
f650: 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d  ->pNext && pSib-
f660: 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70  >pNext->pBt<p->p
f670: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
f680: 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
f690: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
f6a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
f6b0: 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
f6c0: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
f6d0: 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
f6e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
f6f0: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
f700: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
f710: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
f720: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f730: 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
f740: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f760: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
f770: 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
f780: 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
f790: 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
f7a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
f7b0: 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
f7c0: 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
f7d0: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
f7e0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
f7f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f800: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
f810: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
f820: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
f830: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74  0;.  }.  if( mut
f840: 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
f850: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f860: 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
f870: 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
f880: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
f890: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
f8a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f8b0: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
f8c0: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
f8d0: 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
f8e0: 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
f8f0: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
f900: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
f910: 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
f920: 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
f930: 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
f940: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
f950: 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
f960: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
f970: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
f980: 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
f990: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f9a0: 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
f9b0: 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
f9c0: 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
f9d0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f9e0: 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ACHE.  sqlite3_m
f9f0: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20  utex *pMaster;. 
fa00: 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
fa10: 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
fa20: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
fa30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
fa40: 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
fa50: 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d  ) );.  pMaster =
fa60: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
fa70: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
fa80: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
fa90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
faa0: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
fab0: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
fac0: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
fad0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
fae0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
faf0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
fb00: 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
fb10: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
fb20: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
fb30: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
fb40: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
fb50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
fb60: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
fb70: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
fb80: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
fb90: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
fba0: 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
fbb0: 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
fbc0: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
fbd0: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
fbe0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
fbf0: 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
fc00: 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
fc10: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
fc20: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
fc30: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
fc40: 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
fc50: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
fc60: 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
fc70: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
fc80: 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
fc90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
fca0: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
fcb0: 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
fcc0: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
fcd0: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
fce0: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
fcf0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
fd00: 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
fd10: 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
fd20: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
fd30: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
fd40: 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
fd50: 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
fd60: 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
fd70: 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
fd80: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
fd90: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
fda0: 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
fdb0: 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ize );.  }.}../*
fdc0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74  .** Free the pBt
fdd0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f  ->pTmpSpace allo
fde0: 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
fdf0: 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70   void freeTempSp
fe00: 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
fe10: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  t){.  sqlite3Pag
fe20: 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70  eFree( pBt->pTmp
fe30: 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70  Space);.  pBt->p
fe40: 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a  TmpSpace = 0;.}.
fe50: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
fe60: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
fe70: 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
fe80: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
fe90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
fea0: 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
feb0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
fec0: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
fed0: 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
fee0: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
fef0: 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
ff00: 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
ff10: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
ff20: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
ff30: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
ff40: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
ff50: 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
ff60: 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
ff70: 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
ff80: 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
ff90: 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
ffa0: 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
ffb0: 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
ffc0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
ffd0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
ffe0: 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
fff0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
10000 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
10010 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
10020 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
10030 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
10040 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
10050 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
10060 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
10070 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
10080 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
10090 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
100a0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
100b0 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  k(p);.  sqlite3B
100c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
100d0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
100e0 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
100f0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
10100 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
10110 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
10120 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
10130 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
10140 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
10150 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
10160 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
10170 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
10180 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
10190 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
101a0 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
101b0 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
101c0 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
101d0 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
101e0 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
101f0 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
10200 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
10210 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
10220 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
10230 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
10240 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
10250 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
10260 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
10270 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
10280 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
10290 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
102a0 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
102b0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
102c0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
102d0 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68  f( pBt->xFreeSch
102e0 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68  ema && pBt->pSch
102f0 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ema ){.      pBt
10300 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
10310 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10320 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
10330 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ree(pBt->pSchema
10340 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
10350 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
10360 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
10370 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
10380 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10390 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
103a0 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
103b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
103c0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
103d0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
103e0 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
103f0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
10400 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
10410 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
10420 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
10430 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
10440 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
10450 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10460 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
10470 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
10480 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65   of pages allowe
10490 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  d in the cache..
104a0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
104b0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  m number of cach
104c0 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74  e pages is set t
104d0 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a  o the absolute.*
104e0 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  * value of mxPag
104f0 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73  e.  If mxPage is
10500 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70   negative, the p
10510 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65  ager will.** ope
10520 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75  rate asynchronou
10530 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f  sly - it will no
10540 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79  t stop to do fsy
10550 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75  nc()s.** to insu
10560 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  re data is writt
10570 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73  en to the disk s
10580 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a  urface before.**
10590 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72   continuing.  Tr
105a0 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
105b0 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f   work if synchro
105c0 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20  nous is off,.** 
105d0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
105e0 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
105f0 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f  pted if this pro
10600 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e  gram.** crashes.
10610 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65    But if the ope
10620 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
10630 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
10640 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70  s.** an abrupt p
10650 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65  ower failure whe
10660 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
10670 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61   off, the databa
10680 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c  se.** could be l
10690 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
106a0 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63  istent and unrec
106b0 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a  overable state..
106c0 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ** Synchronous i
106d0 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  s on by default 
106e0 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  so database corr
106f0 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a  uption is not.**
10700 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72   normally a worr
10710 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
10720 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
10730 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
10740 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
10750 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10760 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
10770 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10780 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10790 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
107a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
107b0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
107c0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
107d0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
107e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
107f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10800 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10810 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
10820 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
10830 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
10840 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
10850 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
10860 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
10870 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
10880 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
10890 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
108a0 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
108b0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
108c0 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
108d0 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
108e0 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
108f0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
10900 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
10910 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
10920 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
10930 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
10940 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
10950 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
10960 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
10970 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
10980 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
10990 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
109a0 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
109b0 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
109c0 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
109d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
109e0 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
109f0 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66  lite3BtreeSetSaf
10a00 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a  etyLevel(Btree *
10a10 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  p, int level, in
10a20 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42  t fullSync){.  B
10a30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10a40 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
10a50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10a60 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10a70 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
10a80 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
10a90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
10aa0 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
10ab0 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
10ac0 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  llSync);.  sqlit
10ad0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
10ae0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10af0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
10b00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
10b10 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74   if the given bt
10b20 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61  ree is set to sa
10b30 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49  fety level 1.  I
10b40 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
10b50 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
10b60 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72   no sync() occur
10b70 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s on the disk fi
10b80 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
10b90 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
10ba0 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  bled(Btree *p){.
10bb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
10bc0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
10bd0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
10be0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10bf0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10c00 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ;  .  sqlite3Btr
10c10 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
10c20 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74  sert( pBt && pBt
10c30 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63  ->pPager );.  rc
10c40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e   = sqlite3PagerN
10c50 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65  osync(pBt->pPage
10c60 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
10c70 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
10c80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
10c90 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
10ca0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
10cb0 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
10cc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
10cd0 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  UM)./*.** Change
10ce0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
10cf0 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
10d00 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
10d10 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
10d20 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
10d30 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
10d40 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
10d50 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
10d60 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
10d70 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
10d80 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
10d90 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
10da0 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
10db0 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
10dc0 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
10dd0 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
10de0 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
10df0 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
10e00 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
10e10 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
10e20 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
10e30 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
10e40 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
10e50 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
10e60 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
10e70 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
10e80 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
10e90 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
10ea0 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
10eb0 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
10ec0 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
10ed0 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
10ee0 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
10ef0 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
10f00 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
10f10 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
10f20 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
10f30 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
10f40 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
10f50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
10f60 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
10f70 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
10f80 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
10f90 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
10fa0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 53 69   then the pageSi
10fb0 7a 65 46 69 78 65 64 20 66 6c 61 67 20 69 73 20  zeFixed flag is 
10fc0 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
10fd0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
10fe0 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
10ff0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
11000 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
11010 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
11020 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
11030 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
11040 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
11050 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
11060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11070 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11080 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
11090 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
110a0 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
110b0 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
110c0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
110d0 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
110e0 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71  eFixed ){.    sq
110f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11100 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
11110 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
11120 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
11130 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
11140 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
11150 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
11160 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
11170 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
11180 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
11190 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
111a0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
111b0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
111c0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
111d0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
111e0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
111f0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
11200 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
11210 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
11220 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
11230 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
11240 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
11250 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65  Size = (u16)page
11260 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
11270 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
11280 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
11290 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
112a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
112b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
112c0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
112d0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
112e0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
112f0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
11300 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 70 61  ( iFix ) pBt->pa
11310 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
11320 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
11330 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
11340 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
11350 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
11360 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
11370 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
11380 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
11390 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
113a0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
113b0 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
113c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
113d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
113e0 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
113f0 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
11400 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
11410 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
11420 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
11430 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
11440 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
11450 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
11460 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a   extensions..*/.
11470 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11480 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
11490 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
114a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
114b0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
114c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
114d0 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
114e0 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
114f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11500 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
11510 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
11520 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
11530 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
11540 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
11550 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
11560 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
11570 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
11580 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
11590 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
115a0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
115b0 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
115c0 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
115d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
115e0 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
115f0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
11600 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
11610 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11620 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
11630 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
11640 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
11650 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
11660 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11670 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
11680 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
11690 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
116a0 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
116b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
116c0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
116d0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
116e0 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
116f0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
11700 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
11710 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
11720 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
11730 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
11740 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
11750 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
11760 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
11770 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
11780 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
11790 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
117a0 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
117b0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
117c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
117d0 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
117e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
117f0 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
11800 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
11810 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
11820 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11830 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
11840 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
11850 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
11860 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11870 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
11880 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
11890 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
118a0 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
118b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
118c0 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
118d0 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a  Fixed && (av ?1:
118e0 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
118f0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
11900 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
11910 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
11920 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
11930 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
11940 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
11950 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
11960 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11970 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11980 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
11990 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
119a0 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
119b0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
119c0 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
119d0 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
119e0 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
119f0 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
11a00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11a10 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
11a20 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
11a30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11a40 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
11a50 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
11a60 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
11a70 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
11a80 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
11a90 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
11aa0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
11ab0 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
11ac0 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
11ad0 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
11ae0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
11af0 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
11b00 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
11b10 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
11b20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11b30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
11b40 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
11b50 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
11b60 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
11b70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11b80 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
11b90 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
11ba0 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
11bb0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
11bc0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
11bd0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
11be0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
11bf0 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
11c00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
11c10 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
11c20 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
11c30 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
11c40 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
11c50 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
11c60 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
11c70 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
11c80 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
11c90 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
11ca0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
11cb0 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
11cc0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  pBt){.  int rc;.
11cd0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
11ce0 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  1;.  int nPage;.
11cf0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11d00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11d10 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
11d20 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
11d30 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
11d40 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
11d50 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67  edLock(pBt->pPag
11d60 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
11d70 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
11d80 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72  n rc;.  rc = btr
11d90 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
11da0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
11db0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11dc0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
11dd0 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
11de0 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
11df0 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
11e00 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
11e10 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
11e20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
11e30 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
11e40 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
11e50 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
11e60 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
11e70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11e80 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
11e90 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c  it_failed;.  }el
11ea0 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  se if( nPage>0 )
11eb0 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69  {.    int pageSi
11ec0 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62  ze;.    int usab
11ed0 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
11ee0 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
11ef0 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
11f00 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
11f10 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
11f20 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
11f30 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
11f40 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
11f50 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
11f60 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
11f70 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
11f80 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
11f90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11fa0 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
11fb0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
11fc0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
11fd0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  }..    /* The ma
11fe0 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66  ximum embedded f
11ff0 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
12000 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e  exactly 25%.  An
12010 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20  d the minimum.  
12020 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72    ** embedded fr
12030 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31  action must be 1
12040 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65  2.5% for both le
12050 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d  af-data and non-
12060 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a  leaf-data..    *
12070 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
12080 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
12090 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
120a0 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
120b0 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
120c0 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
120d0 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
120e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
120f0 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
12100 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
12110 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
12120 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12130 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
12140 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
12150 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
12160 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
12170 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
12180 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53  ize)!=0 || pageS
12190 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20  ize<512 ||.     
121a0 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50     (SQLITE_MAX_P
121b0 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26  AGE_SIZE<32768 &
121c0 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  & pageSize>SQLIT
121d0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
121e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
121f0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
12200 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
12210 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
12220 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
12230 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
12240 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
12250 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  0];.    if( page
12260 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
12270 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
12280 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
12290 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
122a0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
122b0 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
122c0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
122d0 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
122e0 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
122f0 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
12300 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
12310 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
12320 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
12330 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
12340 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
12350 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
12360 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
12370 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
12380 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
12390 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
123a0 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
123b0 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
123c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
123d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
123e0 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
123f0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75  >usableSize = (u
12400 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  16)usableSize;. 
12410 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
12420 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
12430 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
12440 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
12450 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12460 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
12470 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
12480 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
124c0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
124d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
124e0 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
124f0 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
12500 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
12510 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
12520 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
12530 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
12540 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
12550 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65  ze = (u16)usable
12560 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
12570 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12580 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
12590 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
125a0 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
125b0 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
125c0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
125d0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
125e0 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
125f0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
12600 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
12610 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
12620 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
12630 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
12640 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
12650 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
12660 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
12670 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
12680 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
12690 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
126a0 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
126b0 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
126c0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
126d0 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
126e0 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
126f0 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
12700 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
12710 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12720 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
12730 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
12740 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
12750 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
12760 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
12770 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
12780 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
12790 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
127a0 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
127b0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
127c0 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65  yte poiner, a he
127d0 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
127e0 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
127f0 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
12800 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
12810 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
12820 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
12830 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
12840 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
12850 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
12860 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
12870 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
12880 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
12890 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
128a0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
128b0 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78  - 23;.  pBt->max
128c0 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62  Leaf = pBt->usab
128d0 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70  leSize - 35;.  p
128e0 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70  Bt->minLeaf = (p
128f0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
12900 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*32/255 - 23;.
12910 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
12920 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
12930 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
12940 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
12950 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65  1 = pPage1;.  re
12960 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12970 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
12980 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
12990 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
129a0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
129b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
129c0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
129d0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
129e0 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
129f0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
12a00 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
12a10 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
12a20 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
12a30 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
12a40 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
12a50 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
12a60 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
12a70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12a80 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
12a90 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
12aa0 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
12ab0 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
12ac0 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
12ad0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
12ae0 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
12af0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
12b00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
12b10 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
12b20 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
12b30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12b40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
12b50 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
12b60 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72  ssert( pBt->pCur
12b70 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  sor==0 || pBt->i
12b80 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
12b90 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
12ba0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
12bb0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
12bc0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
12bd0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
12be0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
12bf0 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
12c00 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
12c10 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
12c20 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  ger)==1 );.    a
12c30 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
12c40 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
12c50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74   releasePage(pBt
12c60 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70  ->pPage1);.    p
12c70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
12c80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
12c90 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
12ca0 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
12cb0 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
12cc0 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
12cd0 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
12ce0 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
12cf0 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
12d00 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
12d10 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
12d20 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
12d30 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
12d40 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
12d50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
12d60 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
12d70 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  rc;.  int nPage;
12d80 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
12d90 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12da0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
12db0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
12dc0 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
12dd0 20 62 65 65 6e 20 6d 65 61 73 75 72 65 64 20 61   been measured a
12de0 6e 64 20 63 61 63 68 65 64 2c 20 73 6f 20 66 61  nd cached, so fa
12df0 69 6c 75 72 65 0a 20 20 2a 2a 20 69 73 20 69 6d  ilure.  ** is im
12e00 70 6f 73 73 69 62 6c 65 20 68 65 72 65 2e 20 20  possible here.  
12e10 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
12e20 73 69 7a 65 20 6d 65 61 73 75 72 65 6d 65 6e 74  size measurement
12e30 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 0a 20 20   failed, then.  
12e40 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 61 62  ** processing ab
12e50 6f 72 74 73 20 62 65 66 6f 72 65 20 65 6e 74 65  orts before ente
12e60 72 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ring this routin
12e70 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e. */.  rc = sql
12e80 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
12e90 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
12ea0 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 4e  &nPage);.  if( N
12eb0 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f  EVER(rc!=SQLITE_
12ec0 4f 4b 29 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29  OK) || nPage>0 )
12ed0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
12ee0 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
12ef0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
12f00 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
12f10 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
12f20 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
12f30 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
12f40 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
12f50 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12f60 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
12f70 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
12f80 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
12f90 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
12fa0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
12fb0 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74  er)==16 );.  put
12fc0 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c  2byte(&data[16],
12fd0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
12fe0 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
12ff0 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
13000 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
13010 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
13020 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
13030 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
13040 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
13050 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
13060 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
13070 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
13080 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
13090 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
130a0 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
130b0 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
130c0 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
130d0 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
130e0 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
130f0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
13100 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
13110 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
13120 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
13130 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13140 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
13150 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
13160 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
13170 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
13180 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
13190 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
131a0 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
131b0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
131c0 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
131d0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
131e0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
131f0 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
13200 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
13210 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
13220 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13230 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
13240 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
13250 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
13260 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
13270 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
13280 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
13290 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
132a0 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
132b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
132c0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
132d0 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
132e0 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
132f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
13300 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
13310 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
13320 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
13330 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
13340 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
13350 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
13360 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
13370 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
13380 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
13390 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
133a0 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
133b0 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
133c0 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
133d0 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
133e0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
133f0 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
13400 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
13410 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
13420 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
13430 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
13440 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
13450 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
13460 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
13470 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
13480 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
13490 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
134a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
134b0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
134c0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
134d0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
134e0 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
134f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
13500 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
13510 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
13520 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
13530 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
13540 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
13550 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
13560 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
13570 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
13580 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
13590 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
135a0 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
135b0 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
135c0 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
135d0 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
135e0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
135f0 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
13600 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
13610 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
13620 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
13630 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
13640 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
13650 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
13660 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
13670 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
13680 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
13690 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
136a0 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
136b0 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
136c0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
136d0 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
136e0 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
136f0 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
13700 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
13710 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
13720 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
13730 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
13740 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
13750 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
13760 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
13770 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
13780 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
13790 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
137a0 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
137b0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
137c0 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
137d0 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
137e0 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
137f0 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
13800 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
13810 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
13820 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
13830 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
13840 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
13850 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
13860 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
13870 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
13880 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
13890 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
138a0 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
138b0 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
138c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
138d0 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
138e0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
138f0 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
13900 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
13910 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13920 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
13930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
13940 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13950 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
13960 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
13970 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
13980 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
13990 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
139a0 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
139b0 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
139c0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
139d0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
139e0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
139f0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
13a00 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
13a10 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
13a20 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
13a30 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
13a40 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
13a50 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
13a60 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
13a70 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
13a80 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
13a90 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
13aa0 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
13ab0 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72   */.  if( pBt->r
13ac0 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61  eadOnly && wrfla
13ad0 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
13ae0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
13af0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
13b00 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
13b10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
13b20 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
13b30 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
13b40 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
13b50 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
13b60 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13b70 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
13b80 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
13b90 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
13ba0 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
13bb0 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
13bc0 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
13bd0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
13be0 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
13bf0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
13c00 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
13c10 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73  RITE) || pBt->is
13c20 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70  Pending ){.    p
13c30 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
13c40 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
13c50 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
13c60 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
13c70 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
13c80 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
13c90 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
13ca0 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
13cb0 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
13cc0 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
13cd0 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
13ce0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
13cf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13d00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13d10 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
13d20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
13d30 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
13d40 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
13d50 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
13d60 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
13d70 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
13d80 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
13d90 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
13da0 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
13db0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
13dc0 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
13dd0 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
13de0 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
13df0 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
13e00 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
13e10 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
13e20 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
13e30 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
13e40 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
13e50 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
13e60 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
13e70 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
13e80 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
13e90 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
13ea0 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
13eb0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 64  rans_begun;..  d
13ec0 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
13ed0 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
13ee0 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
13ef0 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
13f00 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
13f10 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
13f20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
13f30 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
13f40 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
13f50 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
13f60 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
13f70 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
13f80 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
13f90 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
13fa0 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
13fb0 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
13fc0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
13fd0 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
13fe0 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
13ff0 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
14000 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
14010 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
14020 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
14030 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
14040 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
14050 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
14060 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
14070 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
14080 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
14090 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
140a0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
140b0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
140c0 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
140d0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
140e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
140f0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
14100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14110 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14120 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
14130 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73  Pager,wrflag>1,s
14140 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
14150 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  ry(p->db));.    
14160 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14180 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
14190 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
141a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
141b0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
141c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
141d0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
141e0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
141f0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63    }.  }while( rc
14200 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
14210 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14220 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
14230 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
14240 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
14250 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
14260 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14270 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
14280 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
14290 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
142a0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
142b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
142c0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
142d0 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
142e0 68 61 72 61 62 6c 65 20 29 7b 0a 09 61 73 73 65  harable ){..asse
142f0 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
14300 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
14310 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
14320 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
14330 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
14340 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
14350 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
14360 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
14370 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
14380 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
14390 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
143a0 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
143b0 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
143c0 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
143d0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
143e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
143f0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
14400 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
14410 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
14420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14430 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14440 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  E.    if( wrflag
14450 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14460 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
14470 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
14480 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
14490 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76   pBt->isExclusiv
144a0 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e  e = (u8)(wrflag>
144b0 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  1);.    }.#endif
144c0 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
144d0 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
144e0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
144f0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
14500 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
14510 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
14520 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
14530 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
14540 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
14550 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
14560 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
14570 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
14580 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
14590 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
145a0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
145b0 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
145c0 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
145d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
145e0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
145f0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
14600 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
14610 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
14620 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
14630 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14640 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14650 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
14660 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14670 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
14680 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
14690 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
146a0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
146b0 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
146c0 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
146d0 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
146e0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
146f0 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
14700 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
14710 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
14720 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
14730 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
14740 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
14750 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
14760 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
14790 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
147a0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
147d0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
147e0 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
147f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14810 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
14820 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14830 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
14840 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
14850 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
14860 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
14870 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
14880 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14890 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
148a0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
148b0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
148c0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
148d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
148e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
148f0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
14900 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
14910 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
14920 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
14930 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
14940 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
14950 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
14960 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
14970 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
14980 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
14990 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
149a0 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
149b0 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
149c0 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
149d0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
149e0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
149f0 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
14a00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
14a10 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
14a20 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
14a30 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
14a40 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
14a50 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
14a60 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
14a70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
14a80 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
14a90 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
14aa0 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
14ab0 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
14ac0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
14ad0 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
14ae0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
14af0 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
14b00 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
14b10 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
14b20 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
14b30 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
14b40 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
14b50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
14b60 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
14b70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
14b80 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
14b90 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
14ba0 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
14bb0 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
14bc0 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
14bd0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
14be0 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
14c10 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
14c20 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
14c30 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
14c40 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
14c50 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
14c60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
14c70 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
14c80 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
14c90 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
14ca0 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
14cb0 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
14cc0 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
14cd0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
14ce0 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
14cf0 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
14d00 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
14d10 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
14d20 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
14d30 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
14d40 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
14d50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
14d60 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
14d70 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
14d80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14d90 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
14da0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
14db0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
14dc0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
14dd0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
14de0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
14df0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
14e00 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
14e10 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
14e20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
14e30 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
14e40 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
14e50 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
14e60 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
14e70 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
14e80 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14e90 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
14ea0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
14eb0 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
14ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
14ed0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
14ee0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
14ef0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
14f00 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
14f10 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
14f20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
14f30 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
14f40 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
14f50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
14f60 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
14f70 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
14f80 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
14f90 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
14fa0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
14fb0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
14fc0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
14fd0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
14fe0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
14ff0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
15000 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
15010 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
15020 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
15030 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
15040 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
15050 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
15060 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
15070 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
15080 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
15090 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
150a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
150b0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
150c0 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
150d0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
150e0 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
150f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15110 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
15120 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
15130 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
15140 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
15150 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
15160 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
15170 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
15180 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
15190 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
151a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
151b0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
151c0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
151d0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
151e0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
151f0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
15200 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
15210 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
15220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15230 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
15240 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
15250 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
15260 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
15270 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
15280 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
15290 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
152a0 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
152b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
152c0 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
152d0 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
152e0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
152f0 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
15300 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
15310 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
15320 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
15330 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
15340 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
15350 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
15360 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
15370 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
15380 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
15390 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
153a0 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
153b0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
153c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
153d0 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
153e0 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
153f0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
15400 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
15410 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
15420 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
15430 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
15440 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
15450 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
15460 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
15470 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
15480 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
15490 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
154a0 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
154b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
154c0 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
154d0 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
154e0 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
154f0 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
15500 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
15510 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
15520 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
15530 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
15540 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
15550 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
15560 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
15570 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
15580 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
15590 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
155a0 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
155b0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
155c0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
155d0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
155e0 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
155f0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
15600 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
15610 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
15620 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
15630 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
15640 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15650 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
15660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
15670 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
15680 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
15690 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
156a0 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
156b0 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
156c0 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
156d0 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
156e0 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
156f0 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
15700 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
15710 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
15720 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
15730 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
15740 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
15750 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
15760 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
15770 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
15780 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
15790 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
157a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
157b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
157c0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
157d0 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
157e0 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
157f0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
15800 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
15810 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
15820 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
15830 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
15840 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
15850 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
15860 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
15870 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
15880 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
15890 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
158a0 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
158b0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
158c0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
158d0 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
158e0 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
158f0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
15900 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
15910 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
15920 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
15930 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
15940 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
15950 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
15960 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
15970 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
15980 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
15990 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
159a0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
159b0 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
159c0 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
159d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
159e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
159f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
15a00 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
15a10 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
15a20 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
15a30 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
15a40 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
15a50 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
15a60 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
15a70 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
15a80 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
15a90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15aa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15ab0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15ac0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15ad0 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
15ae0 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
15af0 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
15b00 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
15b10 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
15b20 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
15b30 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
15b40 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
15b50 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
15b60 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
15b70 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
15b80 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
15b90 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
15ba0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
15bb0 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
15bc0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
15bd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15be0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15bf0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
15c00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
15c10 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
15c20 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
15c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15c40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
15c50 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
15c60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15c70 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
15c80 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
15c90 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
15ca0 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
15cb0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
15cc0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
15cd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15ce0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
15cf0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
15d00 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
15d10 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
15d20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15d30 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
15d40 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
15d50 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
15d60 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
15d70 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
15d80 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
15d90 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
15da0 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
15db0 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
15dc0 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
15dd0 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
15de0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
15df0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
15e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15e10 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
15e20 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
15e30 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a  d therefore no.*
15e40 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69  * point in calli
15e50 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
15e60 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
15e70 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
15e80 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
15e90 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
15ea0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
15eb0 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a  -organize the .*
15ec0 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  * database so th
15ed0 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
15ee0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
15ef0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a  rently in use.**
15f00 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
15f10 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   use..**.** If t
15f20 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65  he nFin paramete
15f30 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
15f40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
15f50 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
15f60 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
15f70 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
15f80 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
15f90 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
15fa0 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
15fb0 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
15fc0 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
15fd0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
15fe0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15ff0 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
16000 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
16010 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
16020 65 2e 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a  e.  If nFin is z
16030 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
16040 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56  ed that.** incrV
16050 61 63 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c  acuumStep() will
16060 20 62 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e   be called a fin
16070 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  ite amount of ti
16080 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79  mes.** which may
16090 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74   or may not empt
160a0 79 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  y the freelist. 
160b0 20 41 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75   A full autovacu
160c0 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30  um.** has nFin>0
160d0 2e 20 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63  .  A "PRAGMA inc
160e0 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22  remental_vacuum"
160f0 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f   has nFin==0..*/
16100 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
16110 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
16120 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
16130 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
16140 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  g){.  Pgno nFree
16150 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
16160 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
16170 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
16180 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
16190 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
161a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
161b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
161c0 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
161d0 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
161e0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
161f0 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
16200 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
16210 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
16220 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38    int rc;.    u8
16230 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
16240 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
16250 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
16260 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
16270 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
16280 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
16290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
162a0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
162b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
162c0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
162d0 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
162e0 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
162f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16300 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
16310 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
16320 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
16330 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
16340 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16350 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16360 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
16370 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
16380 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
16390 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20  if( nFin==0 ){. 
163a0 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
163b0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
163c0 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
163d0 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
163e0 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
163f0 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e   ** if nFin is n
16400 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
16410 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
16420 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
16430 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
16440 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
16450 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
16460 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
16470 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
16480 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
16490 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
164a0 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
164b0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
164c0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
164d0 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
164e0 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
164f0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
16500 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
16510 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
16520 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31  eePg, iLastPg, 1
16530 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16540 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16550 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16560 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
16570 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
16580 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
16590 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
165a0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
165b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
165c0 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
165d0 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
165e0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
165f0 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
16600 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
16610 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
16620 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20  *pLastPg;..     
16630 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
16640 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
16650 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
16660 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16680 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16690 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
166a0 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20  f nFin is zero, 
166b0 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
166c0 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
166d0 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
166e0 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
166f0 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
16700 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
16710 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
16720 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
16730 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
16740 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e  er hand, if nFin
16750 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
16760 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
16770 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
16780 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
16790 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
167a0 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
167b0 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
167c0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
167d0 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
167e0 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
167f0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
16800 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
16810 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
16820 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
16830 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20  g, &iFreePg, 0, 
16840 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
16850 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16860 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
16870 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
16880 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
16890 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
168a0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
168b0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
168c0 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e      }while( nFin
168d0 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e  !=0 && iFreePg>n
168e0 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
168f0 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
16900 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
16910 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16920 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73  3PagerWrite(pLas
16930 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  tPg->pDbPage);. 
16940 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16960 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
16970 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
16980 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
16990 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e  e, iFreePg, nFin
169a0 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
169b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
169c0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
169d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
169e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
169f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
16a00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
16a10 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
16a20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77  iLastPg--;.    w
16a30 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
16a40 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
16a50 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53  (pBt)||PTRMAP_IS
16a60 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
16a70 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  g) ){.      if( 
16a80 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
16a90 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20  t, iLastPg) ){. 
16aa0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
16ab0 70 50 67 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  pPg;.        int
16ac0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
16ad0 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
16ae0 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20   &pPg, 0);.     
16af0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16b00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
16b30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16b40 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
16b50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
16b60 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
16b70 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16b80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16b90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16ba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16bb0 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   }.      iLastPg
16bc0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  --;.    }.    sq
16bd0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
16be0 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
16bf0 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20  ger, iLastPg);. 
16c00 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16c10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16c20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
16c30 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
16c40 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
16c50 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
16c60 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
16c70 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
16c80 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
16c90 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
16ca0 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
16cb0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
16cc0 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
16cd0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
16ce0 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
16cf0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
16d00 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
16d10 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
16d20 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
16d30 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
16d40 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
16d50 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
16d60 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
16d70 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
16d80 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
16d90 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
16da0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
16db0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16dc0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16dd0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
16de0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
16df0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
16e00 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
16e10 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
16e20 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
16e30 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
16e40 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
16e50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
16e60 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
16e70 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
16e80 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
16e90 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 70  umStep(pBt, 0, p
16ea0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
16eb0 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t));.  }.  sqlit
16ec0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16ed0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16ee0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
16ef0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
16f00 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
16f10 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
16f20 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
16f30 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
16f40 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
16f50 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
16f60 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
16f70 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
16f80 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
16f90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16fa0 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
16fb0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
16fc0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
16fd0 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
16fe0 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
16ff0 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
17000 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
17010 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
17020 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
17030 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
17040 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
17050 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
17060 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
17070 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
17080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17090 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
170a0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
170b0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
170c0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
170d0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
170e0 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
170f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17100 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
17110 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
17120 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
17130 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
17140 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
17150 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
17160 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
17170 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
17180 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17190 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
171a0 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
171b0 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
171c0 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
171d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
171e0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
171f0 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
17200 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70      Pgno nPtrmap
17210 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
17220 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
17230 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
17240 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
17250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
17260 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
17270 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  eed */.    int n
17280 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 2f 2a  Entry;        /*
17290 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
172a0 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
172b0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
172c0 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
172d0 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
172e0 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
172f0 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
17300 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
17310 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
17320 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
17330 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
17340 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
17350 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
17360 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
17370 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
17380 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
17390 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
173a0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
173b0 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
173c0 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
173d0 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
173e0 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
173f0 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
17400 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
17410 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
17420 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
17430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
17440 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
17450 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
17460 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
17470 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
17480 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  .    nEntry = pB
17490 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
174a0 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  .    nPtrmap = (
174b0 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
174c0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
174d0 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
174e0 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  ntry;.    nFin =
174f0 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
17500 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66   nPtrmap;.    if
17510 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
17520 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
17530 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
17540 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
17550 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
17560 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
17570 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
17580 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
17590 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
175a0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
175b0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
175c0 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
175d0 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
175e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
175f0 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
17600 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
17610 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
17620 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
17630 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
17640 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
17650 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
17660 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
17670 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
17680 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
17690 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
176a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
176b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
176c0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
176d0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
176e0 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
176f0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
17700 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
17710 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
17720 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
17730 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
17740 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
17750 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
17760 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  >pPager, nFin);.
17770 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
17780 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17790 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
177a0 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
177b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
177c0 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71  assert( nRef==sq
177d0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
177e0 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
177f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
17800 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
17810 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
17820 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
17830 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
17840 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
17850 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
17860 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
17870 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
17880 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
17890 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
178a0 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
178b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
178c0 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
178d0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
178e0 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
178f0 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
17900 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
17910 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
17920 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
17930 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
17940 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
17950 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
17960 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
17970 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
17980 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
17990 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
179a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
179b0 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
179c0 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
179d0 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
179e0 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
179f0 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
17a00 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
17a10 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
17a20 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17a30 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
17a40 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
17a50 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
17a60 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
17a70 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
17a80 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
17a90 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
17aa0 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
17ab0 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
17ac0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
17ad0 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
17ae0 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
17af0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
17b00 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
17b10 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
17b20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
17b30 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
17b40 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
17b50 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
17b60 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
17b70 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
17b80 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
17b90 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
17ba0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
17bb0 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
17bc0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
17bd0 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
17be0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
17bf0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
17c00 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
17c10 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
17c20 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
17c30 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
17c40 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
17c50 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
17c60 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
17c70 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
17c80 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
17c90 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
17ca0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17cb0 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
17cc0 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
17cd0 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
17ce0 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
17cf0 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
17d00 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
17d10 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
17d20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
17d30 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
17d40 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
17d50 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
17d60 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
17d70 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
17d80 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
17d90 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
17da0 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
17db0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
17dc0 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
17dd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
17de0 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
17df0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
17e00 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
17e10 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
17e20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17e30 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
17e40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17e50 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
17e60 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17e70 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
17e80 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
17e90 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
17ea0 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
17eb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17ec0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17ed0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
17ee0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
17ef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17f00 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
17f10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17f20 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
17f30 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
17f40 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
17f50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
17f60 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
17f70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17f80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17f90 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
17fa0 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
17fb0 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
17fc0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
17fd0 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
17fe0 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
17ff0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
18000 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
18010 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
18020 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
18030 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
18040 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
18050 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
18060 29 20 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c 65  ) );..  btreeCle
18070 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
18080 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  );.  if( p->inTr
18090 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
180a0 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65 56  & p->db->activeV
180b0 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20  dbeCnt>1 ){.    
180c0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
180d0 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61  other active sta
180e0 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c  tements that bel
180f0 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61  ong to this data
18100 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64  base.    ** hand
18110 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f  le, downgrade to
18120 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
18130 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74  nsaction. The ot
18140 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20  her statements. 
18150 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20     ** may still 
18160 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  be reading from 
18170 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  the database.  *
18180 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41  /.    downgradeA
18190 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
181a0 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
181b0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
181c0 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  NS_READ;.  }else
181d0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
181e0 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b  handle had any k
181f0 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69  ind of transacti
18200 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65  on open, decreme
18210 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74  nt the .    ** t
18220 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
18230 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
18240 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
18250 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a  nsaction count .
18260 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30      ** reaches 0
18270 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  , set the shared
18280 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
18290 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
182a0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a  BtreeIfUnused().
182b0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f      ** call belo
182c0 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68  w will unlock th
182d0 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20  e pager.  */.   
182e0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
182f0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
18300 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61       clearAllSha
18310 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
18320 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74  ks(p);.      pBt
18330 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
18340 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
18350 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
18360 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
18370 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
18380 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
18390 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
183a0 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
183b0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
183c0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
183d0 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  NE and unlock th
183e0 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  e .    ** pager 
183f0 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f  if this call clo
18400 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61  sed the only rea
18410 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
18420 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  action.  */.    
18430 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
18440 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c  NS_NONE;.    unl
18450 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
18460 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
18470 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
18480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
18490 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
184a0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
184b0 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ogress..**.** Th
184c0 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
184d0 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64  ments the second
184e0 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68   phase of a 2-ph
184f0 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65  ase commit.  The
18500 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
18510 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
18520 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
18530 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
18540 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69  d should.** be i
18550 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20  nvoked prior to 
18560 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
18570 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
18580 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
18590 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69  seOne().** routi
185a0 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77  ne did all the w
185b0 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
185c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
185d0 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
185e0 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
185f0 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
18600 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
18610 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
18620 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
18630 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
18640 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
18650 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
18660 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74   the header in t
18670 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  he.** the rollba
18680 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63  ck journal (whic
18690 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61  h causes the tra
186a0 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d  nsaction to comm
186b0 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20  it) and.** drop 
186c0 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  locks..**.** Thi
186d0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
186e0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
186f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18700 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
18710 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
18720 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
18730 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
18740 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
18750 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
18760 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20  tPhaseTwo(Btree 
18770 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
18780 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
18790 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
187a0 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
187b0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
187c0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
187d0 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
187e0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
187f0 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
18800 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
18810 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
18820 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
18830 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
18840 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
18850 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
18860 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
18870 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
18880 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
18890 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
188a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
188b0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
188c0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
188d0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
188e0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
188f0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
18900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
18920 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
18930 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18940 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54    }.    pBt->inT
18950 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
18960 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  NS_READ;.  }..  
18970 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
18980 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
18990 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
189a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
189b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
189c0 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
189d0 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
189e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
189f0 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
18a00 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
18a10 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18a20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
18a30 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
18a40 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
18a50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18a60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18a70 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
18a80 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71  Two(p);.  }.  sq
18a90 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18aa0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
18ab0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
18ac0 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
18ad0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72  the number of wr
18ae0 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e  ite-cursors open
18af0 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   on this handle.
18b00 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
18b10 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
18b20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
18b30 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
18b40 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
18b50 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
18b60 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
18b70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
18b80 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65  routine, a write
18b90 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63  -cursor is any c
18ba0 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
18bb0 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74   capable of writ
18bc0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
18bd0 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  se.  That means 
18be0 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a  the cursor was.*
18bf0 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65  * originally ope
18c00 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ned for writing 
18c10 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 68  and the cursor h
18c20 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c  as not be disabl
18c30 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20  ed.** by having 
18c40 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67 65  its state change
18c50 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  d to CURSOR_FAUL
18c60 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
18c70 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
18c80 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
18c90 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
18ca0 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
18cb0 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
18cc0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
18cd0 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
18ce0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  t){.    if( pCur
18cf0 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75 72  ->wrFlag && pCur
18d00 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
18d10 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
18d20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
18d30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
18d40 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
18d50 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
18d60 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
18d70 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
18d80 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
18d90 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
18da0 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
18db0 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
18dc0 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  es..**.** Every 
18dd0 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65  cursor is trippe
18de0 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
18df0 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  sors that belong
18e00 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74  .** to other dat
18e10 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18e20 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
18e30 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74   be sharing.** t
18e40 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
18e50 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
18e60 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
18e70 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
18e80 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20  back occurs..** 
18e90 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e  All cursors usin
18ea0 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  g the same cache
18eb0 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64   must be tripped
18ec0 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74  .** to prevent t
18ed0 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  hem from trying 
18ee0 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65  to use the btree
18ef0 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f   after.** the ro
18f00 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c  llback.  The rol
18f10 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
18f20 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a  eleted tables.**
18f30 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70   or moved root p
18f40 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e  ages, so it is n
18f50 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  ot sufficient to
18f60 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61  .** save the sta
18f70 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
18f80 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  .  The cursor mu
18f90 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
18fa0 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
18fb0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
18fc0 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
18fd0 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
18fe0 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ode){.  BtCursor
18ff0 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   *p;.  sqlite3Bt
19000 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
19010 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65  ;.  for(p=pBtree
19020 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
19030 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
19040 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
19050 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
19060 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70  Cursor(p);.    p
19070 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
19080 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e  R_FAULT;.    p->
19090 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f  skipNext = errCo
190a0 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  de;.    for(i=0;
190b0 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b   i<=p->iPage; i+
190c0 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
190d0 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b  ePage(p->apPage[
190e0 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  i]);.      p->ap
190f0 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
19100 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
19110 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
19120 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  e);.}../*.** Rol
19130 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
19140 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
19150 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  s.  All cursors 
19160 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  will be.** inval
19170 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  ided by this ope
19180 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74  ration.  Any att
19190 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75  empt to use a cu
191a0 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73  rsor.** that was
191b0 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67   open at the beg
191c0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  inning of this o
191d0 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65  peration will re
191e0 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72  sult.** in an er
191f0 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
19200 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
19210 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
19220 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19230 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
19240 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
19250 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
19260 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
19270 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
19280 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
19290 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  k(Btree *p){.  i
192a0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
192b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
192c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
192d0 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  e1;..  sqlite3Bt
192e0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
192f0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
19300 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23  rs(pBt, 0, 0);.#
19310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19320 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
19330 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19340 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
19350 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65  is is a horrible
19360 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49   situation. An I
19370 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
19380 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68 69  ror occurred whi
19390 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e  lst.    ** tryin
193a0 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72  g to save cursor
193b0 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74   positions. If t
193c0 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61  his is an automa
193d0 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73  tic rollback (as
193e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75  .    ** the resu
193f0 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69  lt of a constrai
19400 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  nt, malloc() fai
19410 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72  lure or IO error
19420 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  ) then .    ** t
19430 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65 20  he cache may be 
19440 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e  internally incon
19450 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e  sistent (not con
19460 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73  tain valid trees
19470 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63  ) so.    ** we c
19480 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74  annot simply ret
19490 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f  urn the error to
194a0 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73   the caller. Ins
194b0 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20  tead, abort .   
194c0 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20   ** all queries 
194d0 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e  that may be usin
194e0 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72  g any of the cur
194f0 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65 64  sors that failed
19500 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f   to save..    */
19510 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
19520 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
19530 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64  p, rc);.  }.#end
19540 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  if.  btreeIntegr
19550 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
19560 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
19570 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
19580 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
19590 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
195a0 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
195b0 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
195c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
195d0 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
195e0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
195f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19600 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
19610 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
19620 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
19630 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
19640 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
19650 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
19660 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
19670 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
19680 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
19690 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
196a0 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
196b0 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
196c0 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
196d0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
196e0 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
196f0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
19700 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
19710 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
19720 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
19730 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
19740 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
19750 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
19760 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
19770 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
19780 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19790 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
197a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
197b0 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
197c0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
197d0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
197e0 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f  on can can be ro
197f0 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
19800 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
19810 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
19820 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
19830 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
19840 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
19850 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
19860 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
19870 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
19880 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
19890 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
198a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
198b0 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
198c0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
198d0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
198e0 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
198f0 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
19900 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
19910 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
19920 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
19930 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
19940 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
19950 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
19960 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
19970 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
19980 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
19990 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
199a0 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
199b0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
199c0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
199d0 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
199e0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
199f0 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
19a00 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
19a10 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
19a20 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
19a30 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
19a40 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
19a50 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
19a60 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
19a70 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
19a80 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
19a90 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
19aa0 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
19ab0 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
19ac0 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
19ad0 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
19ae0 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
19af0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
19b00 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
19b10 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
19b20 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
19b30 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
19b40 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
19b50 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
19b60 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
19b70 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
19b80 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
19b90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
19ba0 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
19bb0 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
19bc0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
19bd0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19be0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
19bf0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
19c00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
19c10 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
19c20 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
19c30 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  Bt->readOnly==0 
19c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
19c50 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
19c60 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
19c70 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
19c80 69 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  int );.  if( NEV
19c90 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  ER(p->inTrans!=T
19ca0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 42  RANS_WRITE || pB
19cb0 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a  t->readOnly) ){.
19cc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19cd0 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73  INTERNAL;.  }els
19ce0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
19cf0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
19d00 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
19d10 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65 20  ;.    /* At the 
19d20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
19d30 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
19d40 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
19d50 69 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  int with.    ** 
19d60 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
19d70 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f   than all savepo
19d80 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ints created exp
19d90 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20  licitly using.  
19da0 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
19db0 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
19dc0 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
19dd0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
19de0 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  any.    ** such 
19df0 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
19e00 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
19e10 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
19e20 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
19e30 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
19e40 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
19e50 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
19e60 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e  Pager, iStatemen
19e70 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
19e80 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19e90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19ea0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
19eb0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
19ec0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20  s function, op, 
19ed0 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f  is always SAVEPO
19ee0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20  INT_ROLLBACK.** 
19ef0 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
19f00 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74  EASE. This funct
19f10 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61  ion either relea
19f20 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  ses or rolls bac
19f30 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69  k the.** savepoi
19f40 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
19f50 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65   parameter iSave
19f60 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67  point, depending
19f70 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a   on the value .*
19f80 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e  * of op..**.** N
19f90 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f  ormally, iSavepo
19fa0 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
19fb0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
19fc0 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69  zero. However, i
19fd0 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50  f op is.** SAVEP
19fe0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
19ff0 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d  hen iSavepoint m
1a000 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49  ay also be -1. I
1a010 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
1a020 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1a030 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
1a040 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65  action are rolle
1a050 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
1a060 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f  different.** fro
1a070 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73  m a normal trans
1a080 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c  action rollback,
1a090 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   as no locks are
1a0a0 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68   released and th
1a0b0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1a0c0 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a   remains open..*
1a0d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a0e0 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65  eeSavepoint(Btre
1a0f0 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1a100 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
1a110 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a120 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20  _OK;.  if( p && 
1a130 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1a140 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
1a150 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1a160 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
1a170 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
1a180 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
1a190 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1a1a0 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
1a1b0 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
1a1c0 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d  || (iSavepoint==
1a1d0 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  -1 && op==SAVEPO
1a1e0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b  INT_ROLLBACK) );
1a1f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1a200 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
1a210 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a220 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1a230 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65  Pager, op, iSave
1a240 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  point);.    if( 
1a250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a260 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44  .      rc = newD
1a270 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
1a280 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1a290 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a2a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a2b0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1a2c0 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
1a2d0 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
1a2e0 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
1a2f0 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
1a300 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
1a310 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1a320 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
1a330 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
1a340 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
1a350 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
1a360 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
1a370 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
1a380 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
1a390 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
1a3a0 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
1a3b0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
1a3c0 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
1a3d0 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
1a3e0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1a3f0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  n..**.** If wrFl
1a400 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
1a410 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
1a420 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
1a430 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
1a440 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
1a450 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
1a460 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
1a470 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
1a480 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
1a490 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
1a4a0 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
1a4b0 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
1a4c0 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
1a4d0 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
1a4e0 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
1a4f0 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
1a500 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
1a510 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
1a520 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
1a530 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
1a540 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
1a550 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1a560 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
1a570 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
1a580 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
1a590 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
1a5a0 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
1a5b0 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
1a5c0 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
1a5d0 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
1a5e0 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
1a5f0 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
1a600 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
1a610 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
1a620 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
1a630 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
1a640 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
1a650 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
1a660 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
1a670 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1a680 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
1a690 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
1a6a0 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
1a6b0 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
1a6c0 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
1a6d0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
1a6e0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
1a6f0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
1a700 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
1a710 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
1a720 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
1a730 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
1a740 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
1a750 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
1a760 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1a770 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
1a780 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
1a790 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
1a7a0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1a7b0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
1a7c0 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
1a7d0 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
1a7e0 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
1a7f0 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
1a800 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
1a810 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
1a820 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
1a830 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
1a840 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a870 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1a880 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1a8b0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1a8c0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1a8d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a8f0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1a900 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1a910 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1a920 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1a930 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1a940 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
1a950 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
1a960 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a980 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
1a990 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
1a9a0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1a9b0 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
1a9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
1a9d0 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
1a9e0 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
1a9f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1aa00 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1aa10 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1aa20 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
1aa30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1aa40 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
1aa50 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
1aa60 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
1aa70 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
1aa80 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
1aa90 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1aaa0 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
1aab0 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
1aac0 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
1aad0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
1aae0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
1aaf0 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
1ab00 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
1ab10 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
1ab20 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
1ab30 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
1ab40 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
1ab50 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77  , pKeyInfo!=0, w
1ab60 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73  rFlag+1) );.  as
1ab70 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1ab80 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
1ab90 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
1aba0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
1abb0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1abc0 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
1abd0 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
1abe0 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
1abf0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1ac00 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
1ac10 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1ac20 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
1ac30 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
1ac40 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
1ac50 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
1ac60 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69  1->aData );..  i
1ac70 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20  f( NEVER(wrFlag 
1ac80 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  && pBt->readOnly
1ac90 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1aca0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1acb0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
1acc0 65 3d 3d 31 20 26 26 20 70 61 67 65 72 50 61 67  e==1 && pagerPag
1acd0 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
1ace0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1acf0 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a  ITE_EMPTY;.  }..
1ad00 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
1ad10 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
1ad20 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
1ad30 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
1ad40 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
1ad50 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
1ad60 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
1ad70 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
1ad80 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
1ad90 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
1ada0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
1adb0 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
1adc0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
1add0 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
1ade0 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
1adf0 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
1ae00 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
1ae10 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70   (u8)wrFlag;.  p
1ae20 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
1ae30 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
1ae40 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1ae50 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1ae60 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20  >pPrev = pCur;. 
1ae70 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f   }.  pBt->pCurso
1ae80 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
1ae90 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1aea0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75  R_INVALID;.  pCu
1aeb0 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d  r->cachedRowid =
1aec0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
1aed0 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
1aee0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1aef0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1af30 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af60 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
1af70 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1af80 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
1af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1afb0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1afc0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1afd0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1afe0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1aff0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1b000 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
1b010 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
1b020 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b040 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
1b050 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
1b060 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1b070 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1b080 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
1b090 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
1b0a0 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
1b0b0 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73  Info, pCur);.  s
1b0c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1b0d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1b0e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1b0f0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
1b100 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1b110 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
1b120 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
1b130 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
1b140 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
1b150 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
1b160 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
1b170 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
1b180 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1b190 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1b1a0 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
1b1b0 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
1b1c0 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
1b1d0 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
1b1e0 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
1b1f0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1b200 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b210 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
1b220 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
1b230 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
1b240 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
1b250 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
1b260 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
1b270 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
1b280 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
1b290 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
1b2a0 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
1b2b0 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
1b2c0 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
1b2d0 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
1b2e0 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
1b2f0 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
1b300 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
1b310 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
1b320 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
1b330 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
1b340 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
1b350 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
1b360 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
1b370 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
1b380 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1b390 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
1b3a0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1b3b0 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
1b3c0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
1b3d0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
1b3e0 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
1b3f0 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a  , iPage));.}../*
1b400 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63 68  .** Set the cach
1b410 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f  ed rowid value o
1b420 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 69  f every cursor i
1b430 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
1b440 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70  ase file.** as p
1b450 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74  Cur and having t
1b460 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67  he same root pag
1b470 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72  e number as pCur
1b480 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a  .  The value is.
1b490 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64  ** set to iRowid
1b4a0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73  ..**.** Only pos
1b4b0 69 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75  itive rowid valu
1b4c0 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
1b4d0 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73  d valid for this
1b4e0 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63   cache..** The c
1b4f0 61 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69  ache is initiali
1b500 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64  zed to zero, ind
1b510 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c  icating an inval
1b520 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62  id cache..** A b
1b530 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66  tree will work f
1b540 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72  ine with zero or
1b550 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1b560 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f  .  We just canno
1b570 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20  t.** cache zero 
1b580 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1b590 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  ds, which means 
1b5a0 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65 20  tables that use 
1b5b0 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74  zero or.** negat
1b5c0 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74  ive rowids might
1b5d0 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
1b5e0 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72  ower.  But in pr
1b5f0 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20  actice, zero.** 
1b600 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1b610 64 73 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f  ds are very unco
1b620 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f  mmon so this sho
1b630 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f  uld not be a pro
1b640 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
1b650 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
1b660 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
1b670 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33  r *pCur, sqlite3
1b680 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a  _int64 iRowid){.
1b690 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1b6a0 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74   for(p=pCur->pBt
1b6b0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
1b6c0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
1b6d0 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  f( p->pgnoRoot==
1b6e0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
1b6f0 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20   p->cachedRowid 
1b700 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20  = iRowid;.  }.  
1b710 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61  assert( pCur->ca
1b720 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69  chedRowid==iRowi
1b730 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  d );.}../*.** Re
1b740 74 75 72 6e 20 74 68 65 20 63 61 63 68 65 64 20  turn the cached 
1b750 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67 69  rowid for the gi
1b760 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e  ven cursor.  A n
1b770 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a  egative or zero.
1b780 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1b790 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1b7a0 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 69  he rowid cache i
1b7b0 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  s invalid and sh
1b7c0 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72  ould be.** ignor
1b7d0 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69  ed.  If the rowi
1b7e0 64 20 63 61 63 68 65 20 68 61 73 20 6e 65 76 65  d cache has neve
1b7f0 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65  r before been se
1b800 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72  t, then a.** zer
1b810 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
1b820 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
1b830 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 43  sqlite3BtreeGetC
1b840 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72  achedRowid(BtCur
1b850 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
1b860 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65  turn pCur->cache
1b870 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dRowid;.}../*.**
1b880 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
1b890 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
1b8a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1b8b0 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
1b8c0 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
1b8d0 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
1b8e0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1b8f0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
1b900 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
1b910 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
1b920 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
1b930 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
1b940 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1b950 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1b960 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
1b970 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1b980 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
1b990 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1b9a0 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
1b9b0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
1b9c0 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
1b9d0 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
1b9e0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1b9f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ba00 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1ba10 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1ba20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
1ba30 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
1ba40 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1ba50 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
1ba60 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1ba70 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
1ba80 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1ba90 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1baa0 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1bab0 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
1bac0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1bad0 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  ;.    invalidate
1bae0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
1baf0 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ur);.    /* sqli
1bb00 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
1bb10 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
1bb20 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1bb30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1bb40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1bb50 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1bb60 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
1bb70 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
1bb80 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
1bb90 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
1bba0 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
1bbb0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
1bbc0 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
1bbd0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
1bbe0 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
1bbf0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
1bc00 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
1bc10 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1bc20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
1bc30 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
1bc40 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
1bc50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1bc60 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
1bc70 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
1bc80 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
1bc90 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
1bca0 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
1bcb0 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
1bcc0 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
1bcd0 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
1bce0 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
1bcf0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
1bd00 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
1bd10 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
1bd20 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
1bd30 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
1bd40 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
1bd50 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
1bd60 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
1bd70 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
1bd80 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
1bd90 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
1bda0 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
1bdb0 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67  ressive inlining
1bdc0 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20  .)  So we use a 
1bdd0 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  real function.**
1bde0 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20   for MSVC and a 
1bdf0 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74  macro for everyt
1be00 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b  hing else.  Tick
1be10 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66  et #2457..*/.#if
1be20 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
1be30 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
1be40 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
1be50 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
1be60 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1be70 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1be80 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65  r->iPage;.    me
1be90 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
1bea0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
1beb0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1bec0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1bed0 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
1bee0 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29  x[iPage], &info)
1bef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
1bf00 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
1bf10 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
1bf20 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
1bf30 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
1bf40 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1bf50 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
1bf60 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
1bf70 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1bf80 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
1bf90 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
1bfa0 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
1bfb0 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
1bfc0 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
1bfd0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1bfe0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
1bff0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
1c000 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1c010 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1c020 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1c030 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1c040 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1c050 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1c060 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
1c070 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
1c080 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c090 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
1c0a0 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  o(pCur);.    }. 
1c0b0 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e   }.#else /* if n
1c0c0 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20  ot _MSC_VER */. 
1c0d0 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20   /* Use a macro 
1c0e0 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d  in all other com
1c0f0 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74  pilers so that t
1c100 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  he function is i
1c110 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e  nlined */.#defin
1c120 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43  e getCellInfo(pC
1c130 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ur)             
1c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c160 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28           \.  if(
1c170 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1c180 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  e==0 ){         
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1c1c0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1c1d0 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20  ->iPage;        
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c200 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1c210 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1c220 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1c230 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1c240 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1c250 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d  fo); \.    pCur-
1c260 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20  >validNKey = 1; 
1c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2a0 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b        \.  }else{
1c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20 20 20 20                  
1c2f0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73         \.    ass
1c300 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
1c310 29 3b 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 20 20 20 20 20 20                  
1c330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c340 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65          \.  }.#e
1c350 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
1c360 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45   */..#ifndef NDE
1c370 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  BUG  /* The next
1c380 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e   routine used on
1c390 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
1c3a0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1c3b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1c3c0 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
1c3d0 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69  BtCursor is vali
1c3e0 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73  d.  A valid curs
1c3f0 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61  or is one.** tha
1c400 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1c410 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77  ointing to a row
1c420 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79   in a (non-empty
1c430 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  ) table..** This
1c440 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69   is a verificati
1c450 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  on routine is us
1c460 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
1c470 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1c480 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
1c490 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
1c4a0 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  alid(BtCursor *p
1c4b0 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
1c4c0 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74  Cur && pCur->eSt
1c4d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1c4e0 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e  D;.}.#endif /* N
1c4f0 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1c500 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
1c510 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
1c520 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
1c530 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
1c540 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
1c550 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
1c560 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
1c570 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
1c580 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
1c590 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
1c5a0 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
1c5b0 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
1c5c0 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
1c5d0 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
1c5e0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1c5f0 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
1c600 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
1c610 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
1c620 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
1c630 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69  ller must positi
1c640 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72  on the cursor pr
1c650 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
1c660 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
1c670 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
1c680 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20  e cannot fail.  
1c690 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  It always return
1c6a0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a  s SQLITE_OK.  .*
1c6b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1c6c0 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
1c6d0 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
1c6e0 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1c6f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1c700 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1c710 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1c720 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1c730 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
1c740 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1c750 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1c760 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
1c770 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a  LID ){.    *pSiz
1c780 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1c790 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1c7a0 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a  pCur);.    *pSiz
1c7b0 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1c7c0 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Key;.  }.  retur
1c7d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c7e0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
1c7f0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1c800 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
1c810 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
1c820 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
1c830 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
1c840 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1c850 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
1c860 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1c870 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
1c880 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
1c890 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
1c8a0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
1c8b0 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
1c8c0 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
1c8d0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
1c8e0 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
1c8f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1c900 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72  ID..**.** Failur
1c910 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
1c920 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  e.  This functio
1c930 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  n always returns
1c940 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49   SQLITE_OK..** I
1c950 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20  t might just as 
1c960 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64  well be a proced
1c970 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76  ure (returning v
1c980 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74  oid) but we cont
1c990 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72  inue.** to retur
1c9a0 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73  n an integer res
1c9b0 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73  ult code for his
1c9c0 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e  torical reasons.
1c9d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c9e0 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
1c9f0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1ca00 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
1ca10 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1ca20 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1ca30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1ca40 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1ca50 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
1ca60 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53  nfo(pCur);.  *pS
1ca70 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1ca80 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e  .nData;.  return
1ca90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1caa0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
1cab0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
1cac0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1cad0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
1cae0 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
1caf0 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
1cb00 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
1cb10 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
1cb20 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1cb30 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
1cb40 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
1cb50 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
1cb60 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
1cb70 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
1cb80 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
1cb90 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
1cba0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
1cbb0 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
1cbc0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
1cbd0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
1cbe0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1cbf0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1cc00 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54  herwise:.**.** T
1cc10 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1cc20 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
1cc30 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1cc40 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a  linked list is .
1cc50 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
1cc60 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
1cc70 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61  e ovfl is the la
1cc80 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
1cc90 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20  inked .** list, 
1cca0 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
1ccb0 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
1ccc0 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
1ccd0 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72  ot NULL, and a r
1cce0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
1ccf0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63  MemPage object c
1cd00 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1cd10 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
1cd20 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65  Ovfl was obtaine
1cd30 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  d, then *ppPage 
1cd40 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1cd50 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  to that.** refer
1cd60 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20  ence. It is the 
1cd70 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1cd80 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1cd90 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
1cda0 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65  ().** on *ppPage
1cdb0 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66   to free the ref
1cdc0 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65  erence. In no re
1cdd0 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61  ference was obta
1cde0 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a  ined (because.**
1cdf0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1ce00 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74   was used to obt
1ce10 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ain the value fo
1ce20 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74  r *pPgnoNext), t
1ce30 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69  hen.** *ppPage i
1ce40 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
1ce50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1ce60 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
1ce70 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ce90 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
1cea0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  e */.  Pgno ovfl
1ceb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cec0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
1ced0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
1cee0 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ber */.  MemPage
1cef0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
1cf00 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
1cf10 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
1cf20 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
1cf30 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cf50 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
1cf60 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
1cf70 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
1cf80 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1cf90 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
1cfa0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1cfb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1cfc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1cfd0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1cfe0 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
1cff0 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
1d000 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1d010 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
1d020 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
1d030 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1d040 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
1d050 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
1d060 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
1d070 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
1d080 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1d090 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
1d0a0 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
1d0b0 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
1d0c0 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
1d0d0 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
1d0e0 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
1d0f0 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
1d100 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
1d110 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
1d120 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
1d130 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
1d140 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
1d150 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1d160 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
1d170 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
1d180 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
1d190 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
1d1a0 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
1d1b0 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
1d1c0 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
1d1d0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1d1e0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
1d1f0 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
1d200 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
1d210 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
1d220 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
1d230 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1d240 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
1d250 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
1d260 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d270 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
1d280 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
1d290 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
1d2a0 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
1d2b0 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
1d2c0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d2d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d2e0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1d2f0 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( next==0 || rc=
1d300 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1d310 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d320 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1d330 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1d340 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
1d350 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1d360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1d370 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
1d380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d390 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
1d3a0 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
1d3b0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
1d3c0 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
1d3d0 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
1d3e0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
1d3f0 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
1d400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
1d410 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1d420 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
1d430 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
1d440 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
1d450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
1d460 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1d470 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
1d480 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
1d490 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
1d4a0 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
1d4b0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
1d4c0 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
1d4d0 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
1d4e0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
1d4f0 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
1d500 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
1d510 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
1d520 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
1d530 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
1d540 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
1d550 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
1d560 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
1d570 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
1d580 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
1d590 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
1d5a0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
1d5b0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
1d5c0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
1d5d0 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
1d5e0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1d5f0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1d600 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
1d610 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
1d620 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
1d630 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
1d640 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
1d650 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1d660 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
1d670 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1d680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1d690 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
1d6a0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d6c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1d6d0 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
1d6e0 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
1d6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
1d700 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
1d710 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
1d720 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
1d730 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
1d740 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
1d750 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
1d760 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
1d770 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
1d780 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
1d790 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
1d7a0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
1d7b0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1d7c0 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
1d7d0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1d7e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d7f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d800 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
1d810 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
1d820 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
1d830 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
1d840 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
1d850 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
1d860 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
1d870 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
1d880 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
1d890 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1d8a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d8b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1d8c0 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
1d8d0 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
1d8e0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
1d8f0 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
1d900 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
1d910 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1d920 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70  g to. If the eOp
1d930 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
1d940 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65   0, this is a re
1d950 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61  ad operation (da
1d960 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a  ta copied into.*
1d970 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20  * buffer pBuf). 
1d980 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  If it is non-zer
1d990 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61  o, a write (data
1d9a0 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20   copied from.** 
1d9b0 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a  buffer pBuf)..**
1d9c0 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
1d9d0 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
1d9e0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
1d9f0 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
1da00 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
1da10 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
1da20 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1da30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
1da40 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ent being read o
1da50 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  r written might 
1da60 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
1da70 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65  in page.** or be
1da80 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
1da90 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
1daa0 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  low pages..**.**
1dab0 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
1dac0 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  .isIncrblobHandl
1dad0 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61  e flag is set, a
1dae0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  nd the current.*
1daf0 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  * cursor entry u
1db00 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
1db10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
1db20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
1db30 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65   allocates space
1db40 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
1db50 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76  popluates the ov
1db60 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1db70 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79   .** cache array
1db80 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
1db90 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e  flow). Subsequen
1dba0 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
1dbb0 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  .** cache to mak
1dbc0 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
1dbd0 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
1dbe0 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
1dbf0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
1dc00 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1dc10 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
1dc20 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
1dc30 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
1dc40 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
1dc50 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
1dc60 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
1dc70 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
1dc80 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
1dc90 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
1dca0 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
1dcb0 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
1dcc0 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
1dcd0 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
1dce0 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
1dcf0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
1dd00 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
1dd10 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
1dd20 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
1dd30 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
1dd40 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
1dd50 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
1dd60 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
1dd70 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
1dd80 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
1dd90 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
1dda0 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
1ddb0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
1ddc0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
1ddd0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1dde0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
1ddf0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
1de00 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
1de10 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
1de20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
1de30 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
1de40 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
1de50 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
1de60 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
1de70 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
1de80 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
1de90 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
1dea0 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
1deb0 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
1dec0 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
1ded0 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
1dee0 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
1def0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
1df00 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
1df10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33   SQLITE_OK;.  u3
1df20 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49  2 nKey;.  int iI
1df30 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
1df40 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
1df50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1df60 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
1df70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
1df80 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
1df90 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1dfa0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
1dfb0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
1dfc0 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
1dfd0 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
1dfe0 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
1dff0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1e000 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1e010 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1e020 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1e030 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
1e040 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
1e050 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1e060 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
1e070 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1e080 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
1e090 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
1e0a0 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
1e0b0 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28  ader;.  nKey = (
1e0c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20  pPage->intKey ? 
1e0d0 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  0 : (int)pCur->i
1e0e0 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66  nfo.nKey);..  if
1e0f0 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61  ( NEVER(offset+a
1e100 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
1e110 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20  info.nData) .   
1e120 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  || &aPayload[pCu
1e130 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
1e140 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
1e150 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
1e160 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  .  ){.    /* Try
1e170 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ing to read or w
1e180 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  rite past the en
1e190 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  d of the data is
1e1a0 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
1e1b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e1c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1e1d0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
1e1e0 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
1e1f0 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
1e200 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
1e210 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
1e220 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
1e230 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
1e240 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
1e250 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
1e260 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1e270 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
1e280 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1e290 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
1e2a0 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
1e2b0 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
1e2c0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
1e2d0 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44  , eOp, pPage->pD
1e2e0 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
1e2f0 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
1e300 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
1e310 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
1e320 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
1e330 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
1e340 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
1e350 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
1e360 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33   ){.    const u3
1e370 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  2 ovflSize = pBt
1e380 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
1e390 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
1e3a0 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
1e3b0 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
1e3c0 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
1e3d0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
1e3e0 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
1e3f0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
1e400 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e410 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1e420 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e    /* If the isIn
1e430 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
1e440 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
1e450 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
1e460 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73  low[].    ** has
1e470 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
1e480 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
1e490 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20   now. The array 
1e4a0 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20  is sized at.    
1e4b0 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  ** one entry for
1e4c0 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
1e4d0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1e4e0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20  low chain. The. 
1e4f0 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65     ** page numbe
1e500 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
1e510 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
1e520 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
1e530 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65  low[0],.    ** e
1e540 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
1e550 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
1e560 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20  w[] array means 
1e570 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a  "not yet known".
1e580 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68      ** (the cach
1e590 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
1e5a0 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
1e5b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49     if( pCur->isI
1e5c0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
1e5d0 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
1e5e0 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  w ){.      int n
1e5f0 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
1e600 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
1e610 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
1e620 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
1e630 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ze;.      pCur->
1e640 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e  aOverflow = (Pgn
1e650 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o *)sqlite3Mallo
1e660 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e  cZero(sizeof(Pgn
1e670 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20  o)*nOvfl);.     
1e680 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77   /* nOvfl is alw
1e690 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49  ays positive.  I
1e6a0 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c 20  f it were zero, 
1e6b0 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f 75  fetchPayload wou
1e6c0 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  ld have.      **
1e6d0 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74 65   been used inste
1e6e0 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ad of this routi
1e6f0 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ne. */.      if(
1e700 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20 26   ALWAYS(nOvfl) &
1e710 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
1e720 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ow ){.        rc
1e730 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1e740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1e750 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
1e760 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1e770 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
1e780 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
1e790 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
1e7a0 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
1e7b0 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
1e7c0 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
1e7d0 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
1e7e0 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
1e7f0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
1e800 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
1e810 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
1e820 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
1e830 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
1e840 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
1e850 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1e860 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e870 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
1e880 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
1e890 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
1e8a0 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28  #endif..    for(
1e8b0 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
1e8c0 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
1e8d0 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
1e8e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e8f0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1e900 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
1e910 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
1e920 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1e930 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
1e940 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1e950 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
1e960 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
1e970 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1e980 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
1e990 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
1e9a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
1e9b0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1e9c0 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
1e9d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1e9e0 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
1e9f0 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
1ea00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
1ea10 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
1ea20 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
1ea30 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
1ea40 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
1ea50 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
1ea60 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1ea70 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
1ea80 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1ea90 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
1eaa0 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
1eab0 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
1eac0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
1ead0 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
1eae0 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
1eaf0 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
1eb00 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
1eb10 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
1eb20 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
1eb30 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
1eb40 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1eb50 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  OB.        if( p
1eb60 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
1eb70 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
1eb80 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
1eb90 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1eba0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
1ebb0 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
1ebc0 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69     } else .#endi
1ebd0 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  f.          rc =
1ebe0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1ebf0 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
1ec00 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
1ec10 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
1ec20 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
1ec30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ec40 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
1ec50 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
1ec60 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
1ec70 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
1ec80 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
1ec90 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
1eca0 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
1ecb0 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
1ecc0 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
1ecd0 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20  .        DbPage 
1ece0 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
1ecf0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
1ed00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ed10 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
1ed20 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
1ed30 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  e, &pDbPage);.  
1ed40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ed50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ed60 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
1ed70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
1ed80 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
1ed90 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
1eda0 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
1edb0 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
1edc0 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20   if( a + offset 
1edd0 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  > ovflSize ){.  
1ede0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
1edf0 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
1ee00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ee10 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
1ee20 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
1ee30 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
1ee40 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61  f, a, eOp, pDbPa
1ee50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ge);.          s
1ee60 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1ee70 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
1ee80 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
1ee90 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d  .          amt -
1eea0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = a;.          p
1eeb0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
1eec0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1eed0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
1eee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1eef0 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
1ef00 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1ef10 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
1ef20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ef30 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
1ef40 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
1ef50 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
1ef60 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
1ef70 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
1ef80 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
1ef90 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
1efa0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
1efb0 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
1efc0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1efd0 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
1efe0 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
1eff0 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ng to a valid ro
1f000 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c  w.** in the tabl
1f010 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
1f020 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1f030 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
1f040 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
1f050 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
1f060 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
1f070 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
1f080 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
1f090 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
1f0a0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
1f0b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1f0c0 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
1f0d0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
1f0e0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
1f0f0 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72   *pBuf){.  asser
1f100 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f110 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1f120 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1f130 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f140 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1f150 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1f160 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1f170 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1f180 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1f190 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1f1a0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
1f1b0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1f1c0 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63  l );.  return ac
1f1d0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
1f1e0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
1f1f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
1f200 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Buf, 0);.}../*.*
1f210 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
1f220 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
1f230 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
1f240 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
1f250 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
1f260 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
1f270 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
1f280 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
1f290 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
1f2a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1f2b0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1f2c0 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
1f2d0 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
1f2e0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
1f2f0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
1f300 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
1f310 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
1f320 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
1f330 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
1f340 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f350 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
1f360 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
1f370 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
1f380 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
1f390 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
1f3a0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1f3b0 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
1f3c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1f3d0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
1f3e0 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
1f3f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1f400 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1f410 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f420 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
1f430 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1f440 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1f450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f460 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1f470 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1f480 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
1f490 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
1f4a0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
1f4b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
1f4c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1f4d0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1f4e0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
1f4f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1f500 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
1f510 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
1f520 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
1f530 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20  mt, pBuf, 0);.  
1f540 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f550 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1f560 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
1f570 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
1f580 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
1f590 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
1f5a0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1f5b0 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
1f5c0 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
1f5d0 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
1f5e0 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65  he key if skipKe
1f5f0 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e  y==0 and it poin
1f600 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ts to the beginn
1f610 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a  ing of data if.*
1f620 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54  * skipKey==1.  T
1f630 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1f640 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
1f650 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
1f660 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d  ten.** into *pAm
1f670 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
1f680 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1f690 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
1f6a0 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t be.** a valid 
1f6b0 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
1f6c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1f6d0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
1f6e0 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
1f6f0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
1f700 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
1f710 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
1f720 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
1f730 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
1f740 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
1f750 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
1f760 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
1f770 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
1f780 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
1f790 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
1f7a0 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
1f7b0 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
1f7c0 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
1f7d0 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
1f7e0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
1f7f0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
1f800 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
1f810 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
1f820 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
1f830 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
1f840 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
1f850 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
1f860 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
1f870 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
1f880 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
1f890 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
1f8a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f8b0 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
1f8c0 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
1f8d0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
1f8e0 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
1f8f0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
1f900 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
1f910 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65  nsigned char *fe
1f920 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
1f930 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1f940 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1f950 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
1f960 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1f970 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20   int *pAmt,     
1f980 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1f990 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
1f9a0 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
1f9b0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b  e */.  int skipK
1f9c0 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72  ey          /* r
1f9d0 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ead beginning at
1f9e0 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
1f9f0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
1fa00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1fa10 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65  yload;.  MemPage
1fa20 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e   *pPage;.  u32 n
1fa30 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61  Key;.  u32 nLoca
1fa40 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
1fa50 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
1fa60 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1fa70 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1fa80 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
1fa90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1faa0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1fab0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1fac0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1fad0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
1fae0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1faf0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
1fb00 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1fb10 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
1fb20 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
1fb30 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 69 6e 66   NEVER(pCur->inf
1fb40 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20  o.nSize==0) ){. 
1fb50 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1fb60 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
1fb70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75  Cur->iPage], pCu
1fb80 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1fb90 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Page],.         
1fba0 20 20 20 20 20 20 20 20 20 20 26 70 43 75 72 2d            &pCur-
1fbb0 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50  >info);.  }.  aP
1fbc0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
1fbd0 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61  nfo.pCell;.  aPa
1fbe0 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69  yload += pCur->i
1fbf0 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69  nfo.nHeader;.  i
1fc00 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1fc10 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30   ){.    nKey = 0
1fc20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1fc30 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  Key = (int)pCur-
1fc40 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
1fc50 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
1fc60 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  .    aPayload +=
1fc70 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61   nKey;.    nLoca
1fc80 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
1fc90 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20  Local - nKey;.  
1fca0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61  }else{.    nLoca
1fcb0 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
1fcc0 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73 73 65 72  Local;.    asser
1fcd0 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20  t( nLocal<=nKey 
1fce0 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d  );.  }.  *pAmt =
1fcf0 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72   nLocal;.  retur
1fd00 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  n aPayload;.}...
1fd10 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
1fd20 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
1fd30 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
1fd40 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
1fd50 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
1fd60 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
1fd70 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
1fd80 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
1fd90 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
1fda0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1fdb0 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
1fdc0 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
1fdd0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
1fde0 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
1fdf0 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
1fe00 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
1fe10 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
1fe20 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
1fe30 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
1fe40 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
1fe50 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
1fe60 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
1fe70 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
1fe80 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
1fe90 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
1fea0 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
1feb0 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
1fec0 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
1fed0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
1fee0 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
1fef0 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
1ff00 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
1ff10 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
1ff20 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
1ff30 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
1ff40 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
1ff50 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
1ff60 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
1ff70 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
1ff80 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
1ff90 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20    const void *p 
1ffa0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
1ffb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1ffc0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1ffd0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1ffe0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1fff0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20000 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
20010 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20020 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20  SOR_VALID) ){.  
20030 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69    p = (const voi
20040 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
20050 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a  pCur, pAmt, 0);.
20060 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
20070 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
20080 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
20090 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
200a0 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
200b0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20    const void *p 
200c0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
200d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
200e0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
200f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
20100 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20110 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20120 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
20130 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20140 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20  SOR_VALID) ){.  
20150 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69    p = (const voi
20160 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
20170 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
20180 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
20190 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
201a0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
201b0 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
201c0 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
201d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
201e0 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
201f0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
20200 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a  e to move to..**
20210 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20220 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
20230 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20  _CORRUPT if the 
20240 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
20250 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68  s field of.** th
20260 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
20270 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
20280 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
20290 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69  of the parent (i
202a0 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74  .e..** if an int
202b0 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73  key page appears
202c0 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e   to be the paren
202d0 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  t of a non-intke
202e0 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69  y page, or.** vi
202f0 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74  ce-versa)..*/.st
20300 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
20310 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
20320 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
20330 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
20340 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61  nt i = pCur->iPa
20350 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge;.  MemPage *p
20360 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61  NewPage;.  BtSha
20370 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
20380 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
20390 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
203a0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
203b0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
203c0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
203d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
203e0 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
203f0 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
20400 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
20410 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
20420 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
20430 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20440 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
20450 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
20460 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
20470 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a  no, &pNewPage);.
20480 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20490 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70  n rc;.  pCur->ap
204a0 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77  Page[i+1] = pNew
204b0 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69  Page;.  pCur->ai
204c0 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20  Idx[i+1] = 0;.  
204d0 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a  pCur->iPage++;..
204e0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
204f0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
20500 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
20510 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
20520 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61  Cell<1 || pNewPa
20530 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  ge->intKey!=pCur
20540 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74  ->apPage[i]->int
20550 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
20560 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
20570 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
20580 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20590 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
205a0 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
205b0 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
205c0 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
205d0 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
205e0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
205f0 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
20600 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
20610 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
20620 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
20630 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
20640 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
20650 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
20660 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
20670 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
20680 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
20690 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
206a0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
206b0 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
206c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
206d0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
206e0 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
206f0 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
20700 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73  no iChild){.  as
20710 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
20720 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
20730 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
20740 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
20750 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
20760 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
20770 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
20780 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
20790 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
207a0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
207b0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
207c0 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
207d0 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
207e0 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
207f0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
20800 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
20810 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
20820 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
20830 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
20840 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
20850 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
20860 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
20870 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
20880 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
20890 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
208a0 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
208b0 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
208c0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
208d0 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
208e0 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
208f0 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
20900 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
20910 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
20920 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
20930 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
20940 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
20950 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
20960 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
20970 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
20980 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
20990 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
209a0 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
209b0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
209c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
209d0 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
209e0 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
209f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20a00 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
20a10 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
20a20 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
20a30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20a40 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
20a50 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
20a60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20a70 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
20a80 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
20a90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
20aa0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
20ab0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f  idNKey = 0;.}../
20ac0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
20ad0 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
20ae0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
20af0 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
20b00 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
20b10 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
20b20 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
20b30 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
20b40 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
20b50 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
20b60 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
20b70 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
20b80 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
20b90 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
20ba0 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
20bb0 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
20bc0 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
20bd0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
20be0 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
20bf0 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
20c00 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
20c10 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
20c20 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
20c30 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
20c40 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
20c50 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
20c60 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
20c70 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
20c80 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65  OR_INVALID. Othe
20c90 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f  rwise, the curso
20ca0 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
20cb0 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  t to the first.*
20cc0 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f  * cell located o
20cd0 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76  n the root (or v
20ce0 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
20cf0 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
20d00 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74   state.** is set
20d10 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   to CURSOR_VALID
20d20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
20d30 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
20d40 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
20d50 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
20d60 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67   that the.** pag
20d70 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69  e-header flags i
20d80 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
20d90 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d   [virtual] root-
20da0 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65  page is the expe
20db0 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66  cted .** kind of
20dc0 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e   b-tree page (i.
20dd0 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69  e. if when openi
20de0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  ng the cursor th
20df0 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74  e caller did not
20e00 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65  .** specify a Ke
20e10 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
20e20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
20e30 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72  s set to 0x05 or
20e40 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61   0x0D,.** indica
20e50 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74  ting a table b-t
20e60 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ree, or if the c
20e70 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66  aller did specif
20e80 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  y a KeyInfo .** 
20e90 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
20ea0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
20eb0 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c  to 0x02 or 0x0A,
20ec0 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
20ed0 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e  ndex.** b-tree).
20ee0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
20ef0 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
20f00 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
20f10 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
20f20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20f30 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
20f40 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
20f50 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
20f60 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
20f70 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
20f80 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
20f90 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
20fa0 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
20fb0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
20fc0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
20fd0 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
20fe0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
20ff0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
21000 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
21010 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
21020 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
21030 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
21040 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
21050 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21060 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
21070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
21080 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
21090 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
210a0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
210b0 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ipNext;.    }.  
210c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
210d0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
210e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
210f0 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
21100 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
21110 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=1; i<=pCur->i
21120 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
21130 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
21140 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
21150 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
21160 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  iPage = 0;.  }el
21170 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  se{.    rc = get
21180 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
21190 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
211a0 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
211b0 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
211c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
211d0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
211e0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
211f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
21200 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
21210 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20  r->iPage = 0;.. 
21220 20 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70     /* If pCur->p
21230 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e  KeyInfo is not N
21240 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ULL, then the ca
21250 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64  ller that opened
21260 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 20   this cursor.   
21270 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20   ** expected to 
21280 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e  open it on an in
21290 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65  dex b-tree. Othe
212a0 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e  rwise, if pKeyIn
212b0 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c  fo is.    ** NUL
212c0 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
212d0 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
212e0 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
212f0 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
21300 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20     ** return an 
21310 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
21320 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73  rror.  */.    as
21330 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
21340 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31  ge[0]->intKey==1
21350 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
21360 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  [0]->intKey==0 )
21370 3b 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  ;.    if( (pCur-
21380 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
21390 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
213a0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
213b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
213c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
213d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65  }.  }..  /* Asse
213e0 72 74 20 74 68 61 74 20 74 68 65 20 72 6f 6f 74  rt that the root
213f0 20 70 61 67 65 20 69 73 20 6f 66 20 74 68 65 20   page is of the 
21400 63 6f 72 72 65 63 74 20 74 79 70 65 2e 20 54 68  correct type. Th
21410 69 73 20 6d 75 73 74 20 62 65 20 74 68 65 0a 20  is must be the. 
21420 20 2a 2a 20 63 61 73 65 20 61 73 20 74 68 65 20   ** case as the 
21430 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
21440 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65  ction that loade
21450 64 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  d the root-page 
21460 28 65 69 74 68 65 72 0a 20 20 2a 2a 20 74 68 69  (either.  ** thi
21470 73 20 63 61 6c 6c 20 6f 72 20 61 20 70 72 65 76  s call or a prev
21480 69 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29  ious invocation)
21490 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
214a0 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 20  cted corruption 
214b0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61 73 73  .  ** if the ass
214c0 75 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  umption were not
214d0 20 74 72 75 65 2c 20 61 6e 64 20 69 74 20 69 73   true, and it is
214e0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
214f0 72 20 74 68 65 20 66 6c 61 67 73 20 0a 20 20 2a  r the flags .  *
21500 2a 20 62 79 74 65 20 74 6f 20 68 61 76 65 20 62  * byte to have b
21510 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 77 68 69  een modified whi
21520 6c 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 69  le this cursor i
21530 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
21540 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68  rence.  ** to th
21550 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52  e page.  */.  pR
21560 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  oot = pCur->apPa
21570 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge[0];.  assert(
21580 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
21590 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a  ur->pgnoRoot );.
215a0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
215b0 3e 69 73 49 6e 69 74 20 26 26 20 28 70 43 75 72  >isInit && (pCur
215c0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d  ->pKeyInfo==0)==
215d0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b  pRoot->intKey );
215e0 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ..  pCur->aiIdx[
215f0 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
21600 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
21610 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
21620 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
21630 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66  dNKey = 0;..  if
21640 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d  ( pRoot->nCell==
21650 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61  0 && !pRoot->lea
21660 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
21670 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
21680 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
21690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
216a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
216b0 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
216c0 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
216d0 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
216e0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
216f0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
21700 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
21710 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
21720 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
21730 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
21740 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74  eState = ((pRoot
21750 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f  ->nCell>0)?CURSO
21760 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49  R_VALID:CURSOR_I
21770 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72  NVALID);.  }.  r
21780 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21790 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
217a0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
217b0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
217c0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
217d0 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
217e0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
217f0 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
21800 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
21810 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
21820 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
21830 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
21840 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
21850 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
21860 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
21870 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
21880 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
21890 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
218a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
218b0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
218c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
218d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
218e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
218f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21900 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
21910 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21920 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
21930 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21940 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
21950 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
21960 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
21970 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
21980 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
21990 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
219a0 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
219b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
219c0 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  e]));.    rc = m
219d0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
219e0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
219f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21a00 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
21a10 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
21a20 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
21a30 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
21a40 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
21a50 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
21a60 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
21a70 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
21a80 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
21a90 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
21aa0 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
21ab0 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
21ac0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
21ad0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
21ae0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
21af0 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
21b00 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
21b10 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
21b20 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
21b30 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
21b40 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
21b50 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
21b60 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
21b70 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
21b80 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
21b90 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
21ba0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
21bb0 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
21bc0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
21bd0 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
21be0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21bf0 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
21c00 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
21c10 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
21c20 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
21c30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
21c40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21c50 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
21c60 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
21c70 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
21c80 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21c90 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
21ca0 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
21cb0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
21cc0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
21cd0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
21ce0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21cf0 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
21d00 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
21d10 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
21d20 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
21d30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21d40 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   ){.    pCur->ai
21d50 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
21d60 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
21d70 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  1;.    pCur->inf
21d80 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
21d90 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
21da0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
21db0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
21dc0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
21dd0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
21de0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
21df0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
21e00 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
21e10 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
21e20 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
21e30 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
21e40 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
21e50 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
21e60 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
21e70 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
21e80 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
21e90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
21ea0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
21eb0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
21ec0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
21ed0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
21ee0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
21ef0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
21f00 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
21f10 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
21f20 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
21f30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21f40 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
21f50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21f60 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
21f70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21f80 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21f90 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
21fa0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
21fb0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
21fc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
21fd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21fe0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21ff0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
22000 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  >0 );.      *pRe
22010 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
22020 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
22030 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
22040 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
22050 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
22060 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
22070 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
22080 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
22090 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
220a0 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
220b0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
220c0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
220d0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
220e0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
220f0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
22100 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
22110 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22120 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
22130 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
22140 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
22150 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
22160 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
22170 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22180 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
22190 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
221a0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
221b0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c  If the cursor al
221c0 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20  ready points to 
221d0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20  the last entry, 
221e0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
221f0 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52   */.  if( CURSOR
22200 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
22210 74 61 74 65 20 26 26 20 70 43 75 72 2d 3e 61 74  tate && pCur->at
22220 4c 61 73 74 20 29 7b 0a 23 69 66 64 65 66 20 53  Last ){.#ifdef S
22230 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
22240 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
22250 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29  rves to assert()
22260 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
22270 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69   really does poi
22280 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  nt .    ** to th
22290 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
222a0 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20  the b-tree. */. 
222b0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
222c0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72  or(ii=0; ii<pCur
222d0 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  ->iPage; ii++){.
222e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
222f0 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70  ur->aiIdx[ii]==p
22300 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d  Cur->apPage[ii]-
22310 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a  >nCell );.    }.
22320 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
22330 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22340 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  age]==pCur->apPa
22350 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22360 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
22370 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
22380 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22390 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69  ]->leaf );.#endi
223a0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
223b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
223c0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
223d0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
223e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
223f0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
22400 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
22410 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
22420 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
22430 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22440 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
22450 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
22460 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
22470 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
22480 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
22490 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
224a0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
224b0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
224c0 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ur);.      pCur-
224d0 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51  >atLast = rc==SQ
224e0 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20  LITE_OK ?1:0;.  
224f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22500 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
22510 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
22520 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
22530 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
22540 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
22550 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
22560 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
22570 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
22580 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
22590 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
225a0 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
225b0 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
225c0 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
225d0 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
225e0 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
225f0 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
22600 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
22610 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
22620 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
22630 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
22640 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
22650 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
22660 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
22670 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
22680 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
22690 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
226a0 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
226b0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
226c0 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
226d0 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
226e0 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
226f0 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
22700 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
22710 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
22720 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
22730 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
22740 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
22750 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
22760 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
22770 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
22780 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
22790 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
227a0 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
227b0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
227c0 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
227d0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
227e0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
227f0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
22810 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
22820 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
22830 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
22840 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
22850 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
22860 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
22870 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
22880 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
22890 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
228a0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
228b0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
228c0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
228d0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
228e0 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
228f0 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
22900 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
22910 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
22920 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
22930 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
22940 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
22960 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
22970 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
22980 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22990 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
229a0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
229b0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur,          /*
229c0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62   The cursor to b
229d0 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70  e moved */.  Unp
229e0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
229f0 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65  xKey, /* Unpacke
22a00 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
22a10 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20   i64 intKey,    
22a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22a30 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20   table key */.  
22a40 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
22a50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
22a60 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
22a70 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
22a80 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
22a90 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
22aa0 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
22ab0 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
22ac0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
22ad0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
22ae0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
22af0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
22b00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
22b10 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
22b20 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
22b30 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a  assert( pRes );.
22b40 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b    assert( (pIdxK
22b50 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
22b60 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a  KeyInfo==0) );..
22b70 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
22b80 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
22b90 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
22ba0 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
22bb0 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
22bc0 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
22bd0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
22be0 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
22bf0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
22c00 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
22c10 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e   && pCur->validN
22c20 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d  Key .   && pCur-
22c30 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
22c40 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ey .  ){.    if(
22c50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
22c60 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
22c70 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
22c80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22c90 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
22ca0 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  f( pCur->atLast 
22cb0 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
22cc0 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
22cd0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
22ce0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22cf0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
22d00 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
22d10 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
22d20 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
22d30 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
22d40 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
22d50 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
22d60 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
22d70 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22d80 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
22d90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22da0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22db0 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  ge]->nCell>0 || 
22dc0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22dd0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
22de0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
22df0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
22e00 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
22e10 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
22e20 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
22e30 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
22e40 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
22e50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
22e60 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
22e70 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
22e80 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
22e90 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
22ea0 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a    int lwr, upr;.
22eb0 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
22ec0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
22ed0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
22ee0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
22ef0 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20  .    int c;..   
22f00 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
22f10 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
22f20 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
22f30 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
22f40 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
22f50 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
22f60 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
22f70 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
22f80 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
22f90 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
22fa0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
22fb0 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
22fc0 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
22fd0 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
22fe0 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
22ff0 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
23000 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
23010 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
23020 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
23030 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
23040 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
23050 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
23060 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
23070 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
23080 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
23090 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
230a0 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
230b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
230c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
230d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
230e0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
230f0 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
23100 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
23110 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
23120 2d 31 3b 0a 20 20 20 20 69 66 28 20 62 69 61 73  -1;.    if( bias
23130 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
23140 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23150 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 75  >iPage] = (u16)u
23160 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
23170 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
23180 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
23190 28 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29 2f  (u16)((upr+lwr)/
231a0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  2);.    }.    fo
231b0 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 69 6e 74  r(;;){.      int
231c0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
231d0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
231e0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72   /* Index of cur
231f0 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
23200 67 65 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a  ge */.      u8 *
23210 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23230 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
23240 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
23250 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 70 43  age */..      pC
23260 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
23270 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   0;.      pCell 
23280 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
23290 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  , idx) + pPage->
232a0 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
232b0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
232c0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
232d0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
232e0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
232f0 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
23300 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79         u32 dummy
23310 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
23320 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  l += getVarint32
23330 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a  (pCell, dummy);.
23340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23350 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
23360 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
23370 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
23380 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
23390 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
233a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
233b0 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
233c0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
233d0 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20       c = -1;.   
233e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
233f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
23400 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b  ellKey>intKey );
23410 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b  .          c = +
23420 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
23430 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
23440 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  NKey = 1;.      
23450 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
23460 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
23470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23480 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
23490 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
234a0 2d 73 69 7a 65 20 69 73 20 33 32 37 36 38 20 62  -size is 32768 b
234b0 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
234c0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
234d0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
234e0 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
234f0 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
23500 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
23510 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
23520 20 61 74 20 6d 6f 73 74 20 38 31 39 38 20 62 79   at most 8198 by
23530 74 65 73 2c 20 77 68 69 63 68 20 6d 61 79 20 62  tes, which may b
23540 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
23550 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
23560 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
23570 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
23580 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
23590 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
235a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
235b0 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
235c0 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
235d0 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
235e0 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
235f0 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
23600 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
23610 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
23620 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
23630 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
23640 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
23650 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
23660 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20        int nCell 
23670 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
23680 20 20 20 20 69 66 28 20 21 28 6e 43 65 6c 6c 20      if( !(nCell 
23690 26 20 30 78 38 30 29 20 26 26 20 6e 43 65 6c 6c  & 0x80) && nCell
236a0 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
236b0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  l ){.          /
236c0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
236d0 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
236e0 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
236f0 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
23700 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
23710 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
23720 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
23730 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
23740 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
23750 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
23760 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20   */.          c 
23770 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
23780 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
23790 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
237a0 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
237b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
237c0 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
237d0 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
237e0 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
237f0 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
23800 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
23810 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
23820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
23830 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
23840 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
23850 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
23860 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
23870 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
23880 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
23890 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
238a0 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  /.          c = 
238b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
238c0 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
238d0 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d  (void*)&pCell[2]
238e0 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
238f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23900 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
23910 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e  rd flows over on
23920 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  to one or more o
23930 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
23940 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
23950 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f  his case the who
23960 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f  le cell needs to
23970 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75   be parsed, a bu
23980 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20  ffer allocated. 
23990 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
239a0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
239b0 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65  used to retrieve
239c0 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f   the record into
239d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
239e0 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  * buffer before 
239f0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
23a00 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  e() can be calle
23a10 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
23a20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
23a30 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
23a40 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
23a50 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
23a60 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
23a70 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
23a80 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
23a90 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75   pCellBody, &pCu
23aa0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
23ab0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74      nCell = (int
23ac0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
23ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
23ae0 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
23af0 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20  lloc( nCell );. 
23b00 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
23b10 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  llKey==0 ){.    
23b20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23b30 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
23b40 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
23b50 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
23b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23b70 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
23b80 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  oad(pCur, 0, nCe
23b90 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ll, (unsigned ch
23ba0 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29  ar*)pCellKey, 0)
23bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23bc0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
23bd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
23be0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
23bf0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
23c00 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
23c10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23c20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
23c30 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
23c40 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
23c50 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
23c60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
23c70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
23c80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23c90 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
23ca0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
23cb0 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
23cc0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
23cd0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
23ce0 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
23cf0 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  lwr - 1;.       
23d00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23d20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
23d30 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23d40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
23d50 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
23d60 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
23d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23d80 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
23d90 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
23da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23db0 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
23dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23dd0 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
23de0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23df0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
23e00 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23e10 65 5d 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b  e] = (u16)((lwr+
23e20 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  upr)/2);.    }. 
23e30 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
23e40 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  upr+1 );.    ass
23e50 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
23e60 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
23e70 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
23e80 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
23e90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
23ea0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
23eb0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
23ec0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
23ed0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
23ee0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
23ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
23f00 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
23f10 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
23f20 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
23f30 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
23f40 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
23f50 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23f60 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
23f70 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23f80 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
23f90 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20      *pRes = c;. 
23fa0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23fb0 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
23fc0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
23fd0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61     }.    pCur->a
23fe0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23ff0 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  ] = (u16)lwr;.  
24000 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
24010 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
24020 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
24030 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
24040 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
24050 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
24060 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69  ) goto moveto_fi
24070 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  nish;.  }.moveto
24080 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72  _finish:.  retur
24090 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
240a0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
240b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
240c0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
240d0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
240e0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
240f0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
24100 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
24110 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
24120 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
24130 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
24140 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
24150 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
24160 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
24170 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
24180 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
24190 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
241a0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
241b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
241c0 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
241d0 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
241e0 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
241f0 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
24200 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
24210 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
24220 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
24230 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
24240 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
24250 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
24260 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
24270 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
24280 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
24290 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
242a0 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
242b0 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
242c0 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
242d0 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
242e0 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
242f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
24300 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
24310 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
24320 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
24330 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
24340 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
24350 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  g to the last en
24360 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
24370 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
24380 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
24390 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
243a0 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
243b0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
243c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
243d0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
243e0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
243f0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
24400 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
24410 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24420 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
24430 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
24440 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
24450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24460 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
24470 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
24480 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66   pRes!=0 );.  if
24490 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
244a0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
244b0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
244c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
244d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
244e0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
244f0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
24500 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
24510 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
24520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24530 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
24540 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70  ipNext = 0;..  p
24550 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
24560 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24570 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
24580 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24590 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
245a0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
245b0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d  .  assert( idx<=
245c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
245d0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
245e0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
245f0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
24600 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65    if( idx>=pPage
24610 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69  ->nCell ){.    i
24620 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
24630 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  ){.      rc = mo
24640 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
24650 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
24660 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
24670 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
24680 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
24690 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
246a0 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
246b0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  t(pCur);.      *
246c0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
246d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
246e0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
246f0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
24700 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
24710 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
24720 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
24730 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
24740 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
24750 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
24760 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
24770 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
24780 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
24790 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
247a0 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e];.    }while( 
247b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
247c0 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d  ->iPage]>=pPage-
247d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
247e0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
247f0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
24800 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
24810 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
24820 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
24830 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
24840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
24850 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
24860 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
24870 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  ;.  if( pPage->l
24880 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
24890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
248a0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65  .  rc = moveToLe
248b0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
248c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
248d0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
248e0 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
248f0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
24900 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
24910 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
24920 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
24930 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
24940 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
24950 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
24960 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
24970 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
24980 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
24990 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
249a0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
249b0 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
249c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
249d0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
249e0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
249f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
24a00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
24a10 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24a20 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
24a30 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
24a40 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
24a50 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
24a60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24a70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24a80 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  }.  pCur->atLast
24a90 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53   = 0;.  if( CURS
24aa0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
24ab0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
24ac0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
24ad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24ae0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
24af0 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20  >skipNext<0 ){. 
24b00 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
24b10 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  t = 0;.    *pRes
24b20 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
24b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
24b40 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
24b50 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
24b60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24b70 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
24b80 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
24b90 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
24ba0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
24bb0 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
24bc0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
24bd0 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ge];.    rc = mo
24be0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
24bf0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
24c00 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
24c10 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
24c20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24c30 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
24c40 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
24c50 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
24c60 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
24c70 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24c80 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
24c90 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
24ca0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
24cb0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
24cc0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
24cd0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
24ce0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
24cf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
24d00 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
24d10 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
24d20 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
24d30 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
24d40 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
24d50 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61   0;..    pCur->a
24d60 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24d70 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
24d80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24d90 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
24da0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
24db0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
24dc0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
24dd0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
24de0 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
24df0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24e00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
24e10 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  K;.    }.  }.  *
24e20 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75  pRes = 0;.  retu
24e30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24e40 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
24e50 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
24e60 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
24e70 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
24e80 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
24e90 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
24ea0 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
24eb0 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
24ec0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
24ed0 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
24ee0 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
24ef0 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
24f00 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
24f10 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
24f20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
24f30 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
24f40 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
24f50 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
24f60 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
24f70 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
24f80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
24f90 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
24fa0 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
24fb0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
24fc0 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
24fd0 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
24fe0 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
24ff0 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
25000 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
25010 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
25020 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
25030 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
25040 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
25050 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
25060 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
25070 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
25080 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29   then a (feeble)
25090 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
250a0 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
250b0 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
250c0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
250d0 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
250e0 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
250f0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
25100 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
25110 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
25120 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
25130 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
25140 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
25150 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
25160 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
25170 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74  ** If the "exact
25180 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
25190 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61  ot 0, and the pa
251a0 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79  ge-number nearby
251b0 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77   exists .** anyw
251c0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
251d0 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
251e0 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20  s guarenteed to 
251f0 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
25200 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65  s.** is only use
25210 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
25220 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20   databases when 
25230 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
25240 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
25250 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
25260 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
25270 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d  red *pBt, .  Mem
25280 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a  Page **ppPage, .
25290 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a    Pgno *pPgno, .
252a0 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20    Pgno nearby,. 
252b0 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d   u8 exact.){.  M
252c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
252d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
252e0 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
252f0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
25300 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
25310 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
25320 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
25330 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
25340 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
25350 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
25360 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
25370 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
25380 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
25390 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
253a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
253b0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
253c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
253d0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
253e0 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  x) );.  pPage1 =
253f0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
25400 6d 78 50 61 67 65 20 3d 20 70 61 67 65 72 50 61  mxPage = pagerPa
25410 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
25420 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
25430 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
25440 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
25450 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
25460 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
25470 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25480 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
25490 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
254a0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
254b0 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
254c0 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
254d0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
254e0 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
254f0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
25500 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
25510 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
25520 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
25530 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
25540 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
25550 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70  If the 'exact' p
25560 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75  arameter was tru
25570 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  e and a query of
25580 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
25590 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
255a0 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
255b0 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
255c0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
255d0 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
255e0 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
255f0 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
25600 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
25610 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
25620 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
25630 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78  ACUUM.    if( ex
25640 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d  act && nearby<=m
25650 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75  xPage ){.      u
25660 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61  8 eType;.      a
25670 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
25680 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
25690 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
256a0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
256b0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
256c0 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
256d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
256e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
256f0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
25700 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
25710 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
25720 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  st = 1;.      }.
25730 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e        *pPgno = n
25740 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e  earby;.    }.#en
25750 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
25760 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
25770 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
25780 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
25790 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
257a0 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
257b0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
257c0 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
257d0 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
257e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
257f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
25800 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
25810 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
25820 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
25830 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
25840 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
25850 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
25860 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
25870 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
25880 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
25890 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
258a0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
258b0 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
258c0 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
258d0 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
258e0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
258f0 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
25900 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
25910 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20  is located..    
25920 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
25930 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
25940 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
25950 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
25960 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
25970 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
25980 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
25990 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
259a0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
259b0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
259c0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
259d0 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
259e0 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
259f0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
25a00 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29   iTrunk>mxPage )
25a10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
25a20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25a30 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
25a40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
25a50 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
25a60 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
25a70 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
25a80 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
25a90 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
25aa0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
25ab0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
25ac0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
25ad0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
25ae0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
25af0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
25b00 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
25b10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
25b20 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
25b30 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
25b40 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
25b50 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
25b60 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
25b70 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
25b80 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
25b90 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
25ba0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
25bb0 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
25bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
25bd0 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
25be0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25bf0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
25c00 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
25c10 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
25c20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
25c30 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
25c40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25c50 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
25c60 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
25c70 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
25c80 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
25c90 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
25ca0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
25cb0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
25cc0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
25cd0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
25ce0 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
25cf0 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
25d00 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
25d10 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
25d20 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
25d30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
25d40 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
25d50 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
25d60 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
25d70 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
25d80 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
25d90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
25da0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
25db0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
25dc0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
25dd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
25de0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
25df0 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
25e00 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d  List && nearby==
25e10 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  iTrunk ){.      
25e20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
25e30 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
25e40 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
25e50 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
25e60 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
25e70 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
25e80 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
25e90 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
25ea0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25eb0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d  assert( *pPgno==
25ec0 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20  iTrunk );.      
25ed0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
25ee0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
25ef0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
25f00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25f10 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
25f20 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
25f30 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
25f40 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
25f50 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
25f60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25f70 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
25f80 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
25f90 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
25fa0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
25fb0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
25fc0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
25fd0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
25fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25ff0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
26000 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
26010 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
26020 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
26030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26050 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
26060 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
26070 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
26080 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
26090 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
260a0 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
260b0 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
260c0 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
260d0 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
260e0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
260f0 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
26100 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
26110 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
26120 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
26130 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
26140 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
26150 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
26160 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
26170 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
26180 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
26190 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
261a0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
261b0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
261c0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
261d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
261e0 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
261f0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
26200 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
26210 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
26220 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
26230 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
26240 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26260 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
26270 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
26280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26290 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
262a0 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
262b0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
262c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
262d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
262e0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
262f0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
26300 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
26310 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
26320 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
26330 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
26340 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
26350 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
26360 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
26370 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
26380 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
26390 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
263a0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
263b0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
263c0 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
263d0 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
263e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
263f0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
26400 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
26410 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
26420 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
26430 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
26440 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
26450 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
26460 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
26470 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
26480 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
26490 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
264a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
264b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
264c0 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
264d0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
264e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
264f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
26500 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
26510 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
26520 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26530 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
26540 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
26550 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
26560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
26570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26580 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
26590 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
265a0 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
265b0 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
265c0 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
265d0 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
265e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
265f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  >0 ){.        /*
26600 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
26610 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
26620 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c  /.        u32 cl
26630 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
26640 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
26650 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
26660 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
26670 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
26680 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26690 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
266a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
266b0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
266c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
266d0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
266e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
266f0 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
26700 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
26710 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64  .          int d
26720 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ist;.          c
26730 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
26740 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74        dist = get
26750 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
26760 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
26770 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20       if( dist<0 
26780 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a  ) dist = -dist;.
26790 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
267a0 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
267b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
267c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
267d0 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
267e0 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rby;.           
267f0 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d   if( d2<0 ) d2 =
26800 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20   -d2;.          
26810 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
26820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
26830 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
26840 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
26850 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
26860 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
26870 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26880 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
26890 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
268a0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
268b0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
268c0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
268d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
268e0 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
268f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
26900 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
26910 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26920 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
26930 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
26940 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
26950 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
26960 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26970 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
26980 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
26990 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
269a0 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
269b0 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
269c0 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
269d0 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
269e0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
269f0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
26a00 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
26a10 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
26a30 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
26a40 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
26a50 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
26a60 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
26a70 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
26a80 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1));.          i
26a90 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
26aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
26ab0 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
26ac0 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
26ad0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
26ae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26af0 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
26b00 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
26b10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
26b20 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
26b30 74 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70  teable(pTrunk->p
26b40 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
26b50 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
26b60 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
26b70 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
26b80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
26b90 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
26ba0 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
26bb0 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
26bc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26bd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26be0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26bf0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26c00 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
26c10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
26c20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26c30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26c40 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
26c50 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
26c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26c70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26c80 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
26c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26ca0 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
26cb0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
26cc0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
26cd0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
26ce0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
26cf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
26d00 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
26d10 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
26d20 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
26d30 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
26d40 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
26d50 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69  he file */.    i
26d60 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72  nt nPage = pager
26d70 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
26d80 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61      *pPgno = nPa
26d90 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28  ge + 1;..    if(
26da0 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
26db0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
26dc0 29 7b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  ){.      (*pPgno
26dd0 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  )++;.    }..#ifn
26de0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26df0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
26e00 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
26e10 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
26e20 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  AGE(pBt, *pPgno)
26e30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
26e40 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
26e50 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
26e60 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
26e70 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
26e80 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
26e90 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
26ea0 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
26eb0 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
26ec0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
26ed0 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
26ee0 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
26ef0 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
26f00 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
26f10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
26f20 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
26f30 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
26f40 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
26f50 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
26f60 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
26f70 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
26f80 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
26f90 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
26fa0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
26fb0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
26fc0 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
26fd0 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  o, &pPg, 0);.   
26fe0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26ff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27000 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
27010 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
27020 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
27030 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
27040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27050 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
27060 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29  ;.      (*pPgno)
27070 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  ++;.      if( *p
27080 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
27090 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
270a0 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20  (*pPgno)++; }.  
270b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
270c0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
270d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
270e0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
270f0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
27100 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
27110 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
27120 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
27130 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27140 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
27150 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
27160 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
27170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27180 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
27190 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
271a0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
271b0 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
271c0 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
271d0 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
271e0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
271f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
27200 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
27210 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
27220 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
27230 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
27240 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
27250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27260 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
27270 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
27280 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
27290 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
272a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
272b0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
272c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
272d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
272e0 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
272f0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
27300 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
27310 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
27320 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
27330 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27340 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
27350 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
27360 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
27370 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
27380 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
27390 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
273a0 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
273b0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
273c0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
273d0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
273e0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
273f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
27400 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
27410 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
27420 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
27430 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
27440 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
27450 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
27460 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
27470 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
27480 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
27490 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
274a0 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
274b0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
274c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
274d0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
274e0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
274f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
27500 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
27510 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
27520 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
27530 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
27540 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
27550 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
27560 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
27570 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
27580 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
27590 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
275a0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
275b0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
275c0 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
275d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
275e0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
275f0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
27600 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
27610 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
27620 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
27630 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
27640 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
27650 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
27660 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
27670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27680 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
27690 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
276a0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
276d0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
276e0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
276f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27700 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
27710 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
27720 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
27730 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
27740 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
27750 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
27760 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  t( iPage>1 );.  
27770 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
27780 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
27790 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
277a0 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
277b0 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
277c0 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
277d0 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
277e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
277f0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
27800 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
27810 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
27820 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
27830 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
27840 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
27850 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
27860 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
27870 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
27880 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
27890 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
278a0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
278b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
278c0 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
278d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
278e0 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69  ], nFree+1);..#i
278f0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
27900 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49  RE_DELETE.  /* I
27910 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43  f the SQLITE_SEC
27920 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69  URE_DELETE compi
27930 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
27940 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
27950 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
27960 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
27970 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
27980 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f  with zeros..  */
27990 0a 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26  .  if( (!pPage &
279a0 26 20 28 72 63 20 3d 20 62 74 72 65 65 47 65 74  & (rc = btreeGet
279b0 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
279c0 20 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20   &pPage, 0))).  
279d0 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
279e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
279f0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
27a00 62 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20  bPage)).  ){.   
27a10 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
27a20 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ut;.  }.  memset
27a30 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
27a40 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
27a50 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
27a60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
27a70 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
27a80 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
27a90 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
27aa0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
27ab0 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
27ac0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
27ad0 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
27ae0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
27af0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
27b00 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41  Bt, iPage, PTRMA
27b10 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26  P_FREEPAGE, 0, &
27b20 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
27b30 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
27b40 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
27b50 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
27b60 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
27b70 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
27b80 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
27b90 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
27ba0 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
27bb0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
27bc0 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
27bd0 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
27be0 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
27bf0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
27c00 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
27c10 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
27c20 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
27c30 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
27c40 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
27c50 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
27c60 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
27c70 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
27c80 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
27c90 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
27ca0 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
27cb0 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
27cc0 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
27cd0 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
27ce0 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
27cf0 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
27d00 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61   ){.    u32 nLea
27d10 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
27d20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
27d30 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
27d40 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
27d50 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
27d60 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
27d70 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
27d80 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
27d90 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
27da0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
27db0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27dc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
27dd0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
27de0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61  .    }..    nLea
27df0 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  f = get4byte(&pT
27e00 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
27e10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
27e20 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20  ->usableSize>32 
27e30 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66  );.    if( nLeaf
27e40 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   > (u32)pBt->usa
27e50 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
27e60 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
27e70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27e80 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
27e90 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
27ea0 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20      if( nLeaf < 
27eb0 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
27ec0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
27ed0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
27ee0 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f  ase there is roo
27ef0 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70  m on the trunk p
27f00 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68  age to insert th
27f10 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
27f20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
27f30 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20   new leaf..     
27f40 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
27f50 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b  e that the trunk
27f60 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61   page is not rea
27f70 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69  lly full until i
27f80 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
27f90 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
27fa0 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f   - 2 entries, no
27fb0 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  t usableSize/4 -
27fc0 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65   8 entries as we
27fd0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63   have.      ** c
27fe0 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74  oded.  But due t
27ff0 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
28000 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   in versions of 
28010 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a  SQLite prior to.
28020 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20        ** 3.6.0, 
28030 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66  databases with f
28040 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
28050 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65  ges holding more
28060 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75   than.      ** u
28070 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
28080 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20  entries will be 
28090 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72  reported as corr
280a0 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20  upt.  In order. 
280b0 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74       ** to maint
280c0 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f  ain backwards co
280d0 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
280e0 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
280f0 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20  of SQLite,.     
28100 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74   ** we will cont
28110 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74  inue to restrict
28120 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
28130 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
28140 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
28150 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
28160 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
28170 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
28180 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
28190 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
281a0 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
281b0 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
281c0 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
281d0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
281e0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
281f0 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
28200 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
28210 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
28220 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
28230 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28240 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
28250 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
28260 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28270 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
28280 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
28290 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29  ata[4], nLeaf+1)
282a0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
282b0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
282c0 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50  a[8+nLeaf*4], iP
282d0 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  age);.#ifndef SQ
282e0 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
282f0 54 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  TE.        if( p
28300 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
28310 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
28320 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
28330 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
28340 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
28350 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48    rc = btreeSetH
28360 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69  asContent(pBt, i
28370 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
28380 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
28390 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
283a0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
283b0 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
283c0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
283d0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
283e0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
283f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74   }..  /* If cont
28400 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69  rol flows to thi
28410 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74  s point, then it
28420 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
28430 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a  e to add the.  *
28440 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  * the page being
28450 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66   freed as a leaf
28460 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72   page of the fir
28470 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
28480 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20  free-list..  ** 
28490 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  Possibly because
284a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
284b0 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73  s empty, or poss
284c0 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
284d0 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75   .  ** first tru
284e0 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
284f0 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74  ist is full. Eit
28500 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67  her way, the pag
28510 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20  e being freed.  
28520 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ** will become t
28530 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75  he new first tru
28540 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
28550 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ree-list..  */. 
28560 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26   if( pPage==0 &&
28570 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
28580 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
28590 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
285a0 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f  e, 0)) ){.    go
285b0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
285c0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
285d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
285e0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
285f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28600 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  OK ){.    goto f
28610 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
28620 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67  .  put4byte(pPag
28630 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b  e->aData, iTrunk
28640 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
28650 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
28660 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
28670 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
28680 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41  ], iPage);.  TRA
28690 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
286a0 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
286b0 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
286c0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
286d0 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70  iTrunk));..freep
286e0 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
286f0 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
28700 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
28710 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
28720 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  (pPage);.  relea
28730 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
28740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
28750 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
28760 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
28770 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ge, int *pRC){. 
28780 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
28790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
287a0 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  RC = freePage2(p
287b0 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65  Page->pBt, pPage
287c0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
287d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
287e0 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
287f0 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
28800 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
28810 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
28820 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d  nt clearCell(Mem
28830 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73  Page *pPage, uns
28840 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
28850 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  l){.  BtShared *
28860 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
28870 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
28880 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67  o;.  Pgno ovflPg
28890 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
288a0 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36  int nOvfl;.  u16
288b0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a   ovflPageSize;..
288c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
288d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
288e0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
288f0 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
28900 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
28910 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
28920 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
28930 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
28940 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
28950 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
28960 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
28970 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
28980 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
28990 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
289a0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
289b0 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72  rflow]);.  asser
289c0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
289d0 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c  ze > 4 );.  ovfl
289e0 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
289f0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
28a00 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e    nOvfl = (info.
28a10 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e  nPayload - info.
28a20 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
28a30 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
28a40 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
28a50 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  t( ovflPgno==0 |
28a60 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77  | nOvfl>0 );.  w
28a70 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
28a80 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
28a90 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
28aa0 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
28ab0 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
28ac0 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65  || ovflPgno>page
28ad0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
28ae0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
28af0 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
28b00 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
28b10 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
28b20 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
28b30 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
28b40 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
28b50 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
28b60 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
28b70 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
28b80 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
28b90 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
28ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
28bb0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
28bc0 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
28bd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
28be0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
28bf0 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
28c00 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
28c10 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
28c20 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
28c30 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
28c40 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
28c50 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70  Pgno);.    if( p
28c60 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
28c70 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
28c80 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
28c90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
28ca0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
28cb0 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
28cc0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
28cd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28ce0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
28cf0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
28d00 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
28d10 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
28d20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
28d30 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
28d40 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
28d50 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
28d60 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
28d70 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
28d80 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
28d90 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
28da0 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
28db0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
28dc0 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
28dd0 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
28de0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
28df0 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
28e00 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
28e10 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
28e20 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
28e30 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
28e40 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
28e50 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
28e60 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
28e70 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
28e80 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
28e90 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
28ea0 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
28eb0 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
28ec0 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
28ed0 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
28ee0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
28ef0 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
28f00 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
28f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
28f20 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
28f30 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
28f40 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
28f50 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
28f60 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
28f70 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
28f80 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
28f90 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
28fa0 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
28fb0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
28fc0 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
28fd0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
28fe0 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29000 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
29010 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
29020 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
29030 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
29040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29050 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
29060 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
29070 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
29080 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
29090 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
290a0 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
290b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
290c0 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
290d0 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
290e0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
290f0 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
29100 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
29110 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
29120 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
29130 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
29140 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
29150 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
29160 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
29170 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
29180 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
29190 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
291a0 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
291b0 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
291c0 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
291d0 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
291e0 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
291f0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
29200 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
29210 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
29220 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
29230 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
29240 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
29250 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
29260 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
29270 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
29280 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
29290 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
292a0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
292b0 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
292c0 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
292d0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
292e0 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
292f0 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
29300 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
29310 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
29320 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
29330 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
29340 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
29350 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
29360 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
29370 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
29380 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
29390 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
293a0 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61  nKey);.  btreePa
293b0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
293c0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
293d0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
293e0 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
293f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
29400 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
29410 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
29420 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61  nData==(u32)(nDa
29430 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a  ta+nZero) );.  .
29440 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
29450 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
29460 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
29470 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
29480 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
29490 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
294a0 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
294b0 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
294c0 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
294d0 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30  if( NEVER(nKey>0
294e0 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65  x7fffffff || pKe
294f0 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72  y==0) ){.      r
29500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
29510 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
29520 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
29530 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
29540 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
29550 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
29560 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
29570 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
29580 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
29590 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
295a0 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
295b0 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
295c0 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
295d0 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
295e0 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
295f0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
29600 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
29610 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
29620 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
29630 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
29640 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
29650 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
29660 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
29670 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
29680 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
29690 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
296a0 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
296b0 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
296c0 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
296d0 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
296e0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
296f0 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
29700 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
29710 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
29720 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
29730 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
29740 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
29750 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
29760 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
29770 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29780 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
29790 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
297a0 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
297b0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
297c0 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
297d0 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
297e0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
297f0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
29800 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
29810 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
29820 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
29830 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
29840 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
29850 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
29860 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
29870 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
29880 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
29890 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
298a0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
298b0 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
298c0 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
298d0 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
298e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
298f0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
29900 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
29910 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
29920 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
29930 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
29940 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73   the uninitialis
29950 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
29960 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
29970 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
29980 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
29990 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
299a0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
299b0 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
299c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
299d0 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
299e0 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
299f0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
29a00 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
29a10 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
29a20 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
29a30 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
29a40 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
29a50 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
29a60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
29a70 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
29a80 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
29a90 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
29aa0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
29ab0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
29ac0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
29ad0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
29ae0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
29af0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
29b00 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
29b10 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
29b20 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
29b30 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
29b40 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
29b50 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
29b60 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
29b70 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
29b80 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
29b90 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
29ba0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
29bb0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
29bc0 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
29bd0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
29be0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
29bf0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
29c00 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
29c10 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
29c20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
29c30 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
29c40 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
29c50 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
29c60 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
29c70 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
29c80 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
29c90 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
29ca0 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
29cb0 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
29cc0 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
29cd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
29ce0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
29cf0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
29d00 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
29d10 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
29d20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
29d30 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
29d40 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
29d50 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
29d60 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
29d70 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
29d80 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
29d90 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
29da0 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
29db0 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
29dc0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
29dd0 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
29de0 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
29df0 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
29e00 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
29e10 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
29e20 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
29e30 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
29e40 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
29e50 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
29e60 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
29e70 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
29e80 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
29e90 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
29ea0 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
29eb0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
29ec0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
29ed0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
29ee0 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
29ef0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
29f00 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
29f10 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
29f20 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
29f30 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
29f40 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
29f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
29f60 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
29f70 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
29f80 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
29f90 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
29fa0 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
29fb0 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
29fc0 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
29fd0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
29fe0 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
29ff0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a000 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
2a010 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
2a020 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
2a030 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
2a040 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
2a050 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
2a060 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
2a070 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
2a080 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
2a090 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
2a0a0 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
2a0b0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
2a0c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2a0d0 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
2a0e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2a0f0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
2a100 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
2a110 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
2a120 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
2a130 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
2a140 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
2a150 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
2a160 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
2a170 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
2a180 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2a190 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
2a1a0 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
2a1b0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2a1c0 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
2a1d0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
2a1e0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
2a1f0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
2a200 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
2a210 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2a220 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
2a230 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
2a240 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2a250 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
2a260 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  z, int *pRC){.  
2a270 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2a280 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2a290 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
2a2a0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
2a2b0 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
2a2c0 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
2a2d0 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
2a2e0 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
2a2f0 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
2a300 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
2a310 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
2a320 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
2a330 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
2a340 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
2a350 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
2a360 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  e */.  int hdr; 
2a370 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
2a380 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65  ing of the heade
2a390 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73  r.  0 most pages
2a3a0 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f  .  100 page 1 */
2a3b0 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
2a3c0 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
2a3d0 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
2a3e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2a3f0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2a400 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64  llSize(pPage, id
2a410 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2a420 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2a430 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2a440 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
2a450 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2a460 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2a470 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2a480 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2a490 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61  ata;.  ptr = &da
2a4a0 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
2a4b0 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20  fset + 2*idx];. 
2a4c0 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
2a4d0 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  tr);.  hdr = pPa
2a4e0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
2a4f0 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67   testcase( pc==g
2a500 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2a510 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63  r+5]) );.  testc
2a520 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67  ase( pc+sz==pPag
2a530 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2a540 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c  ze );.  if( pc <
2a550 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
2a560 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a  hdr+5]) || pc+sz
2a570 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
2a580 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
2a590 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
2a5a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2a5b0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
2a5c0 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50  c = freeSpace(pP
2a5d0 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
2a5e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
2a5f0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
2a600 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  urn;.  }.  for(i
2a610 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d  =idx+1; i<pPage-
2a620 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72  >nCell; i++, ptr
2a630 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d  +=2){.    ptr[0]
2a640 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70   = ptr[2];.    p
2a650 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a  tr[1] = ptr[3];.
2a660 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
2a670 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65  ll--;.  put2byte
2a680 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
2a690 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
2a6a0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
2a6b0 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  2;.}../*.** Inse
2a6c0 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
2a6d0 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
2a6e0 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
2a6f0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
2a700 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
2a710 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
2a720 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2a730 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
2a740 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
2a750 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
2a760 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
2a770 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
2a780 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
2a790 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
2a7a0 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
2a7b0 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
2a7c0 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
2a7d0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
2a7e0 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
2a7f0 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  e->aOvfl[] and m
2a800 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
2a810 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2a820 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
2a830 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
2a840 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
2a850 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
2a860 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
2a870 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
2a880 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
2a890 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
2a8a0 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
2a8b0 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
2a8c0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  nted..**.** If n
2a8d0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
2a8e0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f  , then do not co
2a8f0 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  py the first nSk
2a900 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a  ip bytes of the.
2a910 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c  ** cell. The cal
2a920 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ler will overwri
2a930 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68  te them after th
2a940 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2a950 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70  rns. If.** nSkip
2a960 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2a970 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74  en pCell may not
2a980 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76   point to an inv
2a990 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  alid memory loca
2a9a0 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43  tion .** (but pC
2a9b0 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77  ell+nSkip is alw
2a9c0 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73  ays valid)..*/.s
2a9d0 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
2a9e0 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
2a9f0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
2aa00 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
2aa10 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
2aa20 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
2aa30 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
2aa40 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
2aa50 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
2aa60 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
2aa70 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
2aa80 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
2aa90 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
2aaa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2aab0 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
2aac0 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
2aad0 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
2aae0 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
2aaf0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
2ab00 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
2ab10 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
2ab20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
2ab30 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
2ab40 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
2ab50 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
2ab60 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
2ab70 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
2ab80 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
2ab90 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2aba0 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
2abb0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
2abc0 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
2abd0 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
2abe0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
2abf0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2ac00 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  ter */.  int end
2ac10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2ac20 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
2ac30 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
2ac40 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
2ac50 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
2ac60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2ac70 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
2ac80 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
2ac90 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
2aca0 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
2acb0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2acc0 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
2acd0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
2ace0 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2acf0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
2ad00 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
2ad10 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74  page */.  u8 *pt
2ad20 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  r;          /* U
2ad30 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69  sed for moving i
2ad40 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e  nformation aroun
2ad50 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a  d in data[] */..
2ad60 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69    int nSkip = (i
2ad70 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a  Child ? 4 : 0);.
2ad80 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2ad90 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2ada0 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
2adb0 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
2adc0 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
2add0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2ade0 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
2adf0 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43  ge->pBt) && MX_C
2ae00 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
2ae10 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72  =5460 );.  asser
2ae20 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2ae30 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70  low<=ArraySize(p
2ae40 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a  Page->aOvfl) );.
2ae50 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2ae60 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2ae70 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73   pCell) );.  ass
2ae80 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2ae90 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2aea0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2aeb0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
2aec0 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
2aed0 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
2aee0 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
2aef0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
2af00 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
2af10 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
2af20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
2af30 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
2af40 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
2af50 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
2af60 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
2af70 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
2af80 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
2af90 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
2afa0 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
2afb0 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  aOvfl)/sizeof(pP
2afc0 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20  age->aOvfl[0])) 
2afd0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  );.    pPage->aO
2afe0 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70  vfl[j].pCell = p
2aff0 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
2b000 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20  >aOvfl[j].idx = 
2b010 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b  (u16)i;.  }else{
2b020 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
2b030 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b040 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2b050 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2b060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b070 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
2b080 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
2b090 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2b0a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2b0b0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2b0c0 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
2b0d0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2b0e0 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20     cellOffset = 
2b0f0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
2b100 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c  t;.    end = cel
2b110 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
2b120 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e  e->nCell;.    in
2b130 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  s = cellOffset +
2b140 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61   2*i;.    rc = a
2b150 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
2b160 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20  ge, sz, &idx);. 
2b170 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52     if( rc ){ *pR
2b180 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20  C = rc; return; 
2b190 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c  }.    /* The all
2b1a0 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75  ocateSpace() rou
2b1b0 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20  tine guarantees 
2b1c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  the following tw
2b1d0 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  o properties.   
2b1e0 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e   ** if it return
2b1f0 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20  s success */.   
2b200 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
2b210 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  end+2 );.    ass
2b220 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 70  ert( idx+sz <= p
2b230 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2b240 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61  eSize );.    pPa
2b250 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
2b260 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
2b270 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a   (u16)(2 + sz);.
2b280 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
2b290 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
2b2a0 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
2b2b0 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68  ip);.    if( iCh
2b2c0 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
2b2d0 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d  4byte(&data[idx]
2b2e0 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
2b2f0 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2c 20  .    for(j=end, 
2b300 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e  ptr=&data[j]; j>
2b310 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d  ins; j-=2, ptr-=
2b320 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d  2){.      ptr[0]
2b330 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20   = ptr[-2];.    
2b340 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d    ptr[1] = ptr[-
2b350 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  1];.    }.    pu
2b360 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
2b370 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
2b380 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
2b390 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
2b3a0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
2b3b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b3c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2b3d0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
2b3e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2b3f0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
2b400 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
2b410 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
2b420 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
2b430 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
2b440 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
2b450 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
2b460 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
2b470 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
2b480 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
2b490 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
2b4a0 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
2b4b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
2b4c0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
2b4d0 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
2b4e0 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
2b4f0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
2b500 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
2b510 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
2b520 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
2b530 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
2b540 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
2b550 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
2b560 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
2b570 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
2b580 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
2b590 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
2b5a0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
2b5b0 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
2b5c0 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
2b5d0 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
2b5e0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
2b5f0 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
2b600 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
2b610 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
2b620 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
2b630 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2b640 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2b650 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43  nter */.  u8 *pC
2b660 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41  ellptr;     /* A
2b670 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
2b680 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
2b690 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20   int cellbody;  
2b6a0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2b6b0 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20   next cell body 
2b6c0 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
2b6d0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2b6e0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2b6f0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
2b700 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f  ata for pPage */
2b710 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
2b720 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2b730 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  set;           /
2b740 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
2b750 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  er on pPage */. 
2b760 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62   const int nUsab
2b770 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  le = pPage->pBt-
2b780 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20  >usableSize; /* 
2b790 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70  Usable size of p
2b7a0 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
2b7b0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2b7c0 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
2b7d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2b7e0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2b7f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2b800 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26  sert( nCell>=0 &
2b810 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  & nCell<=MX_CELL
2b820 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20  (pPage->pBt) && 
2b830 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2b840 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61  Bt)<=5460 );.  a
2b850 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2b860 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2b870 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2b880 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
2b890 61 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  at the page has 
2b8a0 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64  just been zeroed
2b8b0 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a   by zeroPage() *
2b8c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
2b8d0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
2b8e0 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
2b8f0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d  e(&data[hdr+5])=
2b900 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70  =nUsable );..  p
2b910 43 65 6c 6c 70 74 72 20 3d 20 26 64 61 74 61 5b  Cellptr = &data[
2b920 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
2b930 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20  t + nCell*2];.  
2b940 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62  cellbody = nUsab
2b950 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c  le;.  for(i=nCel
2b960 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
2b970 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d  .    pCellptr -=
2b980 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79   2;.    cellbody
2b990 20 2d 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20   -= aSize[i];.  
2b9a0 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c    put2byte(pCell
2b9b0 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  ptr, cellbody);.
2b9c0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
2b9d0 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65  [cellbody], apCe
2b9e0 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29  ll[i], aSize[i])
2b9f0 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65  ;.  }.  put2byte
2ba00 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e  (&data[hdr+3], n
2ba10 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
2ba20 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
2ba30 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
2ba40 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43  ge->nFree -= (nC
2ba50 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20  ell*2 + nUsable 
2ba60 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  - cellbody);.  p
2ba70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75  Page->nCell = (u
2ba80 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  16)nCell;.}../*.
2ba90 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2baa0 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
2bab0 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
2bac0 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
2bad0 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
2bae0 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
2baf0 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
2bb00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
2bb10 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
2bb20 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
2bb30 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
2bb40 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
2bb50 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
2bb60 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
2bb70 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2bb80 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
2bb90 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
2bba0 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
2bbb0 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
2bbc0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
2bbd0 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
2bbe0 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
2bbf0 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
2bc00 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
2bc10 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
2bc20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
2bc30 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
2bc40 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
2bc50 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
2bc60 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
2bc70 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
2bc80 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
2bc90 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
2bca0 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
2bcb0 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
2bcc0 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
2bcd0 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
2bce0 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
2bcf0 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
2bd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2bd10 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
2bd20 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2bd30 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
2bd40 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
2bd50 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
2bd60 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
2bd70 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
2bd80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2bd90 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
2bda0 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  CE./*.** This ve
2bdb0 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65  rsion of balance
2bdc0 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  () handles the c
2bdd0 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61  ommon special ca
2bde0 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65  se where.** a ne
2bdf0 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67  w entry is being
2be00 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65   inserted on the
2be10 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65   extreme right-e
2be20 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65  nd of the.** tre
2be30 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
2be40 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20  s, when the new 
2be50 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d  entry will becom
2be60 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a  e the largest.**
2be70 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
2be80 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ee..**.** Instea
2be90 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62  d of trying to b
2bea0 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67  alance the 3 rig
2beb0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67  ht-most leaf pag
2bec0 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20  es, just add.** 
2bed0 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
2bee0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
2bef0 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e  e and put the on
2bf00 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a  e new entry in.*
2bf10 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  * that page.  Th
2bf20 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69  is leaves the ri
2bf30 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20  ght side of the 
2bf40 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a  tree somewhat.**
2bf50 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75   unbalanced.  Bu
2bf60 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20  t odds are that 
2bf70 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  we will be inser
2bf80 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73  ting new entries
2bf90 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73  .** at the end s
2bfa0 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73  oon afterwards s
2bfb0 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70  o the nearly emp
2bfc0 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69  ty page will qui
2bfd0 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e  ckly.** fill up.
2bfe0 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a    On average..**
2bff0 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65  .** pPage is the
2c000 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
2c010 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
2c020 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  st page in the t
2c030 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20  ree..** pParent 
2c040 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  is its parent.  
2c050 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  pPage must have 
2c060 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f  a single overflo
2c070 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68  w entry.** which
2c080 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67   is also the rig
2c090 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e  ht-most entry on
2c0a0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
2c0b0 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66   The pSpace buff
2c0c0 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  er is used to st
2c0d0 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ore a temporary 
2c0e0 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69  copy of the divi
2c0f0 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74  der.** cell that
2c100 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
2c110 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  d into pParent. 
2c120 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73  Such a cell cons
2c130 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62  ists of a 4.** b
2c140 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
2c150 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61  followed by a va
2c160 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2c170 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a  teger. In other.
2c180 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73  ** words, at mos
2c190 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63  t 13 bytes. Henc
2c1a0 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  e the pSpace buf
2c1b0 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a  fer must be at.*
2c1c0 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73  * least 13 bytes
2c1d0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
2c1e0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2c1f0 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  quick(MemPage *p
2c200 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20  Parent, MemPage 
2c210 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61  *pPage, u8 *pSpa
2c220 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ce){.  BtShared 
2c230 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61  *const pBt = pPa
2c240 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42  ge->pBt;    /* B
2c250 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a  -Tree Database *
2c260 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  /.  MemPage *pNe
2c270 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2c280 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
2c290 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  y allocated page
2c2a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2c2d0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
2c2e0 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20  gno pgnoNew;    
2c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c300 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2c310 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20  er of pNew */.. 
2c320 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c330 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2c340 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2c350 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2c360 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2c370 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
2c380 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
2c390 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2c3a0 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28  low==1 );..  if(
2c3b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30   pPage->nCell<=0
2c3c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2c3d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
2c3e0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
2c3f0 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70  new page. This p
2c400 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
2c410 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e  the right-siblin
2c420 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65  g of .  ** pPage
2c430 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e  . Make the paren
2c440 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c  t page writable,
2c450 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77   so that the new
2c460 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20   divider cell.  
2c470 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74  ** may be insert
2c480 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73  ed. If both thes
2c490 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  e operations are
2c4a0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f   successful, pro
2c4b0 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ceed..  */.  rc 
2c4c0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2c4d0 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
2c4e0 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
2c4f0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
2c500 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38  TE_OK ){..    u8
2c510 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65   *pOut = &pSpace
2c520 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  [4];.    u8 *pCe
2c530 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66  ll = pPage->aOvf
2c540 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20  l[0].pCell;.    
2c550 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c  u16 szCell = cel
2c560 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2c570 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a  pCell);.    u8 *
2c580 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65  pStop;..    asse
2c590 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2c5a0 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77  Iswriteable(pNew
2c5b0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2c5c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2c5d0 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f  >aData[0]==(PTF_
2c5e0 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
2c5f0 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b  ATA|PTF_LEAF) );
2c600 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
2c610 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ew, PTF_INTKEY|P
2c620 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
2c630 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d  LEAF);.    assem
2c640 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c  blePage(pNew, 1,
2c650 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c   &pCell, &szCell
2c660 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2c670 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2c680 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
2c690 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2c6a0 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74  r map.    ** wit
2c6b0 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
2c6c0 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
2c6d0 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
2c6e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c   the .    ** cel
2c6f0 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f  l on the page to
2c700 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2c710 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  e. If either of 
2c720 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65  these.    ** ope
2c730 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74  rations fails, t
2c740 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  he return code i
2c750 73 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63  s set, but the c
2c760 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  ontents.    ** o
2c770 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  f the parent pag
2c780 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69  e are still mani
2c790 70 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63  pulated by thh c
2c7a0 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  ode below..    *
2c7b0 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74  * That is Ok, at
2c7c0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
2c7d0 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67  parent page is g
2c7e0 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20  uaranteed to.   
2c7f0 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
2c800 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e   dirty. Returnin
2c810 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
2c820 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20  will cause a.   
2c830 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e   ** rollback, un
2c840 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65  doing any change
2c850 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61  s made to the pa
2c860 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
2c870 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
2c880 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
2c890 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2c8a0 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42  gnoNew, PTRMAP_B
2c8b0 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
2c8c0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
2c8d0 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77   if( szCell>pNew
2c8e0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->minLocal ){.  
2c8f0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
2c900 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65  vflPtr(pNew, pCe
2c910 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ll, &rc);.      
2c920 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
2c930 2a 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64  * Create a divid
2c940 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72  er cell to inser
2c950 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  t into pParent. 
2c960 54 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  The divider cell
2c970 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73  .    ** consists
2c980 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67   of a 4-byte pag
2c990 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61  e number (the pa
2c9a0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61  ge number of pPa
2c9b0 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  ge) and.    ** a
2c9c0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
2c9d0 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63   key value (whic
2c9e0 68 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  h must be the sa
2c9f0 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a  me value as the.
2ca00 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b      ** largest k
2ca10 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20  ey on pPage)..  
2ca20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66    **.    ** To f
2ca30 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20  ind the largest 
2ca40 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61  key value on pPa
2ca50 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74  ge, first find t
2ca60 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20  he right-most . 
2ca70 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
2ca80 61 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74  age. The first t
2ca90 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69  wo fields of thi
2caa0 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a  s cell are the .
2cab0 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65      ** record-le
2cac0 6e 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65  ngth (a variable
2cad0 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20   length integer 
2cae0 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20  at most 32-bits 
2caf0 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20  in size).    ** 
2cb00 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75  and the key valu
2cb10 65 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e (a variable le
2cb20 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61  ngth integer, ma
2cb30 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65  y have any value
2cb40 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  )..    ** The fi
2cb50 72 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65  rst of the while
2cb60 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f  (...) loops belo
2cb70 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65  w skips over the
2cb80 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20   record-length. 
2cb90 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65     ** field. The
2cba0 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e   second while(..
2cbb0 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74  .) loop copies t
2cbc0 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f  he key value fro
2cbd0 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c  m the.    ** cel
2cbe0 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20  l on pPage into 
2cbf0 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
2cc00 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43  r..    */.    pC
2cc10 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2cc20 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65  Page, pPage->nCe
2cc30 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70  ll-1);.    pStop
2cc40 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
2cc50 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c    while( (*(pCel
2cc60 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43  l++)&0x80) && pC
2cc70 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20  ell<pStop );.   
2cc80 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
2cc90 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
2cca0 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70  (*(pOut++) = *(p
2ccb0 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26  Cell++))&0x80) &
2ccc0 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
2ccd0 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  ..    /* Insert 
2cce0 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
2ccf0 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e  cell into pParen
2cd00 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74  t. */.    insert
2cd10 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50  Cell(pParent, pP
2cd20 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53  arent->nCell, pS
2cd30 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74  pace, (int)(pOut
2cd40 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20  -pSpace),.      
2cd50 20 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67           0, pPag
2cd60 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a  e->pgno, &rc);..
2cd70 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72      /* Set the r
2cd80 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  ight-child point
2cd90 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f  er of pParent to
2cda0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
2cdb0 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70  w page. */.    p
2cdc0 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
2cdd0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2cde0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
2cdf0 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20  gnoNew);.  .    
2ce00 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72  /* Release the r
2ce10 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2ce20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
2ce30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2ce40 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  w);.  }..  retur
2ce50 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
2ce60 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  * SQLITE_OMIT_QU
2ce70 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23  ICKBALANCE */..#
2ce80 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if 0./*.** This 
2ce90 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
2cea0 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79  t contribute any
2ceb0 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65  thing to the ope
2cec0 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65  ration of SQLite
2ced0 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74  ..** it is somet
2cee0 69 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74  imes activated t
2cef0 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65  emporarily while
2cf00 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20   debugging code 
2cf10 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20  responsible .** 
2cf20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e  for setting poin
2cf30 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e  ter-map entries.
2cf40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2cf50 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
2cf60 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65  MemPage **apPage
2cf70 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
2cf80 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
2cf90 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b  i=0; i<nPage; i+
2cfa0 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a  +){.    Pgno n;.
2cfb0 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65      u8 e;.    Me
2cfc0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61  mPage *pPage = a
2cfd0 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74  pPage[i];.    Bt
2cfe0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
2cff0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  age->pBt;.    as
2d000 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2d010 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nit );..    for(
2d020 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43  j=0; j<pPage->nC
2d030 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ell; j++){.     
2d040 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2d050 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20        u8 *z;.   
2d060 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e    .      z = fin
2d070 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b  dCell(pPage, j);
2d080 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73  .      btreePars
2d090 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
2d0a0 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  z, &info);.     
2d0b0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
2d0c0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50  low ){.        P
2d0d0 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
2d0e0 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65  yte(&z[info.iOve
2d0f0 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20  rflow]);.       
2d100 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2d110 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  ovfl, &e, &n);. 
2d120 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2d130 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2d140 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46   e==PTRMAP_OVERF
2d150 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOW1 );.      }.
2d160 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2d170 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2d180 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
2d190 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20  et4byte(z);.    
2d1a0 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
2d1b0 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e  t, child, &e, &n
2d1c0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2d1d0 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
2d1e0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
2d1f0 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a  TREE );.      }.
2d200 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
2d210 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2d220 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
2d230 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2d240 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2d250 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2d260 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
2d270 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e  t, child, &e, &n
2d280 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2d290 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2d2a0 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
2d2b0 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EE );.    }.  }.
2d2c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
2d2d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
2d2e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
2d2f0 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f  d to copy the co
2d300 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d  ntents of the b-
2d310 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64  tree node stored
2d320 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72   .** on page pFr
2d330 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
2d340 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61  If page pFrom wa
2d350 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67  s not a leaf pag
2d360 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, then.** the p
2d370 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
2d380 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c  es for each chil
2d390 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74  d page are updat
2d3a0 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  ed so that the.*
2d3b0 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74  * parent page st
2d3c0 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e  ored in the poin
2d3d0 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20  ter map is page 
2d3e0 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f  pTo. If pFrom co
2d3f0 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63  ntained.** any c
2d400 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c  ells with overfl
2d410 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  ow page pointers
2d420 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65  , then the corre
2d430 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72  sponding pointer
2d440 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
2d450 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64  are also updated
2d460 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72   so that the par
2d470 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65  ent page is page
2d480 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   pTo..**.** If p
2d490 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c  From is currentl
2d4a0 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f  y carrying any o
2d4b0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65  verflow cells (e
2d4c0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a  ntries in the.**
2d4d0 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d   MemPage.aOvfl[]
2d4e0 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72   array), they ar
2d4f0 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20  e not copied to 
2d500 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  pTo. .**.** Befo
2d510 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61  re returning, pa
2d520 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74  ge pTo is reinit
2d530 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74  ialized using bt
2d540 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
2d550 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d  *.** The perform
2d560 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e  ance of this fun
2d570 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69  ction is not cri
2d580 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c  tical. It is onl
2d590 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  y used by .** th
2d5a0 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  e balance_shallo
2d5b0 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63  wer() and balanc
2d5c0 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65  e_deeper() proce
2d5d0 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f  dures, neither o
2d5e0 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63  f.** which are c
2d5f0 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65  alled often unde
2d600 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73  r normal circums
2d610 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tances..*/.stati
2d620 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43  c void copyNodeC
2d630 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a  ontent(MemPage *
2d640 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a  pFrom, MemPage *
2d650 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  pTo, int *pRC){.
2d660 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
2d670 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42  LITE_OK ){.    B
2d680 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20  tShared * const 
2d690 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  pBt = pFrom->pBt
2d6a0 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
2d6b0 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e   aFrom = pFrom->
2d6c0 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20  aData;.    u8 * 
2d6d0 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d  const aTo = pTo-
2d6e0 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  >aData;.    int 
2d6f0 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d  const iFromHdr =
2d700 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65   pFrom->hdrOffse
2d710 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  t;.    int const
2d720 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d   iToHdr = ((pTo-
2d730 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20  >pgno==1) ? 100 
2d740 3a 20 30 29 3b 0a 20 20 20 20 54 45 53 54 4f 4e  : 0);.    TESTON
2d750 4c 59 28 69 6e 74 20 72 63 3b 29 0a 20 20 20 20  LY(int rc;).    
2d760 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20  int iData;.  .  
2d770 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
2d780 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
2d790 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2d7a0 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
2d7b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  ;.    assert( ge
2d7c0 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
2d7d0 72 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d  romHdr+5])<=pBt-
2d7e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
2d7f0 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68   .    /* Copy th
2d800 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f  e b-tree node co
2d810 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20  ntent from page 
2d820 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
2d830 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20  o. */.    iData 
2d840 3d 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f  = get2byte(&aFro
2d850 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a  m[iFromHdr+5]);.
2d860 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b      memcpy(&aTo[
2d870 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69  iData], &aFrom[i
2d880 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62  Data], pBt->usab
2d890 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20  leSize-iData);. 
2d8a0 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
2d8b0 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69  ToHdr], &aFrom[i
2d8c0 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d  FromHdr], pFrom-
2d8d0 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
2d8e0 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pFrom->nCell);. 
2d8f0 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69   .    /* Reiniti
2d900 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73  alize page pTo s
2d910 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  o that the conte
2d920 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  nts of the MemPa
2d930 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  ge structure.   
2d940 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65   ** match the ne
2d950 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74  w data. The init
2d960 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54  ialization of pT
2d970 6f 20 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c  o "cannot" fail,
2d980 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   as the.    ** d
2d990 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  ata copied from 
2d9a0 70 46 72 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20 74  pFrom is known t
2d9b0 6f 20 62 65 20 76 61 6c 69 64 2e 20 20 2a 2f 0a  o be valid.  */.
2d9c0 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20      pTo->isInit 
2d9d0 3d 20 30 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c  = 0;.    TESTONL
2d9e0 59 28 72 63 20 3d 20 29 20 62 74 72 65 65 49 6e  Y(rc = ) btreeIn
2d9f0 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20  itPage(pTo);.   
2da00 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2da10 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 0a 20 20 20  ITE_OK );.  .   
2da20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2da30 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
2da40 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
2da50 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
2da60 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f  ntries.    ** fo
2da70 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20  r any b-tree or 
2da80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
2da90 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74  hat pTo now cont
2daa0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
2dab0 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  s to..    */.   
2dac0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2dad0 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  M ){.      *pRC 
2dae0 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
2daf0 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  s(pTo);.    }.  
2db00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2db10 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
2db20 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74  butes cells on t
2db30 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68  he iParentIdx'th
2db40 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
2db50 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20  t.** (hereafter 
2db60 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20  "the page") and 
2db70 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73  up to 2 siblings
2db80 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
2db90 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
2dba0 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74  e.** same amount
2dbb0 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20   of free space. 
2dbc0 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  Usually a single
2dbd0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68   sibling on eith
2dbe0 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a  er side of the.*
2dbf0 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20  * page are used 
2dc00 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
2dc10 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69  , though both si
2dc20 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
2dc30 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69  e from one.** si
2dc40 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  de if the page i
2dc50 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c  s the first or l
2dc60 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
2dc70 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20   parent. If the 
2dc80 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77  page .** has few
2dc90 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e  er than 2 siblin
2dca0 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  gs (something wh
2dcb0 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
2dcc0 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a  pen if the page.
2dcd0 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67  ** is a root pag
2dce0 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20  e or a child of 
2dcf0 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65  a root page) the
2dd00 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
2dd10 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74  siblings.** part
2dd20 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
2dd30 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
2dd40 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
2dd50 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  blings of the pa
2dd60 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
2dd70 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
2dd80 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72  ed by .** one or
2dd90 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
2dda0 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
2ddb0 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
2ddc0 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a  not over full. .
2ddd0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2dde0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2ddf0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
2de00 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
2de10 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69  n the page.** mi
2de20 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
2de30 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
2de40 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54  mPage.aData[]. T
2de50 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
2de60 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
2de70 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20   overfull. This 
2de80 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
2de90 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61  that all cells a
2dea0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74  llocated.** to t
2deb0 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
2dec0 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74  siblings fit int
2ded0 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  o MemPage.aData[
2dee0 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ] before returni
2def0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ng..**.** In the
2df00 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
2df10 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e  cing the page an
2df20 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20  d its siblings, 
2df30 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20  cells may be.** 
2df40 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72  inserted into or
2df50 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
2df60 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70  e parent page (p
2df70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73  Parent). Doing s
2df80 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74  o.** may cause t
2df90 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
2dfa0 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
2dfb0 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
2dfc0 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65  If this.** happe
2dfd0 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ns, it is the re
2dfe0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
2dff0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e  the caller to in
2e000 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74  voke the correct
2e010 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  .** balancing ro
2e020 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69  utine to fix thi
2e030 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74  s problem (see t
2e040 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75  he balance() rou
2e050 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  tine). .**.** If
2e060 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
2e070 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
2e080 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
2e090 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
2e0a0 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
2e0b0 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
2e0c0 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
2e0d0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2e0e0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
2e0f0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
2e100 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
2e110 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2e120 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c  ion, aOvflSpace,
2e130 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2e140 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67   a.** buffer big
2e150 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
2e160 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69  one page. If whi
2e170 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c  le inserting cel
2e180 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
2e190 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72  nt.** page (pPar
2e1a0 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20  ent) the parent 
2e1b0 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
2e1c0 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66  rfull, this buff
2e1d0 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  er is.** used to
2e1e0 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e   store the paren
2e1f0 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  t's overflow cel
2e200 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73  ls. Because this
2e210 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74   function insert
2e220 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f  s.** a maximum o
2e230 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63  f four divider c
2e240 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
2e250 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74  rent page, and t
2e260 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69  he maximum.** si
2e270 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f  ze of a cell sto
2e280 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e  red within an in
2e290 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61  ternal node is a
2e2a0 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20  lways less than 
2e2b0 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  1/4.** of the pa
2e2c0 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76  ge-size, the aOv
2e2d0 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72  flSpace[] buffer
2e2e0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2e2f0 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e  o be large.** en
2e300 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65  ough for all ove
2e310 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a  rflow cells..**.
2e320 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65  ** If aOvflSpace
2e330 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c   is set to a nul
2e340 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  l pointer, this 
2e350 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2e360 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
2e370 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
2e380 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
2e390 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2e3a0 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  rent,           
2e3b0 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
2e3c0 67 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62  ge of siblings b
2e3d0 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
2e3e0 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64  .  int iParentId
2e3f0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
2e400 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22     /* Index of "
2e410 74 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61  the page" in pPa
2e420 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f  rent */.  u8 *aO
2e430 76 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20  vflSpace,       
2e440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67            /* pag
2e450 65 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20  e-size bytes of 
2e460 73 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74  space for parent
2e470 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   ovfl */.  int i
2e480 73 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20  sRoot           
2e490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2e4a0 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73  ue if pParent is
2e4b0 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a   a root-page */.
2e4c0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2e4d0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
2e4e0 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
2e4f0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
2e500 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
2e510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e520 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
2e530 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
2e540 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
2e550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2e560 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
2e570 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
2e580 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
2e590 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  nNew = 0;       
2e5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e5b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
2e5c0 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
2e5d0 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
2e5e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e5f0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
2e600 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
2e610 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
2e620 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2e630 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
2e640 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
2e650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e660 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
2e670 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
2e680 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
2e690 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2e6a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2e6b0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
2e6c0 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  16 leafCorrectio
2e6d0 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
2e6e0 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
2e6f0 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
2e700 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
2e710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e720 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
2e730 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
2e740 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
2e750 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
2e760 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
2e770 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
2e780 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
2e790 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
2e7a0 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
2e7b0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
2e7c0 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
2e7d0 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
2e7e0 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
2e7f0 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
2e800 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
2e810 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
2e820 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20  /.  int iSpace1 
2e830 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2e840 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
2e850 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31   byte of aSpace1
2e860 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66  [] */.  int iOvf
2e870 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20  lSpace = 0;     
2e880 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
2e890 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76  used byte of aOv
2e8a0 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69  flSpace[] */.  i
2e8b0 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
2e8c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2e8d0 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
2e8e0 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
2e8f0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
2e900 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
2e910 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
2e920 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
2e930 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
2e940 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  apCopy[NB];     
2e950 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63      /* Private c
2e960 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d  opies of apOld[]
2e970 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50   pages */.  MemP
2e980 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d  age *apNew[NB+2]
2e990 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ;        /* pPag
2e9a0 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73  e and up to NB s
2e9b0 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61  iblings after ba
2e9c0 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20  lancing */.  u8 
2e9d0 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20  *pRight;        
2e9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
2e9f0 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20  ation in parent 
2ea00 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  of right-sibling
2ea10 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38   pointer */.  u8
2ea20 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20   *apDiv[NB-1];  
2ea30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2ea40 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
2ea50 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
2ea60 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
2ea70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2ea80 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
2ea90 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
2eaa0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
2eab0 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
2eac0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
2ead0 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
2eae0 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
2eaf0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
2eb00 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
2eb10 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
2eb20 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
2eb30 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
2eb40 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2eb50 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
2eb60 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
2eb70 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
2eb80 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20  u8 *aSpace1;    
2eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eba0 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73  Space for copies
2ebb0 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
2ebc0 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ls */.  Pgno pgn
2ebd0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
2ebe0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72       /* Temp var
2ebf0 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65   to store a page
2ec00 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20   number in */.. 
2ec10 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e   pBt = pParent->
2ec20 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
2ec30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2ec40 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2ec50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ec60 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ec70 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
2ec80 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20  age) );..#if 0. 
2ec90 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2eca0 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
2ecb0 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
2ecc0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
2ecd0 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65  rent->pgno));.#e
2ece0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ndif..  /* At th
2ecf0 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74  is point pParent
2ed00 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73   may have at mos
2ed10 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63  t one overflow c
2ed20 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a  ell. And if.  **
2ed30 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63   this overflow c
2ed40 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ell is present, 
2ed50 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63  it must be the c
2ed60 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69  ell with .  ** i
2ed70 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e  ndex iParentIdx.
2ed80 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63   This scenario c
2ed90 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20  omes about when 
2eda0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
2edb0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e  ** is called (in
2edc0 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73  directly) from s
2edd0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
2ede0 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  e()..  */.  asse
2edf0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
2ee00 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
2ee10 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
2ee20 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2ee30 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2ee40 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
2ee50 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
2ee60 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20  iParentIdx );.. 
2ee70 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65   if( !aOvflSpace
2ee80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ee90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2eea0 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
2eeb0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f  sibling pages to
2eec0 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c   balance. Also l
2eed0 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20  ocate the cells 
2eee0 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a  in pParent .  **
2eef0 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65   that divide the
2ef00 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74   siblings. An at
2ef10 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2ef20 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67   find NN sibling
2ef30 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65  s on .  ** eithe
2ef40 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e  r side of pPage.
2ef50 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61   More siblings a
2ef60 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e  re taken from on
2ef70 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c  e side, however,
2ef80 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20   .  ** if there 
2ef90 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e  are fewer than N
2efa0 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68  N siblings on th
2efb0 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66  e other side. If
2efc0 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
2efd0 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
2efe0 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
2eff0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
2f000 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20  ent are taken.  
2f010 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
2f020 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20  loop also drops 
2f030 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2f040 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  s from the paren
2f050 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a  t page. This.  *
2f060 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69  * way, the remai
2f070 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63  nder of the func
2f080 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61  tion does not ha
2f090 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ve to deal with 
2f0a0 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  any.  ** overflo
2f0b0 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70  w cells in the p
2f0c0 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63  arent page, sinc
2f0d0 65 20 69 66 20 61 6e 79 20 65 78 69 73 74 65 64  e if any existed
2f0e0 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20   they will.  ** 
2f0f0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
2f100 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a  n removed..  */.
2f110 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e    i = pParent->n
2f120 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65  Overflow + pPare
2f130 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28  nt->nCell;.  if(
2f140 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69   i<2 ){.    nxDi
2f150 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20  v = 0;.    nOld 
2f160 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = i+1;.  }else{.
2f170 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20      nOld = 3;.  
2f180 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78    if( iParentIdx
2f190 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
2f1a0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78         .      nx
2f1b0 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Div = 0;.    }el
2f1c0 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64  se if( iParentId
2f1d0 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78  x==i ){.      nx
2f1e0 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d  Div = i-2;.    }
2f1f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69  else{.      nxDi
2f200 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31  v = iParentIdx-1
2f210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
2f220 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b  2;.  }.  if( (i+
2f230 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
2f240 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65  Overflow)==pPare
2f250 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
2f260 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65   pRight = &pPare
2f270 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
2f280 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b  t->hdrOffset+8];
2f290 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
2f2a0 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  ight = findCell(
2f2b0 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
2f2c0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
2f2d0 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f  low);.  }.  pgno
2f2e0 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67   = get4byte(pRig
2f2f0 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  ht);.  while( 1 
2f300 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  ){.    rc = getA
2f310 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
2f320 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29  pgno, &apOld[i])
2f330 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2f340 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f        memset(apO
2f350 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a  ld, 0, (i+1)*siz
2f360 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a  eof(MemPage*));.
2f370 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2f380 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2f390 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20  }.    nMaxCells 
2f3a0 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  += 1+apOld[i]->n
2f3b0 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  Cell+apOld[i]->n
2f3c0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66  Overflow;.    if
2f3d0 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65  ( (i--)==0 ) bre
2f3e0 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e  ak;..    if( i+n
2f3f0 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61  xDiv==pParent->a
2f400 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70  Ovfl[0].idx && p
2f410 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2f420 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  w ){.      apDiv
2f430 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61  [i] = pParent->a
2f440 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20  Ovfl[0].pCell;. 
2f450 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
2f460 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
2f470 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
2f480 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2f490 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
2f4a0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
2f4b0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
2f4c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f4d0 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
2f4e0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
2f4f0 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
2f500 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20  verflow);.      
2f510 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
2f520 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2f530 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
2f540 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
2f550 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20   apDiv[i]);..   
2f560 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63     /* Drop the c
2f570 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ell from the par
2f580 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b  ent page. apDiv[
2f590 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20  i] still points 
2f5a0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
2f5b0 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20  cell within the 
2f5c0 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f  parent, even tho
2f5d0 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20  ugh it has been 
2f5e0 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  dropped..      *
2f5f0 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62  * This is safe b
2f600 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20  ecause dropping 
2f610 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72  a cell only over
2f620 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74  writes the first
2f630 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
2f640 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20  ytes of it, and 
2f650 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
2f660 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  es not need the 
2f670 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
2f680 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65  our bytes of the
2f690 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53   divider cell. S
2f6a0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  o the pointer is
2f6b0 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20   safe to use.   
2f6c0 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20     ** later on. 
2f6d0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
2f6e0 20 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 69 74   ** Unless SQLit
2f6f0 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e  e is compiled in
2f700 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
2f710 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
2f720 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e,.      ** the 
2f730 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69  dropCell() routi
2f740 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  ne will overwrit
2f750 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  e the entire cel
2f760 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20  l with zeroes.. 
2f770 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
2f780 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c  case, temporaril
2f790 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20  y copy the cell 
2f7a0 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70  into the aOvflSp
2f7b0 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62  ace[].      ** b
2f7c0 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62  uffer. It will b
2f7d0 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61  e copied out aga
2f7e0 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  in as soon as th
2f7f0 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65  e aSpace[] buffe
2f800 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  r.      ** is al
2f810 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 23 69 66  located.  */.#if
2f820 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
2f830 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 6d  E_DELETE.      m
2f840 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63  emcpy(&aOvflSpac
2f850 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65  e[apDiv[i]-pPare
2f860 6e 74 2d 3e 61 44 61 74 61 5d 2c 20 61 70 44 69  nt->aData], apDi
2f870 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b  v[i], szNew[i]);
2f880 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
2f890 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70  = &aOvflSpace[ap
2f8a0 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e  Div[i]-pParent->
2f8b0 61 44 61 74 61 5d 3b 0a 23 65 6e 64 69 66 0a 20  aData];.#endif. 
2f8c0 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
2f8d0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
2f8e0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2f8f0 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63  w, szNew[i], &rc
2f900 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2f910 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c  /* Make nMaxCell
2f920 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  s a multiple of 
2f930 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  4 in order to pr
2f940 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20  eserve 8-byte.  
2f950 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a  ** alignment */.
2f960 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e    nMaxCells = (n
2f970 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33  MaxCells + 3)&~3
2f980 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
2f990 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
2f9a0 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2f9b0 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74  s.  */.  k = pBt
2f9c0 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55  ->pageSize + ROU
2f9d0 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
2f9e0 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63  ge));.  szScratc
2f9f0 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43  h =.       nMaxC
2fa00 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29  ells*sizeof(u8*)
2fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c         /* apCell
2fa30 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43   */.     + nMaxC
2fa40 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29  ells*sizeof(u16)
2fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa60 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c         /* szCell
2fa70 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e   */.     + pBt->
2fa80 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20  pageSize        
2fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2faa0 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65         /* aSpace
2fab0 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f  1 */.     + k*nO
2fac0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fae0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2faf0 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29 20  copies (apCopy) 
2fb00 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  */.  apCell = sq
2fb10 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c  lite3ScratchMall
2fb20 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b  oc( szScratch );
2fb30 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d   .  if( apCell==
2fb40 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
2fb50 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2fb60 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2fb70 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65  anup;.  }.  szCe
2fb80 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65  ll = (u16*)&apCe
2fb90 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
2fba0 20 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29   aSpace1 = (u8*)
2fbb0 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &szCell[nMaxCell
2fbc0 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  s];.  assert( EI
2fbd0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2fbe0 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a  NT(aSpace1) );..
2fbf0 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70    /*.  ** Load p
2fc00 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63  ointers to all c
2fc10 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20  ells on sibling 
2fc20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69  pages and the di
2fc30 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
2fc40 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
2fc50 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20  apCell[] array. 
2fc60 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
2fc70 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2fc80 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63  s.  ** into spac
2fc90 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
2fca0 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65  aSpace1[] and re
2fcb0 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69 76  move the the div
2fcc0 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20  ider Cells.  ** 
2fcd0 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20  from pParent..  
2fce0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  **.  ** If the s
2fcf0 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c  iblings are on l
2fd00 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20  eaf pages, then 
2fd10 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  the child pointe
2fd20 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64  rs of the.  ** d
2fd30 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65  ivider cells are
2fd40 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74   stripped from t
2fd50 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  he cells before 
2fd60 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a  they are copied.
2fd70 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65    ** into aSpace
2fd80 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61  1[].  In this wa
2fd90 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
2fda0 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74  apCell[] are wit
2fdb0 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20  hout.  ** child 
2fdc0 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69  pointers.  If si
2fdd0 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
2fde0 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20  eaves, then all 
2fdf0 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43  cell in.  ** apC
2fe00 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68  ell[] include ch
2fe10 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45  ild pointers.  E
2fe20 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63  ither way, all c
2fe30 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
2fe40 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e  .  ** are alike.
2fe50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43  .  **.  ** leafC
2fe60 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66  orrection:  4 if
2fe70 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
2fe80 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73  .  0 if pPage is
2fe90 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a   not a leaf..  *
2fea0 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61  *       leafData
2feb0 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f  :  1 if pPage ho
2fec0 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64  lds key+data and
2fed0 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f   pParent holds o
2fee0 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20  nly keys..  */. 
2fef0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20   leafCorrection 
2ff00 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66  = apOld[0]->leaf
2ff10 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
2ff20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61   apOld[0]->hasDa
2ff30 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ta;.  for(i=0; i
2ff40 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
2ff50 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20   int limit;.    
2ff60 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  .    /* Before d
2ff70 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
2ff80 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20  se, take a copy 
2ff90 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69 67  of the i'th orig
2ffa0 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20  inal sibling.   
2ffb0 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
2ffc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
2ffd0 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
2ffe0 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
2fff0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  er.    ** that t
30000 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
30010 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
30020 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
30030 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  be in the.    **
30040 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
30050 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  g overwritten.  
30060 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
30070 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d  pOld = apCopy[i]
30080 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53   = (MemPage*)&aS
30090 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53  pace1[pBt->pageS
300a0 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20  ize + k*i];.    
300b0 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f  memcpy(pOld, apO
300c0 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65  ld[i], sizeof(Me
300d0 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c  mPage));.    pOl
300e0 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64  d->aData = (void
300f0 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20  *)&pOld[1];.    
30100 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61  memcpy(pOld->aDa
30110 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44  ta, apOld[i]->aD
30120 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  ata, pBt->pageSi
30130 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20  ze);..    limit 
30140 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f  = pOld->nCell+pO
30150 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
30160 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
30170 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
30180 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
30190 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
301a0 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
301b0 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  = findOverflowCe
301c0 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20  ll(pOld, j);.   
301d0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
301e0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
301f0 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c  Old, apCell[nCel
30200 6c 5d 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c  l]);.      nCell
30210 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
30220 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c  ( i<nOld-1 && !l
30230 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20  eafData){.      
30240 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a  u16 sz = (u16)sz
30250 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38  New[i];.      u8
30260 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61   *pTemp;.      a
30270 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
30280 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
30290 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
302a0 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  sz;.      pTemp 
302b0 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63  = &aSpace1[iSpac
302c0 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63  e1];.      iSpac
302d0 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  e1 += sz;.      
302e0 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
302f0 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20  >pageSize/4 );. 
30300 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
30310 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ace1<=pBt->pageS
30320 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ize );.      mem
30330 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76  cpy(pTemp, apDiv
30340 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  [i], sz);.      
30350 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
30360 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63  pTemp+leafCorrec
30370 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  tion;.      asse
30380 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
30390 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72  on==0 || leafCor
303a0 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
303b0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
303c0 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c  ] = szCell[nCell
303d0 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ] - leafCorrecti
303e0 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  on;.      if( !p
303f0 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  Old->leaf ){.   
30400 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
30410 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29  fCorrection==0 )
30420 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
30430 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65  ( pOld->hdrOffse
30440 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
30450 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69  /* The right poi
30460 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  nter of the chil
30470 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f  d page pOld beco
30480 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20  mes the left.   
30490 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20       ** pointer 
304a0 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
304b0 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ell */.        m
304c0 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65  emcpy(apCell[nCe
304d0 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74  ll], &pOld->aDat
304e0 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[8], 4);.      
304f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
30500 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
30510 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
30520 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e      if( szCell[n
30530 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20  Cell]<4 ){.     
30540 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
30550 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73  llow any cells s
30560 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79  maller than 4 by
30570 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tes. */.        
30580 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
30590 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
305a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65       }.      nCe
305b0 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ll++;.    }.  }.
305c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72  .  /*.  ** Figur
305d0 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  e out the number
305e0 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64   of pages needed
305f0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65   to hold all nCe
30600 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53  ll cells..  ** S
30610 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72  tore this number
30620 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63   in "k".  Also c
30630 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77  ompute szNew[] w
30640 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61  hich is the tota
30650 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61  l.  ** size of a
30660 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  ll cells on the 
30670 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e  i-th page and cn
30680 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  tNew[] which is 
30690 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69  the index.  ** i
306a0 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  n apCell[] of th
306b0 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69  e cell that divi
306c0 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20  des page i from 
306d0 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a  page i+1.  .  **
306e0 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c   cntNew[k] shoul
306f0 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20  d equal nCell.. 
30700 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20   **.  ** Values 
30710 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73  computed by this
30720 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a   block:.  **.  *
30730 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54  *           k: T
30740 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
30750 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  of sibling pages
30760 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69  .  **    szNew[i
30770 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f  ]: Spaced used o
30780 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  n the i-th sibli
30790 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20  ng page..  **   
307a0 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78  cntNew[i]: Index
307b0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64   in apCell[] and
307c0 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68   szCell[] for th
307d0 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a  e first cell to.
307e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
307f0 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74    the right of t
30800 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
30810 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c  page..  ** usabl
30820 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f  eSpace: Number o
30830 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
30840 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61   available on ea
30850 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a  ch sibling..  **
30860 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53   .  */.  usableS
30870 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  pace = pBt->usab
30880 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65  leSize - 12 + le
30890 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
308a0 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69  for(subtotal=k=i
308b0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
308c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
308d0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
308e0 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a    subtotal += sz
308f0 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20  Cell[i] + 2;.   
30900 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20   if( subtotal > 
30910 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20  usableSpace ){. 
30920 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20       szNew[k] = 
30930 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c  subtotal - szCel
30940 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e  l[i];.      cntN
30950 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20  ew[k] = i;.     
30960 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
30970 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75   i--; }.      su
30980 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  btotal = 0;.    
30990 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28    k++;.      if(
309a0 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20   k>NB+1 ){ rc = 
309b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20  SQLITE_CORRUPT; 
309c0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
309d0 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20  anup; }.    }.  
309e0 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73  }.  szNew[k] = s
309f0 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65  ubtotal;.  cntNe
30a00 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20  w[k] = nCell;.  
30a10 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  k++;..  /*.  ** 
30a20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70  The packing comp
30a30 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  uted by the prev
30a40 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69  ious block is bi
30a50 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20  ased toward the 
30a60 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e  siblings.  ** on
30a70 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20   the left side. 
30a80 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e   The left siblin
30a90 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65  gs are always ne
30aa0 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65  arly full, while
30ab0 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d   the.  ** right-
30ac0 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67  most sibling mig
30ad0 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70  ht be nearly emp
30ae0 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20  ty.  This block 
30af0 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73  of code attempts
30b00 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20  .  ** to adjust 
30b10 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73  the packing of s
30b20 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61  iblings to get a
30b30 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e   better balance.
30b40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
30b50 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f  adjustment is mo
30b60 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d  re than an optim
30b70 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61  ization.  The pa
30b80 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68  cking above migh
30b90 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74  t.  ** be so out
30ba0 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74   of balance as t
30bb0 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46  o be illegal.  F
30bc0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
30bd0 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
30be0 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
30bf0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
30c00 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d  y.  This adjustm
30c10 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f  ent is not optio
30c20 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  nal..  */.  for(
30c30 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  i=k-1; i>0; i--)
30c40 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68  {.    int szRigh
30c50 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f  t = szNew[i];  /
30c60 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e  * Size of siblin
30c70 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  g on the right *
30c80 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74  /.    int szLeft
30c90 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f   = szNew[i-1]; /
30ca0 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e  * Size of siblin
30cb0 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f  g on the left */
30cc0 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20  .    int r;     
30cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
30ce0 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20  x of right-most 
30cf0 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62  cell in left sib
30d00 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ling */.    int 
30d10 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
30d20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
30d30 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65  t cell to the le
30d40 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c  ft of right sibl
30d50 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20  ing */..    r = 
30d60 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
30d70 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d  .    d = r + 1 -
30d80 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61   leafData;.    a
30d90 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c  ssert( d<nMaxCel
30da0 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ls );.    assert
30db0 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( r<nMaxCells );
30dc0 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69  .    while( szRi
30dd0 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68  ght==0 || szRigh
30de0 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73  t+szCell[d]+2<=s
30df0 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d  zLeft-(szCell[r]
30e00 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52  +2) ){.      szR
30e10 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64  ight += szCell[d
30e20 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c  ] + 2;.      szL
30e30 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d  eft -= szCell[r]
30e40 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e   + 2;.      cntN
30e50 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20  ew[i-1]--;.     
30e60 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
30e70 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20   - 1;.      d = 
30e80 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
30e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65  ;.    }.    szNe
30ea0 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a  w[i] = szRight;.
30eb0 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d      szNew[i-1] =
30ec0 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20   szLeft;.  }..  
30ed0 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75  /* Either we fou
30ee0 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  nd one or more c
30ef0 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29  ells (cntnew[0])
30f00 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69 73 0a  >0) or pPage is.
30f10 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
30f20 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
30f30 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
30f40 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
30f50 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
30f60 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
30f70 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
30f80 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
30f90 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
30fa0 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
30fb0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
30fc0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
30fd0 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 54 52 41  ll==0) );..  TRA
30fe0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c  CE(("BALANCE: ol
30ff0 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a  d: %d %d %d  ",.
31000 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67      apOld[0]->pg
31010 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32  no, .    nOld>=2
31020 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e   ? apOld[1]->pgn
31030 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e  o : 0,.    nOld>
31040 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70  =3 ? apOld[2]->p
31050 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20  gno : 0.  ));.. 
31060 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
31070 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
31080 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
31090 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
310a0 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64    */.  if( apOld
310b0 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a  [0]->pgno<=1 ){.
310c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
310d0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 67 6f 74  CORRUPT;.    got
310e0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
310f0 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61  p;.  }.  pageFla
31100 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61  gs = apOld[0]->a
31110 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69  Data[0];.  for(i
31120 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
31130 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
31140 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  ;.    if( i<nOld
31150 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
31160 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c   apNew[i] = apOl
31170 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c  d[i];.      apOl
31180 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  d[i] = 0;.      
31190 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
311a0 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62  rWrite(pNew->pDb
311b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65  Page);.      nNe
311c0 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72  w++;.      if( r
311d0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
311e0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65  _cleanup;.    }e
311f0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
31200 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
31210 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
31220 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
31230 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20  w, &pgno, pgno, 
31240 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
31250 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
31260 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
31270 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
31280 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20        nNew++;.. 
31290 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
312a0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
312b0 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69  y for the new si
312c0 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
312d0 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
312e0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  ACUUM ){.       
312f0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
31300 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  pNew->pgno, PTRM
31310 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
31320 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
31330 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
31340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31350 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
31360 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
31370 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31380 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72    }.  }..  /* Fr
31390 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73  ee any old pages
313a0 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72   that were not r
313b0 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67  eused as new pag
313c0 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  es..  */.  while
313d0 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
313e0 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  freePage(apOld[i
313f0 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  ], &rc);.    if(
31400 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
31410 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
31420 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
31430 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64  d[i]);.    apOld
31440 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b  [i] = 0;.    i++
31450 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
31460 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67   Put the new pag
31470 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
31480 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c  order.  This hel
31490 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  ps to.  ** keep 
314a0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64  entries in the d
314b0 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  isk file in orde
314c0 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e  r so that a scan
314d0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
314e0 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73  le is a linear s
314f0 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
31500 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a  file.  That.  **
31510 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74   in turn helps t
31520 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
31530 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70  tem to deliver p
31540 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  ages.  ** from t
31550 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70  he disk more rap
31560 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  idly..  **.  ** 
31570 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74  An O(n^2) insert
31580 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74  ion sort algorit
31590 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20  hm is used, but 
315a0 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20  since.  ** n is 
315b0 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
315c0 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73  NB (a small cons
315d0 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75  tant), that shou
315e0 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  ld.  ** not be a
315f0 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20   problem..  **. 
31600 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20   ** When NB==3, 
31610 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a  this one optimiz
31620 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20  ation makes the 
31630 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62  database.  ** ab
31640 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66  out 25% faster f
31650 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69  or large inserti
31660 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ons and deletion
31670 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
31680 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a  0; i<k-1; i++){.
31690 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61      int minV = a
316a0 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[i]->pgno;. 
316b0 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b     int minI = i;
316c0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
316d0 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<k; j++){.     
316e0 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70   if( apNew[j]->p
316f0 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  gno<(unsigned)mi
31700 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
31710 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
31720 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d  minV = apNew[j]-
31730 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  >pgno;.      }. 
31740 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e     }.    if( min
31750 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  I>i ){.      int
31760 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   t;.      MemPag
31770 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d  e *pT;.      t =
31780 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b   apNew[i]->pgno;
31790 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65  .      pT = apNe
317a0 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  w[i];.      apNe
317b0 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e  w[i] = apNew[min
317c0 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  I];.      apNew[
317d0 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20  minI] = pT;.    
317e0 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  }.  }.  TRACE(("
317f0 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25  new: %d(%d) %d(%
31800 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
31810 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
31820 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20  apNew[0]->pgno, 
31830 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e  szNew[0],.    nN
31840 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d  ew>=2 ? apNew[1]
31850 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
31860 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
31870 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
31880 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f  ? apNew[2]->pgno
31890 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20   : 0, nNew>=3 ? 
318a0 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20  szNew[2] : 0,.  
318b0 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65    nNew>=4 ? apNe
318c0 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[3]->pgno : 0, 
318d0 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b  nNew>=4 ? szNew[
318e0 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  3] : 0,.    nNew
318f0 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e  >=5 ? apNew[4]->
31900 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
31910 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30  5 ? szNew[4] : 0
31920 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ));..  assert( s
31930 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
31940 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
31950 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75  pDbPage) );.  pu
31960 74 34 62 79 74 65 28 70 52 69 67 68 74 2c 20 61  t4byte(pRight, a
31970 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67  pNew[nNew-1]->pg
31980 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  no);..  /*.  ** 
31990 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74  Evenly distribut
319a0 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70  e the data in ap
319b0 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68  Cell[] across th
319c0 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  e new pages..  *
319d0 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72  * Insert divider
319e0 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72   cells into pPar
319f0 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79  ent as necessary
31a00 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a  ..  */.  j = 0;.
31a10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
31a20 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  w; i++){.    /* 
31a30 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77  Assemble the new
31a40 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
31a50 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
31a60 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a  New = apNew[i];.
31a70 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
31a80 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a  axCells );.    z
31a90 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61  eroPage(pNew, pa
31aa0 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73  geFlags);.    as
31ab0 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
31ac0 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
31ad0 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
31ae0 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
31af0 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
31b00 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
31b10 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
31b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
31b30 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
31b40 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e  );..    j = cntN
31b50 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
31b60 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
31b70 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
31b80 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
31b90 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
31ba0 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
31bb0 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
31bc0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
31bd0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
31be0 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d   assert( i<nNew-
31bf0 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  1 || j==nCell );
31c00 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c  .    if( j<nCell
31c10 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   ){.      u8 *pC
31c20 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  ell;.      u8 *p
31c30 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Temp;.      int 
31c40 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  sz;..      asser
31c50 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
31c60 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
31c70 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  apCell[j];.     
31c80 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20   sz = szCell[j] 
31c90 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
31ca0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
31cb0 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66  &aOvflSpace[iOvf
31cc0 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69  lSpace];.      i
31cd0 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29  f( !pNew->leaf )
31ce0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
31cf0 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d  (&pNew->aData[8]
31d00 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  , pCell, 4);.   
31d10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
31d20 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
31d30 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20   /* If the tree 
31d40 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  is a leaf-data t
31d50 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62  ree, and the sib
31d60 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73  lings are leaves
31d70 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
31d80 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  en there is no d
31d90 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61  ivider cell in a
31da0 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64  pCell[]. Instead
31db0 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20  , the divider . 
31dc0 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63         ** cell c
31dd0 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69  onsists of the i
31de0 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
31df0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  he right-most ce
31e00 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a  ll of .        *
31e10 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61  * the sibling-pa
31e20 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
31e30 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20  ve only..       
31e40 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   */.        Cell
31e50 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
31e60 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
31e70 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
31e80 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a  r(pNew, apCell[j
31e90 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ], &info);.     
31ea0 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
31eb0 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34  ;.        sz = 4
31ec0 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43   + putVarint(&pC
31ed0 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65  ell[4], info.nKe
31ee0 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  y);.        pTem
31ef0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
31f00 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
31f10 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
31f20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
31f30 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
31f40 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
31f50 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
31f60 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
31f70 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
31f80 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
31f90 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20  nd its reported 
31fa0 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
31fb0 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
31fc0 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
31fd0 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
31fe0 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
31ff0 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72  ** (see btreePar
32000 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62  seCellPtr(), 4 b
32010 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69  ytes is the mini
32020 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  mum size of.    
32030 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29      ** any cell)
32040 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f  . But it is impo
32050 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68  rtant to pass th
32060 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74  e correct size t
32070 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  o .        ** in
32080 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72  sertCell(), so r
32090 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20  eparse the cell 
320a0 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  now..        **.
320b0 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
320c0 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65  that this can ne
320d0 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e  ver happen in an
320e0 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c   SQLite data fil
320f0 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20  e, as all.      
32100 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61    ** cells are a
32110 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e  t least 4 bytes.
32120 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73   It only happens
32130 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64   in b-trees used
32140 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65  .        ** to e
32150 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c  valuate "IN (SEL
32160 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69  ECT ...)" and si
32170 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20  milar clauses.. 
32180 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32190 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d    if( szCell[j]=
321a0 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
321b0 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65  assert(leafCorre
321c0 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20  ction==4);.     
321d0 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
321e0 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70  zePtr(pParent, p
321f0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cell);.        }
32200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32210 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b  OvflSpace += sz;
32220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
32230 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  z<=pBt->pageSize
32240 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  /4 );.      asse
32250 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 3c 3d  rt( iOvflSpace<=
32260 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
32270 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c  .      insertCel
32280 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
32290 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
322a0 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  mp, pNew->pgno, 
322b0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
322c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
322d0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
322e0 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65  anup;.      asse
322f0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
32300 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
32310 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
32320 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  ..      j++;.   
32330 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
32340 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
32350 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  j==nCell );.  as
32360 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a  sert( nOld>0 );.
32370 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
32380 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46   );.  if( (pageF
32390 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29  lags & PTF_LEAF)
323a0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a  ==0 ){.    u8 *z
323b0 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b  Child = &apCopy[
323c0 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nOld-1]->aData[8
323d0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  ];.    memcpy(&a
323e0 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44  pNew[nNew-1]->aD
323f0 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20  ata[8], zChild, 
32400 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  4);.  }..  if( i
32410 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74  sRoot && pParent
32420 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50  ->nCell==0 && pP
32430 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
32440 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  <=apNew[0]->nFre
32450 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  e ){.    /* The 
32460 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
32470 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74   b-tree now cont
32480 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54  ains no cells. T
32490 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a  he only sibling.
324a0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74      ** page is t
324b0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
324c0 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f  f the parent. Co
324d0 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
324e0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68  of the.    ** ch
324f0 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68  ild page into th
32500 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61  e parent, decrea
32510 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c  sing the overall
32520 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20   height of the. 
32530 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72     ** b-tree str
32540 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54  ucture by one. T
32550 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65 64  his is described
32560 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65   as the "balance
32570 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20  -shallower".    
32580 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d  ** sub-algorithm
32590 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e   in some documen
325a0 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20  tation..    **. 
325b0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
325c0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
325d0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 61  database, the ca
325e0 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f  ll to copyNodeCo
325f0 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20  ntent() .    ** 
32600 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72  sets all pointer
32610 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72  -map entries cor
32620 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61  responding to da
32630 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61 67  tabase image pag
32640 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77  es .    ** for w
32650 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72  hich the pointer
32660 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68 69   is stored withi
32670 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  n the content be
32680 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20  ing copied..    
32690 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65  **.    ** The se
326a0 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f  cond assert belo
326b0 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  w verifies that 
326c0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 69  the child page i
326d0 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20  s defragmented. 
326e0 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62     ** (it must b
326f0 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75 73  e, as it was jus
32700 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20  t reconstructed 
32710 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61  using assemblePa
32720 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20  ge()). This.    
32730 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  ** is important 
32740 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  if the parent pa
32750 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
32760 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
32770 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69  atabase.    ** i
32780 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73  mage.  */.    as
32790 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b  sert( nNew==1 );
327a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 4e  .    assert( apN
327b0 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20  ew[0]->nFree == 
327c0 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62 79  .        (get2by
327d0 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44  te(&apNew[0]->aD
327e0 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d  ata[5])-apNew[0]
327f0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e  ->cellOffset-apN
32800 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20  ew[0]->nCell*2) 
32810 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79  .    );.    copy
32820 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65  NodeContent(apNe
32830 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26  w[0], pParent, &
32840 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67  rc);.    freePag
32850 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29  e(apNew[0], &rc)
32860 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53  ;.  }else if( IS
32870 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
32880 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69    /* Fix the poi
32890 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
328a0 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c   for all the cel
328b0 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69  ls that were shi
328c0 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20  fted around. .  
328d0 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73    ** There are s
328e0 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
328f0 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65   types of pointe
32900 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68  r-map entries th
32910 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a  at need to.    *
32920 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
32930 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
32940 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68   Some of these h
32950 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72  ave been set alr
32960 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a  eady, but.    **
32970 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20   many have not. 
32980 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
32990 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20   a summary:.    
329a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54  **.    **   1) T
329b0 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  he entries assoc
329c0 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73  iated with new s
329d0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61  ibling pages tha
329e0 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a  t were not.    *
329f0 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20  *      siblings 
32a00 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
32a10 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54  on was called. T
32a20 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64  hese have alread
32a30 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65  y.    **      be
32a40 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74  en set. We don't
32a50 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61   need to worry a
32a60 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67  bout old sibling
32a70 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20  s that were.    
32a80 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f  **      moved to
32a90 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d   the free-list -
32aa0 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20   the freePage() 
32ab0 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63  code has taken c
32ac0 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  are.    **      
32ad0 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a  of those..    **
32ae0 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65  .    **   2) The
32af0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
32b00 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
32b10 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f  with the first o
32b20 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20  verflow.    **  
32b30 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20      page in any 
32b40 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20  overflow chains 
32b50 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69  used by new divi
32b60 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65  der cells. These
32b70 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61   .    **      ha
32b80 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20  ve also already 
32b90 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20  been taken care 
32ba0 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74  of by the insert
32bb0 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20  Cell() code..   
32bc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20   **.    **   3) 
32bd0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
32be0 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ages are not lea
32bf0 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ves, then the ch
32c00 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20  ild pages of.   
32c10 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73   **      cells s
32c20 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62  tored on the sib
32c30 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e  ling pages may n
32c40 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  eed to be update
32c50 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
32c60 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62     4) If the sib
32c70 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
32c80 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b  ot internal intk
32c90 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61  ey nodes, then a
32ca0 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  ny.    **      o
32cb0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73  verflow pages us
32cc0 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c  ed by these cell
32cd0 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  s may need to be
32ce0 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20   updated.    ** 
32cf0 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69       (internal i
32d00 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65  ntkey nodes neve
32d10 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  r contain pointe
32d20 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  rs to overflow p
32d30 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ages)..    **.  
32d40 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65    **   5) If the
32d50 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
32d60 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
32d70 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hen the pointer-
32d80 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  map.    **      
32d90 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
32da0 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65  right-child page
32db0 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e  s of each siblin
32dc0 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  g may need.    *
32dd0 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64  *      to be upd
32de0 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ated..    **.   
32df0 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20   ** Cases 1 and 
32e00 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68  2 are dealt with
32e10 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20   above by other 
32e20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20  code. The next. 
32e30 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c     ** block deal
32e40 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61  s with cases 3 a
32e50 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65  nd 4 and the one
32e60 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73   after that, cas
32e70 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  e 5. Since.    *
32e80 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e  * setting a poin
32e90 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73  ter map entry is
32ea0 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78   a relatively ex
32eb0 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
32ec0 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63  n, this.    ** c
32ed0 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f  ode only sets po
32ee0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
32ef0 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f  s for child or o
32f00 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
32f10 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61  at have.    ** a
32f20 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65  ctually moved be
32f30 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f  tween pages.  */
32f40 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
32f50 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20  ew = apNew[0];. 
32f60 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
32f70 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20   = apCopy[0];.  
32f80 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20    int nOverflow 
32f90 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  = pOld->nOverflo
32fa0 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74  w;.    int iNext
32fb0 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  Old = pOld->nCel
32fc0 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  l + nOverflow;. 
32fd0 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77     int iOverflow
32fe0 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20   = (nOverflow ? 
32ff0 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
33000 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20  dx : -1);.    j 
33010 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33030 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64   /* Current 'old
33040 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a  ' sibling page *
33050 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20  /.    k = 0;    
33060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33070 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
33080 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e  ent 'new' siblin
33090 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f  g page */.    fo
330a0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
330b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
330c0 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20  isDivider = 0;. 
330d0 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69       while( i==i
330e0 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20  NextOld ){.     
330f0 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20     /* Cell i is 
33100 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61  the cell immedia
33110 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
33120 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20  he last cell on 
33130 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  old.        ** s
33140 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49  ibling page j. I
33150 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
33160 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65  re not leaf page
33170 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20  s of an.        
33180 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65  ** intkey b-tree
33190 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61  , then cell i wa
331a0 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  s a divider cell
331b0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c  . */.        pOl
331c0 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b  d = apCopy[++j];
331d0 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c  .        iNextOl
331e0 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74  d = i + !leafDat
331f0 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20  a + pOld->nCell 
33200 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  + pOld->nOverflo
33210 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  w;.        if( p
33220 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  Old->nOverflow )
33230 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65  {.          nOve
33240 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f  rflow = pOld->nO
33250 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20  verflow;.       
33260 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69     iOverflow = i
33270 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70   + !leafData + p
33280 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
33290 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  x;.        }.   
332a0 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d       isDivider =
332b0 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20   !leafData;  .  
332c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
332d0 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ert(nOverflow>0 
332e0 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29  || iOverflow<i )
332f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ;.      assert(n
33300 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f  Overflow<2 || pO
33310 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
33320 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d  ==pOld->aOvfl[1]
33330 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61  .idx-1);.      a
33340 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c  ssert(nOverflow<
33350 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  3 || pOld->aOvfl
33360 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61  [1].idx==pOld->a
33370 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a  Ovfl[2].idx-1);.
33380 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76        if( i==iOv
33390 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
333a0 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b    isDivider = 1;
333b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d  .        if( (--
333c0 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a  nOverflow)>0 ){.
333d0 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66            iOverf
333e0 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  low++;.        }
333f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
33400 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d  if( i==cntNew[k]
33410 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
33420 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c  ell i is the cel
33430 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  l immediately fo
33440 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
33450 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20   cell on new.   
33460 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20       ** sibling 
33470 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73  page k. If the s
33480 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
33490 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e  leaf pages of an
334a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b  .        ** intk
334b0 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20  ey b-tree, then 
334c0 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69  cell i is a divi
334d0 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20  der cell.  */.  
334e0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
334f0 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20  ew[++k];.       
33500 20 69 66 28 20 21 6c 65 61 66 44 61 74 61 20 29   if( !leafData )
33510 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
33520 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
33530 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20   j<nOld );.     
33540 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20   assert( k<nNew 
33550 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
33560 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69  the cell was ori
33570 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20  ginally divider 
33580 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74  cell (and is not
33590 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a   now) or.      *
335a0 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  * an overflow ce
335b0 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65  ll, or if the ce
335c0 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f  ll was located o
335d0 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 69  n a different si
335e0 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  bling.      ** p
335f0 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20 62  age before the b
33600 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74  alancing, then t
33610 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
33620 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
33630 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20  d.      ** with 
33640 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  any child or ove
33650 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64  rflow pages need
33660 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20   to be updated. 
33670 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
33680 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d  Divider || pOld-
33690 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
336a0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  o ){.        if(
336b0 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e   !leafCorrection
336c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74   ){.          pt
336d0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74  rmapPut(pBt, get
336e0 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29  4byte(apCell[i])
336f0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
33700 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  pNew->pgno, &rc)
33710 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33720 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69      if( szCell[i
33730 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  ]>pNew->minLocal
33740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74   ){.          pt
33750 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
33760 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  New, apCell[i], 
33770 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  &rc);.        }.
33780 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
33790 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72     if( !leafCorr
337a0 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ection ){.      
337b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
337c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
337d0 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62 79 74  32 key = get4byt
337e0 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61  e(&apNew[i]->aDa
337f0 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
33800 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6b  ptrmapPut(pBt, k
33810 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ey, PTRMAP_BTREE
33820 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  , apNew[i]->pgno
33830 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  , &rc);.      }.
33840 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20      }..#if 0.   
33850 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68   /* The ptrmapCh
33860 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61  eckPages() conta
33870 69 6e 73 20 61 73 73 65 72 74 28 29 20 73 74 61  ins assert() sta
33880 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72  tements that ver
33890 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ify that.    ** 
338a0 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  all pointer map 
338b0 70 61 67 65 73 20 61 72 65 20 73 65 74 20 63 6f  pages are set co
338c0 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73  rrectly. This is
338d0 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a   helpful while .
338e0 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67      ** debugging
338f0 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
33900 79 20 64 69 73 61 62 6c 65 64 20 62 65 63 61 75  y disabled becau
33910 73 65 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  se a corrupt dat
33920 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a  abase may.    **
33930 20 63 61 75 73 65 20 61 6e 20 61 73 73 65 72 74   cause an assert
33940 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  () statement to 
33950 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74  fail.  */.    pt
33960 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 61  rmapCheckPages(a
33970 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  pNew, nNew);.   
33980 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
33990 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  s(&pParent, 1);.
339a0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73  #endif.  }..  as
339b0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
339c0 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45  sInit );.  TRACE
339d0 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
339e0 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77  shed: old=%d new
339f0 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c  =%d cells=%d\n",
33a00 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c  .          nOld,
33a10 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a   nNew, nCell));.
33a20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
33a30 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
33a40 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
33a50 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
33a60 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
33a70 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69  apCell);.  for(i
33a80 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
33a90 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
33aa0 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d  e(apOld[i]);.  }
33ab0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
33ac0 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ew; i++){.    re
33ad0 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b  leasePage(apNew[
33ae0 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  i]);.  }..  retu
33af0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
33b00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
33b10 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
33b20 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  e root page of a
33b30 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
33b40 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c  e is.** overfull
33b50 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   (has one or mor
33b60 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
33b70 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63  )..**.** A new c
33b80 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c  hild page is all
33b90 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 63  ocated and the c
33ba0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
33bb0 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70  urrent root.** p
33bc0 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  age, including o
33bd0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61  verflow cells, a
33be0 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  re copied into t
33bf0 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f  he child. The ro
33c00 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68  ot.** page is th
33c10 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74  en overwritten t
33c20 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70  o make it an emp
33c30 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68 65  ty page with the
33c40 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a   right-child .**
33c50 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e   pointer pointin
33c60 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  g to the new pag
33c70 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
33c80 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70  returning, all p
33c90 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
33ca0 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  es corresponding
33cb0 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68   to pages .** th
33cc0 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  at the new child
33cd0 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69  -page now contai
33ce0 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ns pointers to a
33cf0 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a  re updated. The.
33d00 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70  ** entry corresp
33d10 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  onding to the ne
33d20 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f  w right-child po
33d30 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  inter of the roo
33d40 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73  t.** page is als
33d50 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  o updated..**.**
33d60 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
33d70 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20  *ppChild is set 
33d80 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66  to contain a ref
33d90 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68  erence to the ch
33da0 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64  ild .** page and
33db0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
33dc0 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
33dd0 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  case the caller 
33de0 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74  is required.** t
33df0 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
33e00 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64  ge() on *ppChild
33e10 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49   exactly once. I
33e20 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
33e30 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  s,.** an error c
33e40 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
33e50 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20  and *ppChild is 
33e60 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61  set to 0..*/.sta
33e70 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
33e80 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a  deeper(MemPage *
33e90 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a  pRoot, MemPage *
33ea0 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74  *ppChild){.  int
33eb0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
33ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
33ed0 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
33ee0 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
33ef0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  /.  MemPage *pCh
33f00 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ild = 0;        
33f10 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
33f20 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
33f30 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
33f40 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Child = 0;      
33f50 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
33f60 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
33f70 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
33f80 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
33f90 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f  pRoot->pBt;    /
33fa0 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a  * The BTree */..
33fb0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
33fc0 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a  >nOverflow>0 );.
33fd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
33fe0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
33ff0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
34000 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68  * Make pRoot, th
34010 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
34020 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61  he b-tree, writa
34030 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20  ble. Allocate a 
34040 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74  new .  ** page t
34050 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
34060 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68  the new right-ch
34070 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f  ild of pPage. Co
34080 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  py the contents.
34090 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65    ** of the node
340a0 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74   stored on pRoot
340b0 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68   into the new ch
340c0 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ild page..  */. 
340d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
340e0 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
340f0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
34100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34110 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
34120 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 26  eBtreePage(pBt,&
34130 70 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c  pChild,&pgnoChil
34140 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29  d,pRoot->pgno,0)
34150 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f  ;.    copyNodeCo
34160 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68  ntent(pRoot, pCh
34170 69 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  ild, &rc);.    i
34180 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
34190 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
341a0 75 74 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c  ut(pBt, pgnoChil
341b0 64 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  d, PTRMAP_BTREE,
341c0 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72   pRoot->pgno, &r
341d0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
341e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
341f0 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20  pChild = 0;.    
34200 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
34210 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ld);.    return 
34220 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
34230 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
34240 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64  writeable(pChild
34250 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
34260 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
34270 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34280 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
34290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68  );.  assert( pCh
342a0 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f  ild->nCell==pRoo
342b0 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54  t->nCell );..  T
342c0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
342d0 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
342e0 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e  o %d\n", pRoot->
342f0 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
34300 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79  no));..  /* Copy
34310 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
34320 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74  lls from pRoot t
34330 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65  o pChild */.  me
34340 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76  mcpy(pChild->aOv
34350 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c  fl, pRoot->aOvfl
34360 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  , pRoot->nOverfl
34370 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d  ow*sizeof(pRoot-
34380 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70  >aOvfl[0]));.  p
34390 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
343a0 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66   = pRoot->nOverf
343b0 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  low;..  /* Zero 
343c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
343d0 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74  pRoot. Then inst
343e0 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68  all pChild as th
343f0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a  e right-child. *
34400 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f  /.  zeroPage(pRo
34410 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ot, pChild->aDat
34420 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46  a[0] & ~PTF_LEAF
34430 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
34440 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
34450 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
34460 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20   pgnoChild);..  
34470 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c  *ppChild = pChil
34480 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
34490 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
344a0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70 43  The page that pC
344b0 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ur currently poi
344c0 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20  nts to has just 
344d0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e  been modified in
344e0 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68  .** some way. Th
344f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75  is function figu
34500 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73 20  res out if this 
34510 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61  modification mea
34520 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e  ns the.** tree n
34530 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e  eeds to be balan
34540 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63  ced, and if so c
34550 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72  alls the appropr
34560 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a  iate balancing .
34570 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61  ** routine. Bala
34580 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  ncing routines a
34590 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61  re:.**.**   bala
345a0 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20  nce_quick().**  
345b0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
345c0 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e  ).**   balance_n
345d0 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74  onroot().*/.stat
345e0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42  ic int balance(B
345f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
34600 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
34610 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  E_OK;.  const in
34620 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70  t nMin = pCur->p
34630 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a  Bt->usableSize *
34640 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61   2 / 3;.  u8 aBa
34650 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
34660 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65  13];.  u8 *pFree
34670 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c   = 0;..  TESTONL
34680 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  Y( int balance_q
34690 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20  uick_called = 0 
346a0 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69  );.  TESTONLY( i
346b0 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nt balance_deepe
346c0 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a  r_called = 0 );.
346d0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20  .  do {.    int 
346e0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
346f0 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  age;.    MemPage
34700 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
34710 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a  apPage[iPage];..
34720 20 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30      if( iPage==0
34730 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
34740 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
34750 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
34760 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
34770 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72  e b-tree is over
34780 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61  full. In this ca
34790 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20  se call the.    
347a0 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64      ** balance_d
347b0 65 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  eeper() function
347c0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
347d0 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72   child for the r
347e0 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
347f0 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65   ** and copy the
34800 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
34810 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  s of the root-pa
34820 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20  ge to it. The.  
34830 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74        ** next it
34840 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
34850 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61  o-loop will bala
34860 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20 70 61  nce the child pa
34870 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a  ge..        */ .
34880 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34890 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f  (balance_deeper_
348a0 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a  called++)==0 );.
348b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
348c0 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67  ance_deeper(pPag
348d0 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  e, &pCur->apPage
348e0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [1]);.        if
348f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ){.          pCu
34910 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20  r->iPage = 1;.  
34920 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
34930 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[0] = 0;.    
34940 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
34950 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  x[1] = 0;.      
34960 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
34970 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76  ->apPage[1]->nOv
34980 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20  erflow );.      
34990 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
349a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
349b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
349c0 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76  e if( pPage->nOv
349d0 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61  erflow==0 && pPa
349e0 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20  ge->nFree<=nMin 
349f0 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
34a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34a10 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74   MemPage * const
34a20 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d   pParent = pCur-
34a30 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d  >apPage[iPage-1]
34a40 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73  ;.      int cons
34a50 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61  t iIdx = pCur->a
34a60 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a  iIdx[iPage-1];..
34a70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34a80 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
34a90 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
34aa0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
34ab0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64  LITE_OK ){.#ifnd
34ac0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
34ad0 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20  UICKBALANCE.    
34ae0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
34af0 61 73 44 61 74 61 0a 20 20 20 20 20 20 20 20 20  asData.         
34b00 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  && pPage->nOverf
34b10 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  low==1.         
34b20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  && pPage->aOvfl[
34b30 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  0].idx==pPage->n
34b40 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26  Cell.         &&
34b50 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d   pParent->pgno!=
34b60 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  1.         && pP
34b70 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49  arent->nCell==iI
34b80 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  dx.        ){.  
34b90 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20          /* Call 
34ba0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
34bb0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
34bc0 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65  sibling of pPage
34bd0 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   on which.      
34be0 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20      ** to store 
34bf0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
34c00 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  l. balance_quick
34c10 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77  () inserts a new
34c20 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   cell.          
34c30 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c  ** into pParent,
34c40 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65   which may cause
34c50 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f   pParent overflo
34c60 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20 20  w. If this.     
34c70 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c       ** happens,
34c80 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61   the next intera
34c90 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
34ca0 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65  oop will balance
34cb0 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20   pParent .      
34cc0 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65      ** use eithe
34cd0 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  r balance_nonroo
34ce0 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64  t() or balance_d
34cf0 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74  eeper(). Until t
34d00 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
34d10 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76   happens, the ov
34d20 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73  erflow cell is s
34d30 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42 61  tored in the aBa
34d40 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
34d50 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  ].          ** b
34d60 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20  uffer. .        
34d70 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
34d80 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66  * The purpose of
34d90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
34da0 73 73 65 72 74 28 29 20 69 73 20 74 6f 20 63 68  ssert() is to ch
34db0 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a  eck that only a.
34dc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
34dd0 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  gle call to bala
34de0 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d  nce_quick() is m
34df0 61 64 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c  ade for each cal
34e00 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20  l to this.      
34e10 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
34e20 20 49 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f   If this were no
34e30 74 20 76 65 72 69 66 69 65 64 2c 20 61 20 73 75  t verified, a su
34e40 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69  btle bug involvi
34e50 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20 20 20  ng reuse.       
34e60 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61     ** of the aBa
34e70 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
34e80 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e  ] might sneak in
34e90 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
34ea0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
34eb0 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f   (balance_quick_
34ec0 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a  called++)==0 );.
34ed0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
34ee0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61  alance_quick(pPa
34ef0 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61  rent, pPage, aBa
34f00 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29  lanceQuickSpace)
34f10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
34f20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
34f30 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
34f40 20 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c   this case, call
34f50 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
34f60 28 29 20 74 6f 20 72 65 64 69 73 74 72 69 62 75  () to redistribu
34f70 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20  te cells.       
34f80 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50     ** between pP
34f90 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20  age and up to 2 
34fa0 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70  of its sibling p
34fb0 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c  ages. This invol
34fc0 76 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ves.          **
34fd0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
34fe0 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65  ontents of pPare
34ff0 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61  nt, which may ca
35000 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20  use pParent to. 
35010 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f           ** beco
35020 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
35030 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65  nderfull. The ne
35040 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
35050 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20  the do-loop.    
35060 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61        ** will ba
35070 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
35080 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74   page to correct
35090 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20   this..         
350a0 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a   ** .          *
350b0 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e 74 20  * If the parent 
350c0 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
350d0 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66  rfull, the overf
350e0 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c  low cell or cell
350f0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
35100 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
35110 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 61   pSpace buffer a
35120 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61  llocated immedia
35130 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20  tely below. .   
35140 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73         ** A subs
35150 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e  equent iteration
35160 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
35170 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74  will deal with t
35180 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 20  his by.         
35190 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61   ** calling bala
351a0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62  nce_nonroot() (b
351b0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
351c0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69  may be called fi
351d0 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a  rst,.          *
351e0 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74  * but it doesn't
351f0 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66   deal with overf
35200 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74  low cells - just
35210 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61   moves them to a
35220 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
35230 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f  fferent page). O
35240 6e 63 65 20 74 68 69 73 20 73 75 62 73 65 71 75  nce this subsequ
35250 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ent call to bala
35260 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20  nce_nonroot() . 
35270 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
35280 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73  completed, it is
35290 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65   safe to release
352a0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
352b0 65 72 20 75 73 65 64 20 62 79 0a 20 20 20 20 20  er used by.     
352c0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76       ** the prev
352d0 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68  ious call, as th
352e0 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
352f0 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62  data will have b
35300 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  een .          *
35310 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65 72 20  * copied either 
35320 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
35330 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
35340 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77   or into the new
35350 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53  .          ** pS
35360 70 61 63 65 20 62 75 66 66 65 72 20 70 61 73 73  pace buffer pass
35370 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72  ed to the latter
35380 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
35390 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20  _nonroot()..    
353a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
353b0 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
353c0 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
353d0 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67  c(pCur->pBt->pag
353e0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
353f0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
35400 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20  onroot(pParent, 
35410 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50  iIdx, pSpace, iP
35420 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20  age==1);.       
35430 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a     if( pFree ){.
35440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
35450 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e  f pFree is not N
35460 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74  ULL, it points t
35470 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
35480 66 65 72 20 75 73 65 64 20 0a 20 20 20 20 20 20  fer used .      
35490 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72        ** by a pr
354a0 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62  evious call to b
354b0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
354c0 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61  . Its contents a
354d0 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
354e0 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74  * now stored eit
354f0 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61  her on real data
35500 62 61 73 65 20 70 61 67 65 73 20 6f 72 20 77 69  base pages or wi
35510 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  thin the .      
35520 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70        ** new pSp
35530 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69  ace buffer, so i
35540 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20  t may be safely 
35550 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20  freed here. */. 
35560 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
35570 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65  e3PageFree(pFree
35580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  );.          }..
35590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
355a0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 77   pSpace buffer w
355b0 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66 74  ill be freed aft
355c0 65 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  er the next call
355d0 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
355e0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
355f0 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f  (), or just befo
35600 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
35610 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65   returns, whiche
35620 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ver.          **
35630 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f   comes first. */
35640 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 65 65  .          pFree
35650 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20   = pSpace;.     
35660 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
35670 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
35680 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20  flow = 0;..     
35690 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65   /* The next ite
356a0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
356b0 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74  -loop balances t
356c0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
356d0 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
356e0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
356f0 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d     pCur->iPage--
35700 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
35710 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35720 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20  );..  if( pFree 
35730 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
35740 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  geFree(pFree);. 
35750 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
35760 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  }.../*.** Insert
35770 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
35780 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54  to the BTree.  T
35790 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20  he key is given 
357a0 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a  by (pKey,nKey).*
357b0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69  * and the data i
357c0 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74  s given by (pDat
357d0 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63  a,nData).  The c
357e0 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e  ursor is used on
357f0 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20  ly to.** define 
35800 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72  what table the r
35810 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20  ecord should be 
35820 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20  inserted into.  
35830 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  The cursor.** is
35840 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
35850 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74  t a random locat
35860 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ion..**.** For a
35870 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20  n INTKEY table, 
35880 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61  only the nKey va
35890 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69  lue of the key i
358a0 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73  s used.  pKey is
358b0 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f  .** ignored.  Fo
358c0 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62  r a ZERODATA tab
358d0 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e  le, the pData an
358e0 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68  d nData are both
358f0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
35900 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c  If the seekResul
35910 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
35920 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
35930 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20  successful call 
35940 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61  to.** MovetoUnpa
35950 63 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20 63  cked() to seek c
35960 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70  ursor pCur to (p
35970 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61  Key, nKey) has a
35980 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
35990 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65  erformed. seekRe
359a0 73 75 6c 74 20 69 73 20 74 68 65 20 73 65 61 72  sult is the sear
359b0 63 68 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e  ch result return
359c0 65 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a  ed (a negative.*
359d0 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72  * number if pCur
359e0 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e   points at an en
359f0 74 72 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c  try that is smal
35a00 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20  ler than (pKey, 
35a10 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70  nKey), or.** a p
35a20 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
35a30 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
35a40 61 6e 20 65 74 72 79 20 74 68 61 74 20 69 73 20  an etry that is 
35a50 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20  larger than .** 
35a60 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a  (pKey, nKey)). .
35a70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65  **.** If the see
35a80 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65  kResult paramete
35a90 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
35aa0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 67  hen the caller g
35ab0 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 2a  uarantees that.*
35ac0 2a 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  * cursor pCur is
35ad0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
35ae0 20 65 78 69 73 74 69 6e 67 20 63 6f 70 79 20 6f   existing copy o
35af0 66 20 61 20 72 6f 77 20 74 68 61 74 20 69 73 20  f a row that is 
35b00 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72 69  to be.** overwri
35b10 74 74 65 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tten.  If the se
35b20 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74  ekResult paramet
35b30 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75  er is 0, then cu
35b40 72 73 6f 72 20 70 43 75 72 20 6d 61 79 0a 2a 2a  rsor pCur may.**
35b50 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 65 6e   point to any en
35b60 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74  try or to no ent
35b70 72 79 20 61 74 20 61 6c 6c 20 61 6e 64 20 73 6f  ry at all and so
35b80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
35b90 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74 68  as to seek.** th
35ba0 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65 20  e cursor before 
35bb0 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e 20  the new key can 
35bc0 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
35bd0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
35be0 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73  Insert(.  BtCurs
35bf0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
35c00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
35c10 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
35c20 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63   table of this c
35c30 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  ursor */.  const
35c40 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
35c50 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
35c60 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20   key of the new 
35c70 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
35c80 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
35c90 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68  nt nData,  /* Th
35ca0 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65  e data of the ne
35cb0 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  w record */.  in
35cc0 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
35cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35ce0 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
35cf0 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  0 bytes to appen
35d00 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69  d to data */.  i
35d10 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20 20  nt appendBias,  
35d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35d30 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
35d40 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e   likely an appen
35d50 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52  d */.  int seekR
35d60 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
35d70 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
35d80 6f 66 20 70 72 69 6f 72 20 4d 6f 76 65 74 6f 55  of prior MovetoU
35d90 6e 70 61 63 6b 65 64 28 29 20 63 61 6c 6c 20 2a  npacked() call *
35da0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
35db0 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b 52   int loc = seekR
35dc0 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
35dd0 2f 2a 20 2d 31 3a 20 62 65 66 6f 72 65 20 64 65  /* -1: before de
35de0 73 69 72 65 64 20 6c 6f 63 61 74 69 6f 6e 20 20  sired location  
35df0 2b 31 3a 20 61 66 74 65 72 20 2a 2f 0a 20 20 69  +1: after */.  i
35e00 6e 74 20 73 7a 4e 65 77 20 3d 20 30 3b 0a 20 20  nt szNew = 0;.  
35e10 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
35e20 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72  ge *pPage;.  Btr
35e30 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
35e40 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
35e50 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
35e60 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
35e70 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69  *oldCell;.  unsi
35e80 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65  gned char *newCe
35e90 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ll = 0;..  if( p
35ea0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
35eb0 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
35ec0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
35ed0 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
35ee0 4f 4b 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OK );.    return
35ef0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
35f00 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
35f10 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
35f20 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
35f30 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  rt( pCur->wrFlag
35f40 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
35f50 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
35f60 49 54 45 20 26 26 20 21 70 42 74 2d 3e 72 65 61  ITE && !pBt->rea
35f70 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72  dOnly );.  asser
35f80 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
35f90 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43  eTableLock(p, pC
35fa0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
35fb0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  ur->pKeyInfo!=0,
35fc0 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73   2) );..  /* Ass
35fd0 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c  ert that the cal
35fe0 6c 65 72 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  ler has been con
35ff0 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68 69 73  sistent. If this
36000 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
36010 65 64 0a 20 20 2a 2a 20 65 78 70 65 63 74 69 6e  ed.  ** expectin
36020 67 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  g an index b-tre
36030 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  e, then the call
36040 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  er should be ins
36050 65 72 74 69 6e 67 20 62 6c 6f 62 0a 20 20 2a 2a  erting blob.  **
36060 20 6b 65 79 73 20 77 69 74 68 20 6e 6f 20 61 73   keys with no as
36070 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20 49  sociated data. I
36080 66 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  f the cursor was
36090 20 6f 70 65 6e 65 64 20 65 78 70 65 63 74 69 6e   opened expectin
360a0 67 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 6b 65 79  g an.  ** intkey
360b0 20 74 61 62 6c 65 2c 20 74 68 65 20 63 61 6c 6c   table, the call
360c0 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  er should be ins
360d0 65 72 74 69 6e 67 20 69 6e 74 65 67 65 72 20 6b  erting integer k
360e0 65 79 73 20 77 69 74 68 20 61 0a 20 20 2a 2a 20  eys with a.  ** 
360f0 62 6c 6f 62 20 6f 66 20 61 73 73 6f 63 69 61 74  blob of associat
36100 65 64 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 61  ed data.  */.  a
36110 73 73 65 72 74 28 20 28 70 4b 65 79 3d 3d 30 29  ssert( (pKey==0)
36120 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
36130 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  o==0) );..  /* I
36140 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 73  f this is an ins
36150 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ert into a table
36160 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69 64   b-tree, invalid
36170 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
36180 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 6f   .  ** cursors o
36190 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20 62  pen on the row b
361a0 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 28 61  eing replaced (a
361b0 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73 20  ssuming this is 
361c0 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 6f  a replace.  ** o
361d0 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20 69 74  peration - if it
361e0 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66 6f 6c   is not, the fol
361f0 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 2d 6f  lowing is a no-o
36200 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  p).  */.  if( pC
36210 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  ur->pKeyInfo==0 
36220 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
36230 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
36240 28 70 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a 20 20  (p, nKey, 0);.  
36250 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65  }..  /* Save the
36260 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
36270 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
36280 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62  open on this tab
36290 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  le..  **.  ** In
362a0 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
362b0 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 4d 6f   call to btreeMo
362c0 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73 20  veto() below is 
362d0 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a  a no-op. For.  *
362e0 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  * example, when 
362f0 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20 69  inserting data i
36300 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68  nto a table with
36310 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20   auto-generated 
36320 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65 79  integer.  ** key
36330 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79 65  s, the VDBE laye
36340 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  r invokes sqlite
36350 33 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f 20  3BtreeLast() to 
36360 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 0a  figure out the .
36370 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65 79    ** integer key
36380 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65 6e   to use. It then
36390 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
363a0 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c 79  tion to actually
363b0 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20 2a   insert the .  *
363c0 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  * data into the 
363d0 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20 49  intkey B-Tree. I
363e0 6e 20 74 68 69 73 20 63 61 73 65 20 62 74 72 65  n this case btre
363f0 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f 67 6e  eMoveto() recogn
36400 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 74  izes.  ** that t
36410 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
36420 65 61 64 79 20 77 68 65 72 65 20 69 74 20 6e 65  eady where it ne
36430 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20 72 65  eds to be and re
36440 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a 20 20  turns without.  
36450 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ** doing any wor
36460 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 77 61  k. To avoid thwa
36470 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70 74 69  rting these opti
36480 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69 73  mizations, it is
36490 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a 20   important.  ** 
364a0 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74 68 65  not to clear the
364b0 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a 20 20   cursor here..  
364c0 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  */.  rc = saveAl
364d0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
364e0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
364f0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
36500 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
36510 20 21 6c 6f 63 20 29 7b 0a 20 20 20 20 72 63 20   !loc ){.    rc 
36520 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
36530 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ur, pKey, nKey, 
36540 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63  appendBias, &loc
36550 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
36560 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
36570 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
36580 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
36590 4c 49 44 20 7c 7c 20 28 70 43 75 72 2d 3e 65 53  LID || (pCur->eS
365a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
365b0 41 4c 49 44 20 26 26 20 6c 6f 63 29 20 29 3b 0a  ALID && loc) );.
365c0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
365d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
365e0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
365f0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c  pPage->intKey ||
36600 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
36610 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
36620 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74  f || !pPage->int
36630 4b 65 79 20 29 3b 0a 0a 20 20 54 52 41 43 45 28  Key );..  TRACE(
36640 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d  ("INSERT: table=
36650 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61  %d nkey=%lld nda
36660 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73  ta=%d page=%d %s
36670 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
36680 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e  Cur->pgnoRoot, n
36690 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67  Key, nData, pPag
366a0 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  e->pgno,.       
366b0 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65     loc==0 ? "ove
366c0 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65  rwrite" : "new e
366d0 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72  ntry"));.  asser
366e0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
366f0 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65   );.  allocateTe
36700 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
36710 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70  newCell = pBt->p
36720 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20  TmpSpace;.  if( 
36730 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  newCell==0 ) ret
36740 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
36750 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43  ;.  rc = fillInC
36760 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65  ell(pPage, newCe
36770 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ll, pKey, nKey, 
36780 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a  pData, nData, nZ
36790 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20  ero, &szNew);.  
367a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
367b0 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65  d_insert;.  asse
367c0 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53  rt( szNew==cellS
367d0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65  izePtr(pPage, ne
367e0 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  wCell) );.  asse
367f0 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45  rt( szNew<=MX_CE
36800 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
36810 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69    idx = pCur->ai
36820 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
36830 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 29  ;.  if( loc==0 )
36840 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b  {.    u16 szOld;
36850 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
36860 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
36870 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
36880 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
36890 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
368a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
368b0 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
368c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43  ;.    }.    oldC
368d0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
368e0 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
368f0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
36900 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
36910 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c  (newCell, oldCel
36920 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 4);.    }.   
36930 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a   szOld = cellSiz
36940 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43  ePtr(pPage, oldC
36950 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ell);.    rc = c
36960 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
36970 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 64 72  oldCell);.    dr
36980 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  opCell(pPage, id
36990 78 2c 20 73 7a 4f 6c 64 2c 20 26 72 63 29 3b 0a  x, szOld, &rc);.
369a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
369b0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
369c0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20  }else if( loc<0 
369d0 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  && pPage->nCell>
369e0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
369f0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
36a00 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72      idx = ++pCur
36a10 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
36a20 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age];.  }else{. 
36a30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36a40 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20  ->leaf );.  }.  
36a50 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
36a60 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20  , idx, newCell, 
36a70 73 7a 4e 65 77 2c 20 30 2c 20 30 2c 20 26 72 63  szNew, 0, 0, &rc
36a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
36a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
36aa0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
36ab0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
36ac0 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  >0 );..  /* If n
36ad0 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  o error has occu
36ae0 72 65 64 20 61 6e 64 20 70 50 61 67 65 20 68 61  red and pPage ha
36af0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  s an overflow ce
36b00 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ll, call balance
36b10 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69  () .  ** to redi
36b20 73 74 72 69 62 75 74 65 20 74 68 65 20 63 65 6c  stribute the cel
36b30 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  ls within the tr
36b40 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e 63  ee. Since balanc
36b50 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a  e() may move.  *
36b60 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a 65  * the cursor, ze
36b70 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  ro the BtCursor.
36b80 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42  info.nSize and B
36b90 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65  tCursor.validNKe
36ba0 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  y.  ** variables
36bb0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76  ..  **.  ** Prev
36bc0 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
36bd0 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d   SQLite called m
36be0 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d  oveToRoot() to m
36bf0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a 20  ove the cursor. 
36c00 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65 20   ** back to the 
36c10 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61 6c  root page as bal
36c20 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20 69  ance() used to i
36c30 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f  nvalidate the co
36c40 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42  ntents.  ** of B
36c50 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d  tCursor.apPage[]
36c60 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61 69   and BtCursor.ai
36c70 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f  Idx[]. Instead o
36c80 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20  f doing that,.  
36c90 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  ** set the curso
36ca0 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76 61  r state to "inva
36cb0 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65 73  lid". This makes
36cc0 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f   common insert o
36cd0 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73  perations.  ** s
36ce0 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e 0a  lightly faster..
36cf0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20    **.  ** There 
36d00 69 73 20 61 20 73 75 62 74 6c 65 20 62 75 74 20  is a subtle but 
36d10 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69  important optimi
36d20 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e  zation here too.
36d30 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a   When inserting.
36d40 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65    ** multiple re
36d50 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e  cords into an in
36d60 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69 6e  tkey b-tree usin
36d70 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73 6f  g a single curso
36d80 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68  r (as can.  ** h
36d90 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f 63  appen while proc
36da0 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45 52  essing an "INSER
36db0 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43  T INTO ... SELEC
36dc0 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20 69  T" statement), i
36dd0 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e 74  t.  ** is advant
36de0 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65 20  ageous to leave 
36df0 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
36e00 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
36e10 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68  entry in.  ** th
36e20 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73 73  e b-tree if poss
36e30 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75 72  ible. If the cur
36e40 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
36e50 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
36e60 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  .  ** entry in t
36e70 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  he table, and th
36e80 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65 72  e next row inser
36e90 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65 67  ted has an integ
36ea0 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67  er key.  ** larg
36eb0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
36ec0 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65 79  est existing key
36ed0 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
36ee0 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a 20   to insert the. 
36ef0 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74 20   ** row without 
36f00 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72 73  seeking the curs
36f10 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20  or. This can be 
36f20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e 63  a big performanc
36f30 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20  e boost..  */.  
36f40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
36f50 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
36f60 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
36f70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36f80 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
36f90 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20 3d  flow ){.    rc =
36fa0 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a   balance(pCur);.
36fb0 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b  .    /* Must mak
36fc0 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77  e sure nOverflow
36fd0 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72   is reset to zer
36fe0 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62 61  o even if the ba
36ff0 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20 66  lance().    ** f
37000 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64  ails. Internal d
37010 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
37020 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65  rruption will re
37030 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20  sult otherwise. 
37040 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65  .    ** Also, se
37050 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  t the cursor sta
37060 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54  te to invalid. T
37070 68 69 73 20 73 74 6f 70 73 20 73 61 76 65 43 75  his stops saveCu
37080 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20  rsorPosition(). 
37090 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e     ** from tryin
370a0 67 20 74 6f 20 73 61 76 65 20 74 68 65 20 63 75  g to save the cu
370b0 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
370c0 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 2a  f the cursor.  *
370d0 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  /.    pCur->apPa
370e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
370f0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
37100 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
37110 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
37120 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  D;.  }.  assert(
37130 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
37140 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65  ur->iPage]->nOve
37150 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64  rflow==0 );..end
37160 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72  _insert:.  retur
37170 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
37180 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20  elete the entry 
37190 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
371a0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
371b0 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
371c0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
371d0 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20 6c  at a arbitrary l
371e0 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ocation..*/.int 
371f0 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
37200 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  te(BtCursor *pCu
37210 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  r){.  Btree *p =
37220 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
37230 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
37240 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
37250 20 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63 3b        .  int rc;
37260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37280 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
37290 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
372a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
372b0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
372c0 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66 72  o delete cell fr
372d0 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  om */.  unsigned
372e0 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20   char *pCell;   
372f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37300 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20  Pointer to cell 
37310 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
37320 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20 20  nt iCellIdx;    
37330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37340 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
37350 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a  cell to delete *
37360 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65 70  /.  int iCellDep
37370 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
37380 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74           /* Dept
37390 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69  h of node contai
373a0 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a  ning pCell */ ..
373b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
373c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
373d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
373e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
373f0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
37400 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
37410 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61  >readOnly );.  a
37420 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
37430 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74 28  lag );.  assert(
37440 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
37450 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72  ableLock(p, pCur
37460 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
37470 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32  ->pKeyInfo!=0, 2
37480 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
37490 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
374a0 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
374b0 6f 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  ot) );..  if( NE
374c0 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b  VER(pCur->aiIdx[
374d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43  pCur->iPage]>=pC
374e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
374f0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20  >iPage]->nCell) 
37500 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43 75  .   || NEVER(pCu
37510 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
37520 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20  R_VALID).  ){.  
37530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37540 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74  ERROR;  /* Somet
37550 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61 77  hing has gone aw
37560 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ry. */.  }..  /*
37570 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 65   If this is a de
37580 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 74  lete operation t
37590 6f 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20 66  o remove a row f
375a0 72 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74 72  rom a table b-tr
375b0 65 65 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64  ee,.  ** invalid
375c0 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
375d0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
375e0 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64   the row being d
375f0 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66  eleted.  */.  if
37600 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  ( pCur->pKeyInfo
37610 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c  ==0 ){.    inval
37620 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateIncrblobCur
37630 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 69 6e  sors(p, pCur->in
37640 66 6f 2e 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d  fo.nKey, 0);.  }
37650 0a 0a 20 20 69 43 65 6c 6c 44 65 70 74 68 20 3d  ..  iCellDepth =
37660 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
37670 69 43 65 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d  iCellIdx = pCur-
37680 3e 61 69 49 64 78 5b 69 43 65 6c 6c 44 65 70 74  >aiIdx[iCellDept
37690 68 5d 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  h];.  pPage = pC
376a0 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c  ur->apPage[iCell
376b0 44 65 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20  Depth];.  pCell 
376c0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
376d0 2c 20 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20  , iCellIdx);..  
376e0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63  /* If the page c
376f0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e  ontaining the en
37700 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 69 73  try to delete is
37710 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
37720 2c 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20  , move.  ** the 
37730 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
37740 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74  rgest entry in t
37750 68 65 20 74 72 65 65 20 74 68 61 74 20 69 73 20  he tree that is 
37760 73 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a  smaller than.  *
37770 2a 20 74 68 65 20 65 6e 74 72 79 20 62 65 69 6e  * the entry bein
37780 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20  g deleted. This 
37790 63 65 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63  cell will replac
377a0 65 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67  e the cell being
377b0 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72   deleted.  ** fr
377c0 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  om the internal 
377d0 6e 6f 64 65 2e 20 54 68 65 20 27 70 72 65 76 69  node. The 'previ
377e0 6f 75 73 27 20 65 6e 74 72 79 20 69 73 20 75 73  ous' entry is us
377f0 65 64 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  ed for this inst
37800 65 61 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ead.  ** of the 
37810 27 6e 65 78 74 27 20 65 6e 74 72 79 2c 20 61 73  'next' entry, as
37820 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
37830 74 72 79 20 69 73 20 61 6c 77 61 79 73 20 61 20  try is always a 
37840 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
37850 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64   sub-tree headed
37860 20 62 79 20 74 68 65 20 63 68 69 6c 64 20 70 61   by the child pa
37870 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 62  ge of the cell b
37880 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68  eing deleted. Th
37890 69 73 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61  is makes.  ** ba
378a0 6c 61 6e 63 69 6e 67 20 74 68 65 20 74 72 65 65  lancing the tree
378b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64   following the d
378c0 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  elete operation 
378d0 65 61 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66  easier.  */.  if
378e0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
378f0 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65  {.    int notUse
37900 64 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  d;.    rc = sqli
37910 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
37920 28 70 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29  (pCur, &notUsed)
37930 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
37940 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
37950 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
37960 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
37970 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
37980 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 62   on this table b
37990 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e  efore.  ** makin
379a0 67 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  g any modificati
379b0 6f 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20 70 61  ons. Make the pa
379c0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
379d0 65 20 65 6e 74 72 79 20 74 6f 20 62 65 20 0a 20  e entry to be . 
379e0 20 2a 2a 20 64 65 6c 65 74 65 64 20 77 72 69 74   ** deleted writ
379f0 61 62 6c 65 2e 20 54 68 65 6e 20 66 72 65 65 20  able. Then free 
37a00 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
37a10 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
37a20 74 68 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74  th the .  ** ent
37a30 72 79 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 72  ry and finally r
37a40 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20 69  emove the cell i
37a50 74 73 65 6c 66 20 66 72 6f 6d 20 77 69 74 68 69  tself from withi
37a60 6e 20 74 68 65 20 70 61 67 65 2e 20 20 0a 20 20  n the page.  .  
37a70 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  */.  rc = saveAl
37a80 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
37a90 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
37aa0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
37ab0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
37ac0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
37ad0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
37ae0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
37af0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
37b00 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
37b10 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 64 72 6f  e, pCell);.  dro
37b20 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  pCell(pPage, iCe
37b30 6c 6c 49 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  llIdx, cellSizeP
37b40 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
37b50 2c 20 26 72 63 29 3b 0a 20 20 69 66 28 20 72 63  , &rc);.  if( rc
37b60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
37b70 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
37b80 64 65 6c 65 74 65 64 20 77 61 73 20 6e 6f 74 20  deleted was not 
37b90 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c 65 61  located on a lea
37ba0 66 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  f page, then the
37bb0 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 69 73 20   cursor.  ** is 
37bc0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
37bd0 6e 67 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  ng to the larges
37be0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73  t entry in the s
37bf0 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 0a 20  ub-tree headed. 
37c00 20 2a 2a 20 62 79 20 74 68 65 20 63 68 69 6c 64   ** by the child
37c10 2d 70 61 67 65 20 6f 66 20 74 68 65 20 63 65 6c  -page of the cel
37c20 6c 20 74 68 61 74 20 77 61 73 20 6a 75 73 74 20  l that was just 
37c30 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 6e 20  deleted from an 
37c40 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f  internal.  ** no
37c50 64 65 2e 20 54 68 65 20 63 65 6c 6c 20 66 72 6f  de. The cell fro
37c60 6d 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  m the leaf node 
37c70 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f 76 65  needs to be move
37c80 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
37c90 6c 0a 20 20 2a 2a 20 6e 6f 64 65 20 74 6f 20 72  l.  ** node to r
37ca0 65 70 6c 61 63 65 20 74 68 65 20 64 65 6c 65 74  eplace the delet
37cb0 65 64 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 69  ed cell.  */.  i
37cc0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
37cd0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
37ce0 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 61 70  pLeaf = pCur->ap
37cf0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
37d00 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  ];.    int nCell
37d10 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 20 3d 20 70  ;.    Pgno n = p
37d20 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c  Cur->apPage[iCel
37d30 6c 44 65 70 74 68 2b 31 5d 2d 3e 70 67 6e 6f 3b  lDepth+1]->pgno;
37d40 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
37d50 61 72 20 2a 70 54 6d 70 3b 0a 0a 20 20 20 20 70  ar *pTmp;..    p
37d60 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
37d70 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e 43  pLeaf, pLeaf->nC
37d80 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 6e 43 65 6c  ell-1);.    nCel
37d90 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
37da0 70 4c 65 61 66 2c 20 70 43 65 6c 6c 29 3b 0a 20  pLeaf, pCell);. 
37db0 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45     assert( MX_CE
37dc0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 6e 43  LL_SIZE(pBt)>=nC
37dd0 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 61 6c 6c 6f  ell );..    allo
37de0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
37df0 74 29 3b 0a 20 20 20 20 70 54 6d 70 20 3d 20 70  t);.    pTmp = p
37e00 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a  Bt->pTmpSpace;..
37e10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37e20 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66  PagerWrite(pLeaf
37e30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
37e40 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
37e50 2c 20 69 43 65 6c 6c 49 64 78 2c 20 70 43 65 6c  , iCellIdx, pCel
37e60 6c 2d 34 2c 20 6e 43 65 6c 6c 2b 34 2c 20 70 54  l-4, nCell+4, pT
37e70 6d 70 2c 20 6e 2c 20 26 72 63 29 3b 0a 20 20 20  mp, n, &rc);.   
37e80 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 2c   dropCell(pLeaf,
37e90 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 2c   pLeaf->nCell-1,
37ea0 20 6e 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20   nCell, &rc);.  
37eb0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
37ec0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
37ed0 42 61 6c 61 6e 63 65 20 74 68 65 20 74 72 65 65  Balance the tree
37ee0 2e 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 64  . If the entry d
37ef0 65 6c 65 74 65 64 20 77 61 73 20 6c 6f 63 61 74  eleted was locat
37f00 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70 61 67  ed on a leaf pag
37f10 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  e,.  ** then the
37f20 20 63 75 72 73 6f 72 20 73 74 69 6c 6c 20 70 6f   cursor still po
37f30 69 6e 74 73 20 74 6f 20 74 68 61 74 20 70 61 67  ints to that pag
37f40 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
37f50 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 63  the first.  ** c
37f60 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 29  all to balance()
37f70 20 72 65 70 61 69 72 73 20 74 68 65 20 74 72 65   repairs the tre
37f80 65 2c 20 61 6e 64 20 74 68 65 20 69 66 28 2e 2e  e, and the if(..
37f90 2e 29 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 0a  .) condition is.
37fa0 20 20 2a 2a 20 6e 65 76 65 72 20 74 72 75 65 2e    ** never true.
37fb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72  .  **.  ** Other
37fc0 77 69 73 65 2c 20 69 66 20 74 68 65 20 65 6e 74  wise, if the ent
37fd0 72 79 20 64 65 6c 65 74 65 64 20 77 61 73 20 6f  ry deleted was o
37fe0 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  n an internal no
37ff0 64 65 20 70 61 67 65 2c 20 74 68 65 6e 0a 20 20  de page, then.  
38000 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  ** pCur is point
38010 69 6e 67 20 74 6f 20 74 68 65 20 6c 65 61 66 20  ing to the leaf 
38020 70 61 67 65 20 66 72 6f 6d 20 77 68 69 63 68 20  page from which 
38030 61 20 63 65 6c 6c 20 77 61 73 20 72 65 6d 6f 76  a cell was remov
38040 65 64 20 74 6f 0a 20 20 2a 2a 20 72 65 70 6c 61  ed to.  ** repla
38050 63 65 20 74 68 65 20 63 65 6c 6c 20 64 65 6c 65  ce the cell dele
38060 74 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  ted from the int
38070 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 69 73  ernal node. This
38080 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 2a   is slightly.  *
38090 2a 20 74 72 69 63 6b 79 20 61 73 20 74 68 65 20  * tricky as the 
380a0 6c 65 61 66 20 6e 6f 64 65 20 6d 61 79 20 62 65  leaf node may be
380b0 20 75 6e 64 65 72 66 75 6c 6c 2c 20 61 6e 64 20   underfull, and 
380c0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
380d0 65 20 6d 61 79 0a 20 20 2a 2a 20 62 65 20 65 69  e may.  ** be ei
380e0 74 68 65 72 20 75 6e 64 65 72 20 6f 72 20 6f 76  ther under or ov
380f0 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20  erfull. In this 
38100 63 61 73 65 20 72 75 6e 20 74 68 65 20 62 61 6c  case run the bal
38110 61 6e 63 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d  ancing algorithm
38120 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 61  .  ** on the lea
38130 66 20 6e 6f 64 65 20 66 69 72 73 74 2e 20 49 66  f node first. If
38140 20 74 68 65 20 62 61 6c 61 6e 63 65 20 70 72 6f   the balance pro
38150 63 65 65 64 73 20 66 61 72 20 65 6e 6f 75 67 68  ceeds far enough
38160 20 75 70 20 74 68 65 0a 20 20 2a 2a 20 74 72 65   up the.  ** tre
38170 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 62 65  e that we can be
38180 20 73 75 72 65 20 74 68 61 74 20 61 6e 79 20 70   sure that any p
38190 72 6f 62 6c 65 6d 20 69 6e 20 74 68 65 20 69 6e  roblem in the in
381a0 74 65 72 6e 61 6c 20 6e 6f 64 65 20 68 61 73 0a  ternal node has.
381b0 20 20 2a 2a 20 62 65 65 6e 20 63 6f 72 72 65 63    ** been correc
381c0 74 65 64 2c 20 73 6f 20 62 65 20 69 74 2e 20 4f  ted, so be it. O
381d0 74 68 65 72 77 69 73 65 2c 20 61 66 74 65 72 20  therwise, after 
381e0 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 6c 65  balancing the le
381f0 61 66 20 6e 6f 64 65 2c 0a 20 20 2a 2a 20 77 61  af node,.  ** wa
38200 6c 6b 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  lk the cursor up
38210 20 74 68 65 20 74 72 65 65 20 74 6f 20 74 68 65   the tree to the
38220 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 61   internal node a
38230 6e 64 20 62 61 6c 61 6e 63 65 20 69 74 20 61 73  nd balance it as
38240 20 0a 20 20 2a 2a 20 77 65 6c 6c 2e 20 20 2a 2f   .  ** well.  */
38250 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28  .  rc = balance(
38260 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
38270 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43  =SQLITE_OK && pC
38280 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44  ur->iPage>iCellD
38290 65 70 74 68 20 29 7b 0a 20 20 20 20 77 68 69 6c  epth ){.    whil
382a0 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 69  e( pCur->iPage>i
382b0 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a 20 20 20  CellDepth ){.   
382c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
382d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
382e0 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20  ->iPage--]);.   
382f0 20 7d 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61   }.    rc = bala
38300 6e 63 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  nce(pCur);.  }..
38310 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
38320 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
38330 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
38340 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
38350 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
38360 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
38370 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
38380 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
38390 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
383a0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
383b0 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
383c0 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
383d0 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
383e0 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
383f0 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
38400 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
38410 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
38420 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
38430 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
38440 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
38450 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
38460 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
38470 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
38480 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
38490 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
384a0 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
384b0