/ Hex Artifact Content
Login

Artifact 3f99627e8e3014eb38d95ca7e00e56a2dd95f687:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 43 53 56 0a 23 20 69 6e 63 6c 75 64 65 20 22  _CSV.# include "
0340: 63 73 76 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 2f  csv.h".#endif../
0350: 2a 0a 2a 2a 20 54 68 65 20 76 65 72 73 69 6f 6e  *.** The version
0360: 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79 0a   of the library.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 63  E_AMALGAMATION.c
0390: 6f 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65  onst char sqlite
03a0: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51  3_version[] = SQ
03b0: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65  LITE_VERSION;.#e
03c0: 6e 64 69 66 0a 63 6f 6e 73 74 20 63 68 61 72 20  ndif.const char 
03d0: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
03e0: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
03f0: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
0400: 6e 3b 20 7d 0a 63 6f 6e 73 74 20 63 68 61 72 20  n; }.const char 
0410: 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  *sqlite3_sourcei
0420: 64 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  d(void){ return 
0430: 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44  SQLITE_SOURCE_ID
0440: 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ; }.int sqlite3_
0450: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
0460: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
0470: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
0480: 55 4d 42 45 52 3b 20 7d 0a 69 6e 74 20 73 71 6c  UMBER; }.int sql
0490: 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28  ite3_threadsafe(
04a0: 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51  void){ return SQ
04b0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3b  LITE_THREADSAFE;
04c0: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
04d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
04e0: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
04f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
0500: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74  RACE)./*.** If t
0510: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
0520: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73  ction pointer is
0530: 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66   not NULL and if
0540: 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  .** SQLITE_ENABL
0550: 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e 61  E_IOTRACE is ena
0560: 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73 61  bled, then messa
0570: 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a 2a  ges describing.*
0580: 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72 65  * I/O active are
0590: 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20 74   written using t
05a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  his function.  T
05b0: 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a  hese messages.**
05c0: 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66 6f   are intended fo
05d0: 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74 69  r debugging acti
05e0: 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  vity only..*/.vo
05f0: 69 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54 72  id (*sqlite3IoTr
0600: 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ace)(const char*
0610: 2c 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64  , ...) = 0;.#end
0620: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
0630: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
0640: 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74  l variable point
0650: 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68  s to a string wh
0660: 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61  ich is the.** na
0670: 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
0680: 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69 72  y, then that dir
0690: 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75  ectory will be u
06a0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
06b0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
06c0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
06d0: 74 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d 70  the "PRAGMA temp
06e0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
06f0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0700: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0710: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
0720: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   0;../*.** Initi
0730: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0740: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0750: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
0760: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
0770: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0780: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
0790: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
07a0: 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  ems prior to doi
07b0: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
07c0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
07d0: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
07e0: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
07f0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0800: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0810: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
0820: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
0830: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
0840: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
0850: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
0860: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
0870: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0880: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0890: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
08a0: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
08b0: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
08c0: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
08d0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
08e0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
08f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
0900: 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c  st thread to cal
0910: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
0920: 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  uns the initiali
0930: 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d  zation to.** com
0940: 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62  pletion.  If sub
0950: 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20  sequent threads 
0960: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
0970: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  e before the fir
0980: 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73  st.** thread has
0990: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e   finished the in
09a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
09b0: 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73  cess, then the s
09c0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72  ubsequent.** thr
09d0: 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20  eads must block 
09e0: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
09f0: 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20  thread finishes 
0a00: 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
0a10: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ization..**.** T
0a20: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
0a30: 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20  might call this 
0a40: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
0a50: 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a  ely.  Recursive.
0a60: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ** calls to this
0a70: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
0a80: 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f  not block, of co
0a90: 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  urse.  Otherwise
0aa0: 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   the.** initiali
0ab0: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77  zation process w
0ac0: 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c  ould never compl
0ad0: 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58  ete..**.** Let X
0ae0: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68   be the first th
0af0: 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68  read to enter th
0b00: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74  is routine.  Let
0b10: 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72   Y be some other
0b20: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65  .** thread.  The
0b30: 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74  n while the init
0b40: 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ial invocation o
0b50: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
0b60: 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70  y X is.** incomp
0b70: 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75  lete, it is requ
0b80: 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ired that:.**.**
0b90: 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20      *  Calls to 
0ba0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
0bb0: 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  m Y must block u
0bc0: 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d  ntil the outer-m
0bd0: 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c  ost.**       cal
0be0: 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73  l by X completes
0bf0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65  ..**.**    *  Re
0c00: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
0c10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
0c20: 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75  om thread X retu
0c30: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
0c40: 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20  *       without 
0c50: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  blocking..*/.int
0c60: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
0c70: 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ize(void){.  sql
0c80: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
0c90: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
0ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0cb0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
0cc0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cf0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
0d00: 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
0d10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
0d20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73   rc = sqlite3_ws
0d30: 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29  d_init(4096, 24)
0d40: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
0d50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
0d60: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
0d70: 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69  if..  /* If SQLi
0d80: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f  te is already co
0d90: 6d 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c  mpletely initial
0da0: 69 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  ized, then this 
0db0: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c  call.  ** to sql
0dc0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
0dd0: 29 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  ) should be a no
0de0: 2d 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e  -op.  But the in
0df0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
0e00: 2a 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65  * must be comple
0e10: 74 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d  te.  So isInit m
0e20: 75 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75  ust not be set u
0e30: 6e 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e  ntil the very en
0e40: 64 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72  d.  ** of this r
0e50: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  outine..  */.  i
0e60: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
0e70: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20  Config.isInit ) 
0e80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0e90: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
0ea0: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
0eb0: 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c  ystem is initial
0ec0: 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65  ized.  If unable
0ed0: 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61   to .  ** initia
0ee0: 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73  lize the mutex s
0ef0: 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e  ubsystem, return
0f00: 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20   early with the 
0f10: 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74  error..  ** If t
0f20: 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20  he system is so 
0f30: 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65  sick that we are
0f40: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
0f50: 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a  ate a mutex,.  *
0f60: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d  * there is not m
0f70: 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f  uch SQLite is go
0f80: 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74  ing to be able t
0f90: 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o do..  **.  ** 
0fa0: 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  The mutex subsys
0fb0: 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61  tem must take ca
0fc0: 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e  re of serializin
0fd0: 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69  g its own.  ** i
0fe0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20  nitialization.. 
0ff0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1000: 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20  e3MutexInit();. 
1010: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1020: 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69   rc;..  /* Initi
1030: 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63  alize the malloc
1040: 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68  () system and th
1050: 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69  e recursive pIni
1060: 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20  tMutex mutex..  
1070: 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f  ** This operatio
1080: 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  n is protected b
1090: 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53  y the STATIC_MAS
10a0: 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65  TER mutex.  Note
10b0: 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78   that.  ** Mutex
10c0: 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65  Alloc() is calle
10d0: 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d  d for a static m
10e0: 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e  utex prior to in
10f0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20  itializing the. 
1100: 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79   ** malloc subsy
1110: 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c  stem - this impl
1120: 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c  ies that the all
1130: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61  ocation of a sta
1140: 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d  tic.  ** mutex m
1150: 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20  ust not require 
1160: 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65  support from the
1170: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1180: 6d 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  m..  */.  pMaste
1190: 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
11a0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
11b0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
11c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
11d0: 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
11e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  );.  sqlite3Glob
11f0: 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78  alConfig.isMutex
1200: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20  Init = 1;.  if( 
1210: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
1220: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
1230: 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  t ){.    rc = sq
1240: 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28  lite3MallocInit(
1250: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1260: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1270: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1280: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
1290: 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  it = 1;.    if( 
12a0: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
12b0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20  nfig.pInitMutex 
12c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12d0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
12e0: 69 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20  itMutex =.      
12f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65       sqlite3Mute
1300: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
1310: 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
1320: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1330: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
1340: 6f 72 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c  oreMutex && !sql
1350: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1360: 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20  .pInitMutex ){. 
1370: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1380: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1390: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
13a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  ){.    sqlite3Gl
13c0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
13d0: 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a  nitMutex++;.  }.
13e0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13f0: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
1400: 0a 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e  .  /* If rc is n
1410: 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20  ot SQLITE_OK at 
1420: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
1430: 20 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c   either the mall
1440: 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65  oc.  ** subsyste
1450: 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69  m could not be i
1460: 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68  nitialized or th
1470: 65 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20  e system failed 
1480: 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  to allocate.  **
1490: 20 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20   the pInitMutex 
14a0: 6d 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e  mutex. Return an
14b0: 20 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72   error in either
14c0: 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28   case.  */.  if(
14d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
14f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68  .  }..  /* Do th
1500: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e  e rest of the in
1510: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64  itialization und
1520: 65 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  er the recursive
1530: 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74   mutex so.  ** t
1540: 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61  hat we will be a
1550: 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65  ble to handle re
1560: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e  cursive calls in
1570: 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  to.  ** sqlite3_
1580: 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54  initialize().  T
1590: 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
15a0: 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65  ls normally come
15b0: 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71   through.  ** sq
15c0: 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20  lite3_os_init() 
15d0: 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20  when it invokes 
15e0: 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
15f0: 73 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65  ster(), but othe
1600: 72 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65  r.  ** recursive
1610: 20 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73   calls might als
1620: 6f 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  o be possible.. 
1630: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1640: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
1650: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1660: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28  nitMutex);.  if(
1670: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1680: 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26  nfig.isInit==0 &
1690: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
16a0: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
16b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 75 6e 63 44  ==0 ){.    FuncD
16c0: 65 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  efHash *pHash = 
16d0: 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48  &GLOBAL(FuncDefH
16e0: 61 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  ash, sqlite3Glob
16f0: 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20  alFunctions);.  
1700: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1710: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
1720: 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 1;.    memset
1730: 28 70 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  (pHash, 0, sizeo
1740: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46  f(sqlite3GlobalF
1750: 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20  unctions));.    
1760: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 47  sqlite3RegisterG
1770: 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29  lobalFunctions()
1780: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1790: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
17a0: 50 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b  PCacheInit==0 ){
17b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17c0: 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c  te3PcacheInitial
17d0: 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ize();.    }.   
17e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17f0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1800: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1810: 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31  isPCacheInit = 1
1820: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1830: 69 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20  ite3OsInit();.  
1840: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1850: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1860: 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65     sqlite3PCache
1870: 42 75 66 66 65 72 53 65 74 75 70 28 20 73 71 6c  BufferSetup( sql
1880: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1890: 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20  .pPage, .       
18a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
18b0: 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73  Config.szPage, s
18c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18d0: 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  ig.nPage);.     
18e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18f0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b  nfig.isInit = 1;
1900: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1910: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1920: 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  nProgress = 0;. 
1930: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1940: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
1950: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1960: 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  itMutex);..  /* 
1970: 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68  Go back under th
1980: 65 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 61  e static mutex a
1990: 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  nd clean up the 
19a0: 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d  recursive.  ** m
19b0: 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20  utex to prevent 
19c0: 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e  a resource leak.
19d0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
19e0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
19f0: 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  ter);.  sqlite3G
1a00: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
1a10: 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20 69  InitMutex--;.  i
1a20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1a30: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
1a40: 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20 61  utex<=0 ){.    a
1a50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c  ssert( sqlite3Gl
1a60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
1a70: 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20  nitMutex==0 );. 
1a80: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1a90: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c 6f  _free(sqlite3Glo
1aa0: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1ab0: 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  utex);.    sqlit
1ac0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1ad0: 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20  InitMutex = 0;. 
1ae0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1af0: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1b00: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
1b10: 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61  lowing is just a
1b20: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f   sanity check to
1b30: 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74   make sure SQLit
1b40: 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20  e has.  ** been 
1b50: 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74  compiled correct
1b60: 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72  ly.  It is impor
1b70: 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73  tant to run this
1b80: 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20   code, but.  ** 
1b90: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
1ba0: 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65   run it too ofte
1bb0: 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50  n and soak up CP
1bc0: 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a  U cycles for no.
1bd0: 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f    ** reason.  So
1be0: 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20   we run it once 
1bf0: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
1c00: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ation..  */.#ifn
1c10: 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e 64  def NDEBUG.#ifnd
1c20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1c30: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1c40: 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  /* This section 
1c50: 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20 22  of code's only "
1c60: 6f 75 74 70 75 74 22 20 69 73 20 76 69 61 20 61  output" is via a
1c70: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1c80: 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72 63  ts. */.  if ( rc
1c90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ca0: 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 75 36     u64 x = (((u6
1cb0: 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20 20  4)1)<<63)-1;.   
1cc0: 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 61   double y;.    a
1cd0: 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d  ssert(sizeof(x)=
1ce0: 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  =8);.    assert(
1cf0: 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65 6f  sizeof(x)==sizeo
1d00: 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  f(y));.    memcp
1d10: 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20 20  y(&y, &x, 8);.  
1d20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d30: 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20 7d  3IsNaN(y) );.  }
1d40: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  .#endif.#endif..
1d50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d60: 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65  /*.** Undo the e
1d70: 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74 65  ffects of sqlite
1d80: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20  3_initialize(). 
1d90: 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c   Must not be cal
1da0: 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65  led while.** the
1db0: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
1dc0: 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ng database conn
1dd0: 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72  ections or memor
1de0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72  y allocations or
1df0: 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70 61  .** while any pa
1e00: 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73 20  rt of SQLite is 
1e10: 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65  otherwise in use
1e20: 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e 20   in any thread. 
1e30: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
1e40: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
1e50: 66 65 2e 20 20 42 75 74 20 69 74 20 69 73 20 73  fe.  But it is s
1e60: 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  afe to invoke th
1e70: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e  is routine.** on
1e80: 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20   when SQLite is 
1e90: 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77  already shut dow
1ea0: 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20 69 73  n.  If SQLite is
1eb0: 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f   already shut do
1ec0: 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  wn.** when this 
1ed0: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
1ee0: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ed, then this ro
1ef0: 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c  utine is a harml
1f00: 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  ess no-op..*/.in
1f10: 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  t sqlite3_shutdo
1f20: 77 6e 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  wn(void){.  if( 
1f30: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1f40: 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 20 20  fig.isInit ){.  
1f50: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64    sqlite3_os_end
1f60: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
1f70: 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e  reset_auto_exten
1f80: 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  sion();.    sqli
1f90: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1fa0: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
1fb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1fc0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
1fd0: 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  heInit ){.    sq
1fe0: 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74 64  lite3PcacheShutd
1ff0: 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  own();.    sqlit
2000: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2010: 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30 3b  sPCacheInit = 0;
2020: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2030: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2040: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
2050: 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63     sqlite3Malloc
2060: 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  End();.    sqlit
2070: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2080: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b  sMallocInit = 0;
2090: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
20a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
20b0: 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20  sMutexInit ){.  
20c0: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e    sqlite3MutexEn
20d0: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
20e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
20f0: 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20  utexInit = 0;.  
2100: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2110: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2120: 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20  This API allows 
2130: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20  applications to 
2140: 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61  modify the globa
2150: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
2160: 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  of.** the SQLite
2170: 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d   library at run-
2180: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  time..**.** This
2190: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
21a0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
21b0: 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
21c0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
21d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
21e0: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
21f0: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69  llocations.  Thi
2200: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
2210: 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20  .** threadsafe. 
2220: 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64   Failure to heed
2230: 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20   these warnings 
2240: 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72  can lead to unpr
2250: 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68  edictable.** beh
2260: 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
2270: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74  lite3_config(int
2280: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
2290: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
22a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
22b0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    /* sqlite3_con
22c0: 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75  fig() shall retu
22d0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
22e0: 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65   if it is invoke
22f0: 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65  d while.  ** the
2300: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
2310: 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20  is in use. */.  
2320: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2330: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
2340: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
2350: 49 53 55 53 45 3b 0a 0a 20 20 76 61 5f 73 74 61  ISUSE;..  va_sta
2360: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
2370: 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
2380: 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67   /* Mutex config
2390: 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20  uration options 
23a0: 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  are only availab
23b0: 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64 73 61  le in a threadsa
23c0: 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  fe.    ** compil
23d0: 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20 53  e. .    */.#if S
23e0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
23f0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2400: 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48  _CONFIG_SINGLETH
2410: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
2420: 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74   Disable all mut
2430: 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73  exing */.      s
2440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2450: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
2460: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
2470: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
2480: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20  llMutex = 0;.   
2490: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
24a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
24b0: 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45  CONFIG_MULTITHRE
24c0: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
24d0: 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20  isable mutexing 
24e0: 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  of database conn
24f0: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20  ections */.     
2500: 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78   /* Enable mutex
2510: 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61  ing of core data
2520: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
2530: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2540: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
2550: 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  tex = 1;.      s
2560: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2570: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
2580: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
2590: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
25a0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52  QLITE_CONFIG_SER
25b0: 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20  IALIZED: {.     
25c0: 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 6d   /* Enable all m
25d0: 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20  utexing */.     
25e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
25f0: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2600: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
2610: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2620: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a 20  FullMutex = 1;. 
2630: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2640: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2650: 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20  E_CONFIG_MUTEX: 
2660: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
2670: 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  fy an alternativ
2680: 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e  e mutex implemen
2690: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
26a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
26b0: 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f  fig.mutex = *va_
26c0: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
26d0: 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b  mutex_methods*);
26e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2700: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55  ITE_CONFIG_GETMU
2710: 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TEX: {.      /* 
2720: 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72  Retrieve the cur
2730: 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65  rent mutex imple
2740: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
2750: 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73     *va_arg(ap, s
2760: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74  qlite3_mutex_met
2770: 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33  hods*) = sqlite3
2780: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
2790: 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ex;.      break;
27a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .    }.#endif...
27b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
27c0: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b  CONFIG_MALLOC: {
27d0: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
27e0: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
27f0: 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e   malloc implemen
2800: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
2810: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2820: 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28  fig.m = *va_arg(
2830: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
2840: 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20  methods*);.     
2850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2860: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2870: 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20  NFIG_GETMALLOC: 
2880: 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69  {.      /* Retri
2890: 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  eve the current 
28a0: 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65  malloc() impleme
28b0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
28c0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
28d0: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c  alConfig.m.xMall
28e0: 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d  oc==0 ) sqlite3M
28f0: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  emSetDefault();.
2900: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
2910: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
2920: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
2930: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b  3GlobalConfig.m;
2940: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2950: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2960: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54  ITE_CONFIG_MEMST
2970: 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ATUS: {.      /*
2980: 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
2990: 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 74  le the malloc st
29a0: 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e 20  atus collection 
29b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
29c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
29d0: 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61  mstat = va_arg(a
29e0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
29f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2a00: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2a10: 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20  IG_SCRATCH: {.  
2a20: 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65      /* Designate
2a30: 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 73 63   a buffer for sc
2a40: 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61  ratch memory spa
2a50: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
2a60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2a70: 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  pScratch = va_ar
2a80: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
2a90: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2aa0: 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63  lConfig.szScratc
2ab0: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  h = va_arg(ap, i
2ac0: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
2ad0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2ae0: 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67  Scratch = va_arg
2af0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
2b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2b10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2b20: 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20  NFIG_PAGECACHE: 
2b30: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67  {.      /* Desig
2b40: 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f  nate a buffer fo
2b50: 72 20 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d  r page cache mem
2b60: 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ory space */.   
2b70: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2b80: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
2b90: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
2ba0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
2bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
2bc0: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
2bd0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
2be0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2bf0: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
2c00: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
2c10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
2c20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2c30: 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20  FIG_PCACHE: {.  
2c40: 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61      /* Specify a
2c50: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61  n alternative pa
2c60: 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65  ge cache impleme
2c70: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
2c80: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2c90: 6e 66 69 67 2e 70 63 61 63 68 65 20 3d 20 2a 76  nfig.pcache = *v
2ca0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
2cb0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
2cc0: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
2cd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
2ce0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47   SQLITE_CONFIG_G
2cf0: 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  ETPCACHE: {.    
2d00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2d10: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
2d20: 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  .xInit==0 ){.   
2d30: 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63       sqlite3PCac
2d40: 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  heSetDefault();.
2d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 76        }.      *v
2d60: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
2d70: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
2d80: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
2d90: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 3b  alConfig.pcache;
2da0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2db0: 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
2dc0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
2dd0: 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e  EMSYS3) || defin
2de0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2df0: 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61  _MEMSYS5).    ca
2e00: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2e10: 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f  _HEAP: {.      /
2e20: 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62 75  * Designate a bu
2e30: 66 66 65 72 20 66 6f 72 20 68 65 61 70 20 6d 65  ffer for heap me
2e40: 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20  mory space */.  
2e50: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2e60: 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20  lConfig.pHeap = 
2e70: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
2e80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65  GlobalConfig.nHe
2ea0: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
2eb0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
2ec0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2ed0: 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61  mnReq = va_arg(a
2ee0: 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20  p, int);..      
2ef0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2f00: 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30  lConfig.pHeap==0
2f10: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2f20: 66 20 74 68 65 20 68 65 61 70 20 70 6f 69 6e 74  f the heap point
2f30: 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  er is NULL, then
2f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 6d 61 6c   restore the mal
2f50: 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  loc implementati
2f60: 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  on.        ** ba
2f70: 63 6b 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74  ck to NULL point
2f80: 65 72 73 20 74 6f 6f 2e 20 20 54 68 69 73 20 77  ers too.  This w
2f90: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 6d 61  ill cause the ma
2fa0: 6c 6c 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20 20  lloc to go.     
2fb0: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74     ** back to it
2fc0: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
2fd0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
2fe0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
2ff0: 28 29 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  () is.        **
3000: 20 72 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f   run..        */
3010: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
3020: 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  &sqlite3GlobalCo
3030: 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f  nfig.m, 0, sizeo
3040: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  f(sqlite3GlobalC
3050: 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20  onfig.m));.     
3060: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3070: 2f 2a 20 54 68 65 20 68 65 61 70 20 70 6f 69 6e  /* The heap poin
3080: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
3090: 20 74 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e   then install on
30a0: 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
30b0: 20 2a 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e   ** mem5.c/mem3.
30c0: 63 20 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e 65  c methods. If ne
30d0: 69 74 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45 4d  ither ENABLE_MEM
30e0: 53 59 53 33 20 6e 6f 72 0a 20 20 20 20 20 20 20  SYS3 nor.       
30f0: 20 2a 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59   ** ENABLE_MEMSY
3100: 53 35 20 69 73 20 64 65 66 69 6e 65 64 2c 20 72  S5 is defined, r
3110: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  eturn an error..
3120: 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
3130: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3140: 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20  MEMSYS3.        
3150: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3160: 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33  fig.m = *sqlite3
3170: 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b  MemGetMemsys3();
3180: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
3190: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
31a0: 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c  SYS5.        sql
31b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
31c0: 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d  .m = *sqlite3Mem
31d0: 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65  GetMemsys5();.#e
31e0: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
31f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3200: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
3210: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c   SQLITE_CONFIG_L
3220: 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20  OOKASIDE: {.    
3230: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3240: 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64  onfig.szLookasid
3250: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
3260: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3270: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3280: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61  Lookaside = va_a
3290: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
32a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
32b0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
32c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
32e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
32f0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
3300: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3310: 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c  .** Set up the l
3320: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 73  ookaside buffers
3330: 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
3340: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52  connection..** R
3350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3360: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a  on success.  .**
3370: 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73   If lookaside is
3380: 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c   already active,
3390: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
33a0: 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  USY..**.** The s
33b0: 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  z parameter is t
33c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
33d0: 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61  es in each looka
33e0: 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68  side slot..** Th
33f0: 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20  e cnt parameter 
3400: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3410: 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61   slots.  If pSta
3420: 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a  rt is NULL the.*
3430: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
3440: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
3450: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
3460: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
3470: 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74  ()..** If pStart
3480: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
3490: 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62  n it is sz*cnt b
34a0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74  ytes of memory t
34b0: 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65  o use for.** the
34c0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
34d0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
34e0: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
34f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
3500: 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c  d *pBuf, int sz,
3510: 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69   int cnt){.  voi
3520: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
3530: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
3540: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
3550: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
3560: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
3570: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
3580: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
3590: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
35a0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
35b0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
35c0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
35d0: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
35e0: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
35f0: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
3600: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
3610: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
3620: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
3630: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
3640: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
3650: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
3660: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
3670: 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67  needs to be larg
3680: 65 72 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65  er than a pointe
3690: 72 0a 20 20 2a 2a 20 74 6f 20 62 65 20 75 73 65  r.  ** to be use
36a0: 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ful..  */.  if( 
36b0: 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  sz<=(int)sizeof(
36c0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
36d0: 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  ) sz = 0;.  if( 
36e0: 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b  cnt<0 ) cnt = 0;
36f0: 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20  .  if( sz==0 || 
3700: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  cnt==0 ){.    sz
3710: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
3720: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
3730: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
3740: 20 73 7a 20 3d 20 52 4f 55 4e 44 38 28 73 7a 29   sz = ROUND8(sz)
3750: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
3760: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
3770: 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 73  ;.    pStart = s
3780: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a  qlite3Malloc( sz
3790: 2a 63 6e 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  *cnt );.    sqli
37a0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
37b0: 6f 63 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oc();.  }else{. 
37c0: 20 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57     sz = ROUNDDOW
37d0: 4e 38 28 73 7a 29 3b 0a 20 20 20 20 70 53 74 61  N8(sz);.    pSta
37e0: 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20  rt = pBuf;.  }. 
37f0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
3800: 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a  Start = pStart;.
3810: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
3820: 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d  pFree = 0;.  db-
3830: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20  >lookaside.sz = 
3840: 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70  (u16)sz;.  if( p
3850: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74  Start ){.    int
3860: 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64   i;.    Lookasid
3870: 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73  eSlot *p;.    as
3880: 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29  sert( sz > (int)
3890: 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65  sizeof(Lookaside
38a0: 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20  Slot*) );.    p 
38b0: 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  = (LookasideSlot
38c0: 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f  *)pStart;.    fo
38d0: 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b  r(i=cnt-1; i>=0;
38e0: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
38f0: 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b  pNext = db->look
3900: 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20  aside.pFree;.   
3910: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
3920: 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20  .pFree = p;.    
3930: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
3940: 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b  Slot*)&((u8*)p)[
3950: 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  sz];.    }.    d
3960: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e  b->lookaside.pEn
3970: 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = p;.    db->l
3980: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
3990: 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 1;.    db->l
39a0: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
39b0: 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a  ed = pBuf==0 ?1:
39c0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
39d0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
39e0: 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  nd = 0;.    db->
39f0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
3a00: 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ed = 0;.    db->
3a10: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
3a20: 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ced = 0;.  }.  r
3a30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3a40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3a50: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
3a60: 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
3a70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
3a80: 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74  ..*/.sqlite3_mut
3a90: 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d  ex *sqlite3_db_m
3aa0: 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  utex(sqlite3 *db
3ab0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
3ac0: 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mutex;.}../*.** 
3ad0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
3ae0: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
3af0: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
3b00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
3b10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
3b20: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
3b30: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
3b40: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
3b50: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
3b60: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
3b70: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
3b80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
3b90: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
3ba0: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
3bb0: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
3bc0: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69   void*);.      i
3bd0: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
3be0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
3bf0: 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28  nt cnt = va_arg(
3c00: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3c10: 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73  rc = setupLookas
3c20: 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a  ide(db, pBuf, sz
3c30: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , cnt);.      br
3c40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
3c50: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
3c60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
3c70: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
3c80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65      }.  }.  va_e
3c90: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
3ca0: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
3cb0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
3cc0: 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d  e buffer z[0..n-
3cd0: 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  1] contains all 
3ce0: 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  spaces..*/.stati
3cf0: 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28  c int allSpaces(
3d00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
3d10: 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt n){.  while( 
3d20: 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>0 && z[n-1]=='
3d30: 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72   ' ){ n--; }.  r
3d40: 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f  eturn n==0;.}../
3d50: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
3d60: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
3d70: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ng function name
3d80: 64 20 22 42 49 4e 41 52 59 22 20 77 68 69 63 68  d "BINARY" which
3d90: 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76   is always.** av
3da0: 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  ailable..**.** I
3db0: 66 20 74 68 65 20 70 61 64 46 6c 61 67 20 61 72  f the padFlag ar
3dc0: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
3dd0: 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70 61  LL then space pa
3de0: 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64  dding at the end
3df0: 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69  .** of strings i
3e00: 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  s ignored.  This
3e10: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
3e20: 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e  RTRIM collation.
3e30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
3e40: 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f  inCollFunc(.  vo
3e50: 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69  id *padFlag,.  i
3e60: 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
3e70: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
3e80: 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
3e90: 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
3ea0: 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20   int rc, n;.  n 
3eb0: 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20  = nKey1<nKey2 ? 
3ec0: 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20  nKey1 : nKey2;. 
3ed0: 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65   rc = memcmp(pKe
3ee0: 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20  y1, pKey2, n);. 
3ef0: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
3f00: 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20    if( padFlag.  
3f10: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
3f20: 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e  ((char*)pKey1)+n
3f30: 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20  , nKey1-n).     
3f40: 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63  && allSpaces(((c
3f50: 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e  har*)pKey2)+n, n
3f60: 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20  Key2-n).    ){. 
3f70: 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63       /* Leave rc
3f80: 20 75 6e 63 68 61 6e 67 65 64 20 61 74 20 30 20   unchanged at 0 
3f90: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
3fa0: 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
3fb0: 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20   nKey2;.    }.  
3fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
3fd0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20  ../*.** Another 
3fe0: 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
3ff0: 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43  ng sequence: NOC
4000: 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ASE. .**.** This
4010: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
4020: 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  nce is intended 
4030: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22  to be used for "
4040: 63 61 73 65 20 69 6e 64 65 70 65 6e 64 61 6e 74  case independant
4050: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e  .** comparison".
4060: 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65   SQLite's knowle
4070: 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64  dge of upper and
4080: 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69   lower case equi
4090: 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e  valents.** exten
40a0: 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32  ds only to the 2
40b0: 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65  6 characters use
40c0: 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68  d in the English
40d0: 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a   language..**.**
40e0: 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74   At the moment t
40f0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55  here is only a U
4100: 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74  TF-8 implementat
4110: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
4120: 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  nt nocaseCollati
4130: 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  ngFunc(.  void *
4140: 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e  NotUsed,.  int n
4150: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
4160: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
4170: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
4180: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
4190: 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e   r = sqlite3StrN
41a0: 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e  ICmp(.      (con
41b0: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c  st char *)pKey1,
41c0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
41d0: 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65  Key2, (nKey1<nKe
41e0: 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29  y2)?nKey1:nKey2)
41f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
4200: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
4210: 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20   if( 0==r ){.   
4220: 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32   r = nKey1-nKey2
4230: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4250: 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  n the ROWID of t
4260: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
4270: 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f  nsert.*/.sqlite_
4280: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61  int64 sqlite3_la
4290: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
42a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
42b0: 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52  return db->lastR
42c0: 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  owid;.}../*.** R
42d0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
42e0: 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74   of changes in t
42f0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
4300: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
4310: 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xec()..*/.int sq
4320: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71  lite3_changes(sq
4330: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
4340: 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65  turn db->nChange
4350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4360: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
4370: 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68  changes since th
4380: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
4390: 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f  e was opened..*/
43a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74  .int sqlite3_tot
43b0: 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74  al_changes(sqlit
43c0: 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
43d0: 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e  n db->nTotalChan
43e0: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ge;.}../*.** Clo
43f0: 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  se all open save
4400: 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e  points. This fun
4410: 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70  ction only manip
4420: 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66  ulates fields of
4430: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
4440: 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20   handle object, 
4450: 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73  it does not clos
4460: 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73  e any savepoints
4470: 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65   that may be ope
4480: 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72  n.** at the b-tr
4490: 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a  ee/pager level..
44a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
44b0: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73  loseSavepoints(s
44c0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77  qlite3 *db){.  w
44d0: 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
44e0: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65  oint ){.    Save
44f0: 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62  point *pTmp = db
4500: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->pSavepoint;.  
4510: 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74    db->pSavepoint
4520: 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a   = pTmp->pNext;.
4530: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4540: 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d  e(db, pTmp);.  }
4550: 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  .  db->nSavepoin
4560: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74  t = 0;.  db->nSt
4570: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64  atement = 0;.  d
4580: 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
4590: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d  Savepoint = 0;.}
45a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
45b0: 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65   existing SQLite
45c0: 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 69 6e 74   database.*/.int
45d0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73   sqlite3_close(s
45e0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48  qlite3 *db){.  H
45f0: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 6e  ashElem *i;.  in
4600: 74 20 6a 3b 0a 0a 20 20 69 66 28 20 21 64 62 20  t j;..  if( !db 
4610: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4620: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
4630: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
4640: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
4650: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
4660: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
4670: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
4680: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
4690: 74 65 78 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  tex);..  sqlite3
46a0: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
46b0: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f  ema(db, 0);..  /
46c0: 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
46d0: 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20  on is open, the 
46e0: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
46f0: 65 6d 61 28 29 20 63 61 6c 6c 20 61 62 6f 76 65  ema() call above
4700: 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68  .  ** will not h
4710: 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78  ave called the x
4720: 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74  Disconnect() met
4730: 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75  hod on any virtu
4740: 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69  al.  ** tables i
4750: 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e  n the db->aVTran
4760: 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66  s[] array. The f
4770: 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
4780: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20  VtabRollback(). 
4790: 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f   ** call will do
47a0: 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20   so. We need to 
47b0: 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 74  do this before t
47c0: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74  he check for act
47d0: 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ive.  ** SQL sta
47e0: 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61  tements below, a
47f0: 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d  s the v-table im
4800: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79  plementation may
4810: 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a   be storing.  **
4820: 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73   some prepared s
4830: 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e  tatements intern
4840: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ally..  */.  sql
4850: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
4860: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  (db);..  /* If t
4870: 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74  here are any out
4880: 73 74 61 6e 64 69 6e 67 20 56 4d 73 2c 20 72 65  standing VMs, re
4890: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
48a0: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70  . */.  if( db->p
48b0: 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Vdbe ){.    sqli
48c0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
48d0: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
48e0: 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c     "unable to cl
48f0: 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e  ose due to unfin
4900: 61 6c 69 73 65 64 20 73 74 61 74 65 6d 65 6e 74  alised statement
4910: 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s");.    sqlite3
4920: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
4930: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
4940: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
4950: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
4960: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
4970: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 3b  kSickOrOk(db) );
4980: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ..  for(j=0; j<d
4990: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
49a0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
49b0: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20  b->aDb[j].pBt;. 
49c0: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
49d0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61  lite3BtreeIsInBa
49e0: 63 6b 75 70 28 70 42 74 29 20 29 7b 0a 20 20 20  ckup(pBt) ){.   
49f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
4a00: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
4a10: 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 61   .          "una
4a20: 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65  ble to close due
4a30: 20 74 6f 20 75 6e 66 69 6e 69 73 68 65 64 20 62   to unfinished b
4a40: 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 22  ackup operation"
4a50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4a60: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
4a70: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 72  >mutex);.      r
4a80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
4a90: 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  Y;.    }.  }..  
4aa0: 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73  /* Free any outs
4ab0: 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e  tanding Savepoin
4ac0: 74 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f  t structures. */
4ad0: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53  .  sqlite3CloseS
4ae0: 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a  avepoints(db);..
4af0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
4b00: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
4b10: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
4b20: 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20   &db->aDb[j];.  
4b30: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
4b40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
4b50: 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70  treeClose(pDb->p
4b60: 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  Bt);.      pDb->
4b70: 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pBt = 0;.      i
4b80: 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20  f( j!=1 ){.     
4b90: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20     pDb->pSchema 
4ba0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
4bb0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
4bc0: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
4bd0: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f  ema(db, 0);..  /
4be0: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20  * Tell the code 
4bf0: 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74  in notify.c that
4c00: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
4c10: 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20  no longer holds 
4c20: 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61  any.  ** locks a
4c30: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  nd does not requ
4c40: 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 20  ire any further 
4c50: 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
4c60: 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
4c70: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
4c80: 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20  nClosed(db);..  
4c90: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
4ca0: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
4cb0: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
4cc0: 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f 72 28  Static );.  for(
4cd0: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
4ce0: 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a  (db->aFunc.a); j
4cf0: 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  ++){.    FuncDef
4d00: 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c   *pNext, *pHash,
4d10: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64   *p;.    for(p=d
4d20: 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70  b->aFunc.a[j]; p
4d30: 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20  ; p=pHash){.    
4d40: 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61    pHash = p->pHa
4d50: 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  sh;.      while(
4d60: 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e   p ){.        pN
4d70: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
4d80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
4d90: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
4da0: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
4db0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4dc0: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74   }.  for(i=sqlit
4dd0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
4de0: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
4df0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
4e00: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
4e10: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
4e20: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
4e30: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
4e40: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
4e50: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
4e60: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
4e70: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
4e80: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
4e90: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
4ea0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
4eb0: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
4ec0: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
4ed0: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
4ee0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4ef0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4f00: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
4f10: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
4f20: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
4f30: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
4f40: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
4f50: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
4f60: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
4f70: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
4f80: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
4f90: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
4fa0: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
4fb0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
4fc0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
4fd0: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
4fe0: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
4ff0: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
5000: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5010: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
5020: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
5030: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
5040: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
5050: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
5060: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
5070: 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73  ; /* Deallocates
5080: 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f   any cached erro
5090: 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20  r strings. */.  
50a0: 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a  if( db->pErr ){.
50b0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
50c0: 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a  Free(db->pErr);.
50d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f    }.  sqlite3Clo
50e0: 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  seExtensions(db)
50f0: 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
5100: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
5110: 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  ROR;..  /* The t
5120: 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68  emp-database sch
5130: 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ema is allocated
5140: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f   differently fro
5150: 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65  m the other sche
5160: 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20  ma.  ** objects 
5170: 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c  (using sqliteMal
5180: 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20  loc() directly, 
5190: 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74  instead of sqlit
51a0: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29  e3BtreeSchema())
51b0: 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65  ..  ** So it nee
51c0: 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  ds to be freed h
51d0: 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e  ere. Todo: Why n
51e0: 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70  ot roll the temp
51f0: 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a   schema into.  *
5200: 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74  * the same sqlit
5210: 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65  eMalloc() as the
5220: 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61   one that alloca
5230: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
5240: 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65   .  ** structure
5250: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
5260: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
5270: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
5280: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5290: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
52a0: 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
52b0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
52c0: 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  SED;.  sqlite3_m
52d0: 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75  utex_free(db->mu
52e0: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
52f0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
5300: 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69  ut==0 );  /* Fai
5310: 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64  ls on a lookasid
5320: 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f  e memory leak */
5330: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
5340: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
5350: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
5360: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
5370: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
5380: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
5390: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
53a0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
53b0: 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61  ollback all data
53c0: 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76  base files..*/.v
53d0: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
53e0: 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  ackAll(sqlite3 *
53f0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
5400: 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b  int inTrans = 0;
5410: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5420: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
5430: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
5440: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
5450: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28  Malloc();.  for(
5460: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
5470: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62  i++){.    if( db
5480: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a  ->aDb[i].pBt ){.
5490: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
54a0: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
54b0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
54c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61  ){.        inTra
54d0: 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ns = 1;.      }.
54e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
54f0: 65 65 52 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 61  eeRollback(db->a
5500: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
5510: 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54    db->aDb[i].inT
5520: 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  rans = 0;.    }.
5530: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
5540: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20  bRollback(db);. 
5550: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
5560: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66  nMalloc();..  if
5570: 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ( db->flags&SQLI
5580: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
5590: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
55a0: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
55b0: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
55c0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
55d0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
55e0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e  0);.  }..  /* An
55f0: 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  y deferred const
5600: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73  raint violations
5610: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
5620: 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62  esolved. */.  db
5630: 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
5640: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  = 0;..  /* If on
5650: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69  e has been confi
5660: 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68  gured, invoke th
5670: 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20  e rollback-hook 
5680: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66  callback */.  if
5690: 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43  ( db->xRollbackC
56a0: 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72  allback && (inTr
56b0: 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f  ans || !db->auto
56c0: 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64  Commit) ){.    d
56d0: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
56e0: 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61  back(db->pRollba
56f0: 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ckArg);.  }.}../
5700: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
5710: 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74  atic string that
5720: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b   describes the k
5730: 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65  ind of error spe
5740: 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  cified in the.**
5750: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f   argument..*/.co
5760: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
5770: 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b  3ErrStr(int rc){
5780: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
5790: 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67  char* const aMsg
57a0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51  [] = {.    /* SQ
57b0: 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20  LITE_OK         
57c0: 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f   */ "not an erro
57d0: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
57e0: 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f  E_ERROR       */
57f0: 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f   "SQL logic erro
5800: 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74  r or missing dat
5810: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
5820: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20  QLITE_INTERNAL  
5830: 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53    */ 0,.    /* S
5840: 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20  QLITE_PERM      
5850: 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72    */ "access per
5860: 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c  mission denied",
5870: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
5880: 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22 63  BORT       */ "c
5890: 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65  allback requeste
58a0: 64 20 71 75 65 72 79 20 61 62 6f 72 74 22 2c 0a  d query abort",.
58b0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55      /* SQLITE_BU
58c0: 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  SY        */ "da
58d0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
58e0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
58f0: 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20  _LOCKED      */ 
5900: 22 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  "database table 
5910: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
5920: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  /* SQLITE_NOMEM 
5930: 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66        */ "out of
5940: 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a   memory",.    /*
5950: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
5960: 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20      */ "attempt 
5970: 74 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f  to write a reado
5980: 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20  nly database",. 
5990: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54     /* SQLITE_INT
59a0: 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74  ERRUPT   */ "int
59b0: 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f  errupted",.    /
59c0: 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20  * SQLITE_IOERR  
59d0: 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f       */ "disk I/
59e0: 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  O error",.    /*
59f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
5a00: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
5a10: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
5a20: 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f  alformed",.    /
5a30: 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  * SQLITE_NOTFOUN
5a40: 44 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f  D    */ 0,.    /
5a50: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20  * SQLITE_FULL   
5a60: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
5a70: 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c  e or disk is ful
5a80: 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  l",.    /* SQLIT
5a90: 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f  E_CANTOPEN    */
5aa0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
5ab0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c   database file",
5ac0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  .    /* SQLITE_P
5ad0: 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 30 2c  ROTOCOL    */ 0,
5ae0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
5af0: 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74  MPTY       */ "t
5b00: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  able contains no
5b10: 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53   data",.    /* S
5b20: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20  QLITE_SCHEMA    
5b30: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73    */ "database s
5b40: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
5b50: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
5b60: 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f  E_TOOBIG      */
5b70: 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62   "string or blob
5b80: 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f   too big",.    /
5b90: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
5ba0: 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61  INT  */ "constra
5bb0: 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20  int failed",.   
5bc0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41   /* SQLITE_MISMA
5bd0: 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74  TCH    */ "datat
5be0: 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20  ype mismatch",. 
5bf0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
5c00: 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62  USE      */ "lib
5c10: 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c  rary routine cal
5c20: 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65  led out of seque
5c30: 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nce",.    /* SQL
5c40: 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20  ITE_NOLFS       
5c50: 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73  */ "large file s
5c60: 75 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c  upport is disabl
5c70: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
5c80: 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a  TE_AUTH        *
5c90: 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  / "authorization
5ca0: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
5cb0: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20   SQLITE_FORMAT  
5cc0: 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72      */ "auxiliar
5cd0: 79 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61  y database forma
5ce0: 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  t error",.    /*
5cf0: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20   SQLITE_RANGE   
5d00: 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20      */ "bind or 
5d10: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74  column index out
5d20: 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20   of range",.    
5d30: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  /* SQLITE_NOTADB
5d40: 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69        */ "file i
5d50: 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69  s encrypted or i
5d60: 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  s not a database
5d70: 22 2c 0a 20 20 7d 3b 0a 20 20 72 63 20 26 3d 20  ",.  };.  rc &= 
5d80: 30 78 66 66 3b 0a 20 20 69 66 28 20 41 4c 57 41  0xff;.  if( ALWA
5d90: 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c  YS(rc>=0) && rc<
5da0: 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 4d 73  (int)(sizeof(aMs
5db0: 67 29 2f 73 69 7a 65 6f 66 28 61 4d 73 67 5b 30  g)/sizeof(aMsg[0
5dc0: 5d 29 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21  ])) && aMsg[rc]!
5dd0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
5de0: 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 7d 65 6c   aMsg[rc];.  }el
5df0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22  se{.    return "
5e00: 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a  unknown error";.
5e10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
5e20: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
5e30: 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c  ents a busy call
5e40: 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73  back that sleeps
5e50: 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67   and tries.** ag
5e60: 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65  ain until a time
5e70: 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65 61  out value is rea
5e80: 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f  ched.  The timeo
5e90: 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  ut value is.** a
5ea0: 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
5eb0: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
5ec0: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74 68   passed in as th
5ed0: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
5ee0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
5ef0: 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  nt sqliteDefault
5f00: 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76  BusyCallback(. v
5f10: 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20  oid *ptr,       
5f20: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5f30: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
5f40: 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20  /. int count    
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5f60: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
5f70: 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75  able has been bu
5f80: 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c  sy */.){.#if SQL
5f90: 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28 64  ITE_OS_WIN || (d
5fa0: 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
5fb0: 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
5fc0: 45 50 29 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EP).  static con
5fd0: 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d  st u8 delays[] =
5fe0: 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c  .     { 1, 2, 5,
5ff0: 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c   10, 15, 20, 25,
6000: 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20   25,  25,  50,  
6010: 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61  50, 100 };.  sta
6020: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74  tic const u8 tot
6030: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
6040: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
6050: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
6060: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d   128, 178, 228 }
6070: 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41  ;.# define NDELA
6080: 59 20 28 73 69 7a 65 6f 66 28 64 65 6c 61 79 73  Y (sizeof(delays
6090: 29 2f 73 69 7a 65 6f 66 28 64 65 6c 61 79 73 5b  )/sizeof(delays[
60a0: 30 5d 29 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  0])).  sqlite3 *
60b0: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
60c0: 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f  ptr;.  int timeo
60d0: 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d  ut = db->busyTim
60e0: 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61  eout;.  int dela
60f0: 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73  y, prior;..  ass
6100: 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b  ert( count>=0 );
6110: 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e  .  if( count < N
6120: 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c  DELAY ){.    del
6130: 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e  ay = delays[coun
6140: 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20  t];.    prior = 
6150: 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20  totals[count];. 
6160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61   }else{.    dela
6170: 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41  y = delays[NDELA
6180: 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  Y-1];.    prior 
6190: 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d  = totals[NDELAY-
61a0: 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e  1] + delay*(coun
61b0: 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20  t-(NDELAY-1));. 
61c0: 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b   }.  if( prior +
61d0: 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74   delay > timeout
61e0: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
61f0: 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b  timeout - prior;
6200: 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d  .    if( delay<=
6210: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6220: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
6230: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c  ep(db->pVfs, del
6240: 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75  ay*1000);.  retu
6250: 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71  rn 1;.#else.  sq
6260: 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c  lite3 *db = (sql
6270: 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e  ite3 *)ptr;.  in
6280: 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71  t timeout = ((sq
6290: 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75  lite3 *)ptr)->bu
62a0: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28  syTimeout;.  if(
62b0: 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20   (count+1)*1000 
62c0: 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20  > timeout ){.   
62d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
62e0: 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28   sqlite3OsSleep(
62f0: 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30  db->pVfs, 100000
6300: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
6310: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
6320: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
6330: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a   busy handler..*
6340: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6350: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
6360: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61   an operation fa
6370: 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b  iled with a lock
6380: 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  ..** If this rou
6390: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tine returns non
63a0: 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
63b0: 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20  is retried.  If 
63c0: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c  it.** returns 0,
63d0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61   the operation a
63e0: 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51  borts with an SQ
63f0: 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e  LITE_BUSY error.
6400: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
6410: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
6420: 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29  (BusyHandler *p)
6430: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
6440: 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c  ( NEVER(p==0) ||
6450: 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20   p->xFunc==0 || 
6460: 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74  p->nBusy<0 ) ret
6470: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d  urn 0;.  rc = p-
6480: 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20  >xFunc(p->pArg, 
6490: 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28  p->nBusy);.  if(
64a0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d   rc==0 ){.    p-
64b0: 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d  >nBusy = -1;.  }
64c0: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  else{.    p->nBu
64d0: 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sy++;.  }.  retu
64e0: 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn rc; .}../*.**
64f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
6500: 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ts the busy call
6510: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
6520: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
6530: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
6540: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
6550: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
6560: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
6570: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
6580: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
6590: 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  b,.  int (*xBusy
65a0: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20  )(void*,int),.  
65b0: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20  void *pArg.){.  
65c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
65d0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
65e0: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
65f0: 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b  r.xFunc = xBusy;
6600: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
6610: 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a  er.pArg = pArg;.
6620: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
6630: 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 73  r.nBusy = 0;.  s
6640: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6650: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
6660: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6670: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
6680: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
6690: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a  SS_CALLBACK./*.*
66a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
66b0: 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73 73  ets the progress
66c0: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
66d0: 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   Sqlite database
66e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e   to the.** given
66f0: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
6700: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
6710: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  n argument. The 
6720: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
6730: 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76  k will.** be inv
6740: 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20  oked every nOps 
6750: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64  opcodes..*/.void
6760: 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
6770: 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c  s_handler(.  sql
6780: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
6790: 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78   nOps,.  int (*x
67a0: 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29  Progress)(void*)
67b0: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  , .  void *pArg.
67c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
67d0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
67e0: 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e  ex);.  if( nOps>
67f0: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72  0 ){.    db->xPr
6800: 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65  ogress = xProgre
6810: 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f  ss;.    db->nPro
6820: 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70 73 3b  gressOps = nOps;
6830: 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65  .    db->pProgre
6840: 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ssArg = pArg;.  
6850: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78  }else{.    db->x
6860: 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  Progress = 0;.  
6870: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
6880: 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ps = 0;.    db->
6890: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30  pProgressArg = 0
68a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
68b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
68c0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
68d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
68e0: 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61  utine installs a
68f0: 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68 61   default busy ha
6900: 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74 73  ndler that waits
6910: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63   for the.** spec
6920: 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ified number of 
6930: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66  milliseconds bef
6940: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e  ore returning 0.
6950: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
6960: 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c  busy_timeout(sql
6970: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73  ite3 *db, int ms
6980: 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b  ){.  if( ms>0 ){
6990: 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d  .    db->busyTim
69a0: 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20 73  eout = ms;.    s
69b0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
69c0: 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65  ler(db, sqliteDe
69d0: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
69e0: 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20  k, (void*)db);. 
69f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
6a00: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
6a10: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
6a20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6a30: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75  OK;.}../*.** Cau
6a40: 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f  se any pending o
6a50: 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70  peration to stop
6a60: 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74   at its earliest
6a70: 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f   opportunity..*/
6a80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e  .void sqlite3_in
6a90: 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20  terrupt(sqlite3 
6aa0: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e 69  *db){.  db->u1.i
6ab0: 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31  sInterrupted = 1
6ac0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
6ad0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61   function is exa
6ae0: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73  ctly the same as
6af0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
6b00: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65  function(), exce
6b10: 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  pt.** that it is
6b20: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20   designed to be 
6b30: 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e  called by intern
6b40: 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66  al code. The dif
6b50: 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68  ference is.** th
6b60: 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  at if a malloc()
6b70: 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65   fails in sqlite
6b80: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
6b90: 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  n(), an error co
6ba0: 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  de.** is returne
6bb0: 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63  d and the malloc
6bc0: 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61  Failed flag clea
6bd0: 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  red. .*/.int sql
6be0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a  ite3CreateFunc(.
6bf0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
6c00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
6c10: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
6c20: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
6c30: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72  c,.  void *pUser
6c40: 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78  Data,.  void (*x
6c50: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
6c60: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
6c70: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
6c80: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
6c90: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
6ca0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
6cb0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
6cc0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
6cd0: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 46 75  ontext*).){.  Fu
6ce0: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20  ncDef *p;.  int 
6cf0: 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74  nName;..  assert
6d00: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6d10: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
6d20: 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69  );.  if( zFuncti
6d30: 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20  onName==0 ||.   
6d40: 20 20 20 28 78 46 75 6e 63 20 26 26 20 28 78 46     (xFunc && (xF
6d50: 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20  inal || xStep)) 
6d60: 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46 75 6e  || .      (!xFun
6d70: 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20  c && (xFinal && 
6d80: 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20  !xStep)) ||.    
6d90: 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 21 78    (!xFunc && (!x
6da0: 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29  Final && xStep))
6db0: 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c   ||.      (nArg<
6dc0: 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54  -1 || nArg>SQLIT
6dd0: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
6de0: 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35  RG) ||.      (25
6df0: 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  5<(nName = sqlit
6e00: 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e  e3Strlen30( zFun
6e10: 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a  ctionName))) ){.
6e20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6e30: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
6e40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6e50: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20  OMIT_UTF16.  /* 
6e60: 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
6e70: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
6e80: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
6e90: 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
6ea0: 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
6eb0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
6ec0: 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
6ed0: 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
6ee0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
6ef0: 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
6f00: 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
6f10: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
6f20: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c    **.  ** If SQL
6f30: 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69  ITE_ANY is speci
6f40: 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20  fied, add three 
6f50: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
6f60: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  function.  ** to
6f70: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
6f80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d  .  */.  if( enc=
6f90: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b  =SQLITE_UTF16 ){
6fa0: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
6fb0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
6fc0: 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d   }else if( enc==
6fd0: 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20  SQLITE_ANY ){.  
6fe0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63    int rc;.    rc
6ff0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
7000: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
7010: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
7020: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
7030: 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78      pUserData, x
7040: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
7050: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nal);.    if( rc
7060: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7070: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7080: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
7090: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
70a0: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Arg, SQLITE_UTF1
70b0: 36 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70  6LE,.          p
70c0: 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c  UserData, xFunc,
70d0: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b   xStep, xFinal);
70e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
70f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7100: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
7110: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d  .    }.    enc =
7120: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b   SQLITE_UTF16BE;
7130: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63  .  }.#else.  enc
7140: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
7150: 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43  #endif.  .  /* C
7160: 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74  heck if an exist
7170: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ing function is 
7180: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
7190: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20   or deleted. If 
71a0: 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  so,.  ** and the
71b0: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d  re are active VM
71c0: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53  s, then return S
71d0: 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61  QLITE_BUSY. If a
71e0: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
71f0: 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64  s being overridd
7200: 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74  en/deleted but t
7210: 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69  here are no acti
7220: 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68  ve VMs, allow th
7230: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  e.  ** operation
7240: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74   to continue but
7250: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
7260: 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  precompiled stat
7270: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
7280: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
7290: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
72a0: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  tionName, nName,
72b0: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
72c0: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  0);.  if( p && p
72d0: 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20  ->iPrefEnc==enc 
72e0: 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67  && p->nArg==nArg
72f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
7300: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b  activeVdbeCnt ){
7310: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
7320: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  ror(db, SQLITE_B
7330: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75  USY, .        "u
7340: 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
7350: 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63  modify user-func
7360: 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69  tion due to acti
7370: 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
7380: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
7390: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
73a0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
73b0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
73c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
73d0: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
73e0: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
73f0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
7400: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
7410: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75  Function(db, zFu
7420: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d  nctionName, nNam
7430: 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63  e, nArg, (u8)enc
7440: 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70  , 1);.  assert(p
7450: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
7460: 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20  iled);.  if( !p 
7470: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7480: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
7490: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a    p->flags = 0;.
74a0: 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75    p->xFunc = xFu
74b0: 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d  nc;.  p->xStep =
74c0: 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69   xStep;.  p->xFi
74d0: 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b  nalize = xFinal;
74e0: 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20  .  p->pUserData 
74f0: 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70  = pUserData;.  p
7500: 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41  ->nArg = (u16)nA
7510: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rg;.  return SQL
7520: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7530: 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72   Create new user
7540: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69   functions..*/.i
7550: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
7560: 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  e_function(.  sq
7570: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
7580: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69  st char *zFuncti
7590: 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  onName,.  int nA
75a0: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
75b0: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
75c0: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
75d0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
75e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
75f0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
7600: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
7610: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
7620: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
7630: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
7640: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
7650: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
7660: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
7670: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 63  db->mutex);.  rc
7680: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
7690: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
76a0: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 65 6e  onName, nArg, en
76b0: 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  c, p, xFunc, xSt
76c0: 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 72  ep, xFinal);.  r
76d0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
76e0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
76f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7700: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
7710: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
7720: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7730: 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69  T_UTF16.int sqli
7740: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
7750: 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
7760: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f   *db,.  const vo
7770: 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  id *zFunctionNam
7780: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
7790: 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20   int eTextRep,. 
77a0: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
77b0: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
77c0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
77d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
77e0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
77f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7800: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
7810: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
7820: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
7830: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
7840: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
7850: 7a 46 75 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65  zFunc8;.  sqlite
7860: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
7870: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
7880: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
7890: 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63  ailed );.  zFunc
78a0: 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
78b0: 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  to8(db, zFunctio
78c0: 6e 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 72 63  nName, -1);.  rc
78d0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
78e0: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c  Func(db, zFunc8,
78f0: 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c   nArg, eTextRep,
7900: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
7910: 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 73 71 6c  , xFinal);.  sql
7920: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
7930: 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73  Func8);.  rc = s
7940: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
7950: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
7960: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
7970: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
7980: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
7990: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
79a0: 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68  hat a function h
79b0: 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64  as been overload
79c0: 65 64 20 62 79 20 61 20 76 69 72 74 75 61 6c 20  ed by a virtual 
79d0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
79e0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72  the function alr
79f0: 65 61 64 79 20 65 78 69 73 74 73 20 61 73 20 61  eady exists as a
7a00: 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20   regular global 
7a10: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a  function, then.*
7a20: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
7a30: 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74  s a no-op.  If t
7a40: 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
7a50: 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
7a60: 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77   create.** a new
7a70: 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73   one that always
7a80: 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69   throws a run-ti
7a90: 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a  me error.  .**.*
7aa0: 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74  * When virtual t
7ab0: 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20  ables intend to 
7ac0: 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c  provide an overl
7ad0: 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20  oaded function, 
7ae0: 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63  they.** should c
7af0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
7b00: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
7b10: 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  e global functio
7b20: 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67  n exists..** A g
7b30: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d  lobal function m
7b40: 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64  ust exist in ord
7b50: 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f  er for name reso
7b60: 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a  lution to work.*
7b70: 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69  * properly..*/.i
7b80: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c  nt sqlite3_overl
7b90: 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  oad_function(.  
7ba0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
7bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
7bc0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a  ,.  int nArg.){.
7bd0: 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71    int nName = sq
7be0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
7bf0: 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ame);.  int rc;.
7c00: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7c10: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
7c20: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
7c30: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
7c40: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  zName, nName, nA
7c50: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
7c60: 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71   0)==0 ){.    sq
7c70: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
7c80: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
7c90: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cb0: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
7cc0: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
7cd0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  , 0);.  }.  rc =
7ce0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
7cf0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
7d00: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7d10: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
7d20: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7d30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7d40: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
7d50: 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61  * Register a tra
7d60: 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ce function.  Th
7d70: 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
7d80: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
7d90: 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69  tered trace.** i
7da0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
7db0: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65  .** A NULL trace
7dc0: 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
7dd0: 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20  that no tracing 
7de0: 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
7df0: 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63  non-NULL.** trac
7e00: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
7e10: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
7e20: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
7e30: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
7e40: 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65  h.** SQL stateme
7e50: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  nt..*/.void *sql
7e60: 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74  ite3_trace(sqlit
7e70: 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78  e3 *db, void (*x
7e80: 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  Trace)(void*,con
7e90: 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20  st char*), void 
7ea0: 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a  *pArg){.  void *
7eb0: 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pOld;.  sqlite3_
7ec0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
7ed0: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
7ee0: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a   db->pTraceArg;.
7ef0: 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78    db->xTrace = x
7f00: 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72  Trace;.  db->pTr
7f10: 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  aceArg = pArg;. 
7f20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
7f30: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
7f40: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
7f50: 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  }./*.** Register
7f60: 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74   a profile funct
7f70: 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66  ion.  The pArg f
7f80: 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
7f90: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a  ly registered .*
7fa0: 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  * profile functi
7fb0: 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  on is returned. 
7fc0: 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70   .**.** A NULL p
7fd0: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  rofile function 
7fe0: 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72  means that no pr
7ff0: 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75  ofiling is execu
8000: 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c  tes.  A non-NULL
8010: 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61  .** profile is a
8020: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
8030: 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69  nction that is i
8040: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
8050: 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65  nclusion of.** e
8060: 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
8070: 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a  t that is run..*
8080: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
8090: 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74  profile(.  sqlit
80a0: 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28  e3 *db,.  void (
80b0: 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a  *xProfile)(void*
80c0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c  ,const char*,sql
80d0: 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76  ite_uint64),.  v
80e0: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76  oid *pArg.){.  v
80f0: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
8100: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
8110: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
8120: 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69  Old = db->pProfi
8130: 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  leArg;.  db->xPr
8140: 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65  ofile = xProfile
8150: 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  ;.  db->pProfile
8160: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
8170: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
8180: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
8190: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23  return pOld;.}.#
81a0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
81b0: 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  OMIT_TRACE */../
81c0: 2a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c  *** EXPERIMENTAL
81d0: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73   ***.**.** Regis
81e0: 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74  ter a function t
81f0: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65  o be invoked whe
8200: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
8210: 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20  comments..** If 
8220: 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63  the invoked func
8230: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tion returns non
8240: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
8250: 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61  commit becomes a
8260: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f  .** rollback..*/
8270: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63  .void *sqlite3_c
8280: 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71  ommit_hook(.  sq
8290: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
82a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
82b0: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
82c0: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
82d0: 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b   int (*xCallback
82e0: 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75  )(void*),  /* Fu
82f0: 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65  nction to invoke
8300: 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20   on each commit 
8310: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8330: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
8340: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
8350: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20  .  void *pOld;. 
8360: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
8370: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
8380: 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43  .  pOld = db->pC
8390: 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e  ommitArg;.  db->
83a0: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
83b0: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
83c0: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20  b->pCommitArg = 
83d0: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
83e0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
83f0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
8400: 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pOld;.}../*.** 
8410: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
8420: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
8430: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f  d each time a ro
8440: 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  w is updated,.**
8450: 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c   inserted or del
8460: 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  eted using this 
8470: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8480: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
8490: 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
84a0: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
84b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
84c0: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
84d0: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
84e0: 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  se */.  void (*x
84f0: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c  Callback)(void*,
8500: 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  int,char const *
8510: 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71  ,char const *,sq
8520: 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76  lite_int64),.  v
8530: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
8540: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
8550: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
8560: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
8570: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
8580: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
8590: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
85a0: 74 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41  t = db->pUpdateA
85b0: 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74  rg;.  db->xUpdat
85c0: 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  eCallback = xCal
85d0: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70  lback;.  db->pUp
85e0: 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  dateArg = pArg;.
85f0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8600: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
8610: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
8620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
8630: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
8640: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
8650: 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
8660: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a  ion is rolled.**
8670: 20 62 61 63 6b 20 62 79 20 74 68 69 73 20 64 61   back by this da
8680: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8690: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
86a0: 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  te3_rollback_hoo
86b0: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
86c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
86d0: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
86e0: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
86f0: 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  se */.  void (*x
8700: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29  Callback)(void*)
8710: 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75  , /* Callback fu
8720: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
8730: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
8740: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
8750: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
8760: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
8770: 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRet;.  sqlite3_
8780: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
8790: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
87a0: 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
87b0: 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61  g;.  db->xRollba
87c0: 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  ckCallback = xCa
87d0: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52  llback;.  db->pR
87e0: 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72  ollbackArg = pAr
87f0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
8800: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
8810: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
8820: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  et;.}../*.** Thi
8830: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
8840: 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d  ns true if main-
8850: 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65  memory should be
8860: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
8870: 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20  .** a temporary 
8880: 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65  file for transie
8890: 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20 61  nt pager files a
88a0: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  nd statement jou
88b0: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61  rnals..** The va
88c0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65 70  lue returned dep
88d0: 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
88e0: 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74  e of db->temp_st
88f0: 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20  ore (runtime.** 
8900: 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74  parameter) and t
8910: 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  he compile time 
8920: 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f  value of SQLITE_
8930: 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a  TEMP_STORE. The.
8940: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  ** following tab
8950: 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
8960: 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65   relationship be
8970: 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20  tween these two 
8980: 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68  values.** and th
8990: 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  is functions ret
89a0: 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  urn value..**.**
89b0: 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53     SQLITE_TEMP_S
89c0: 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d  TORE     db->tem
89d0: 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61  p_store     Loca
89e0: 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72  tion of temporar
89f0: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  y database.**   
8a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a10: 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
8a20: 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
8a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a40: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a60: 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
8a70: 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
8a80: 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
8a90: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
8aa0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
8ab0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
8ac0: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
8ad0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
8ae0: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
8b00: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
8b10: 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
8b40: 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
8b50: 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   0).**   2      
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
8b90: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20  urn 0).**   2   
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
8bc0: 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
8bd0: 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32  return 1).**   2
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
8c00: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
8c10: 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
8c20: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
8c30: 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20          any     
8c40: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
8c50: 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
8c60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65  */.int sqlite3Te
8c70: 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74  mpInMemory(const
8c80: 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23   sqlite3 *db){.#
8c90: 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
8ca0: 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e  TORE==1.  return
8cb0: 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72   ( db->temp_stor
8cc0: 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23  e==2 );.#endif.#
8cd0: 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
8ce0: 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e  TORE==2.  return
8cf0: 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72   ( db->temp_stor
8d00: 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23  e!=1 );.#endif.#
8d10: 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
8d20: 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75 72 6e  TORE==3.  return
8d30: 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   1;.#endif.#if S
8d40: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
8d50: 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d  <1 || SQLITE_TEM
8d60: 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65 74 75  P_STORE>3.  retu
8d70: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
8d80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8d90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
8da0: 63 72 65 61 74 65 20 61 20 63 6f 6e 6e 65 63 74  create a connect
8db0: 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73  ion to a databas
8dc0: 65 20 42 54 72 65 65 0a 2a 2a 20 64 72 69 76 65  e BTree.** drive
8dd0: 72 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  r.  If zFilename
8de0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
8df0: 61 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 61  a file, then tha
8e00: 74 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6f 70 65  t file is.** ope
8e10: 6e 65 64 20 61 6e 64 20 75 73 65 64 2e 20 20 49  ned and used.  I
8e20: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  f zFilename is t
8e30: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
8e40: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 0a 2a 2a  memory:" then.**
8e50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
8e60: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
8e70: 79 20 28 61 6e 64 20 69 73 20 74 68 75 73 20 66  y (and is thus f
8e80: 6f 72 67 6f 74 74 65 6e 20 61 73 20 73 6f 6f 6e  orgotten as soon
8e90: 20 61 73 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65   as.** the conne
8ea0: 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e  ction is closed.
8eb0: 29 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  )  If zFilename 
8ec0: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65  is NULL then the
8ed0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20   database.** is 
8ee0: 61 20 22 76 69 72 74 75 61 6c 22 20 64 61 74 61  a "virtual" data
8ef0: 62 61 73 65 20 66 6f 72 20 74 72 61 6e 73 69 65  base for transie
8f00: 6e 74 20 75 73 65 20 6f 6e 6c 79 20 61 6e 64 20  nt use only and 
8f10: 69 73 20 64 65 6c 65 74 65 64 20 61 73 0a 2a 2a  is deleted as.**
8f20: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 63 6f 6e   soon as the con
8f30: 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  nection is close
8f40: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 69 72 74 75  d..**.** A virtu
8f50: 61 6c 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  al database can 
8f60: 62 65 20 65 69 74 68 65 72 20 61 20 64 69 73 6b  be either a disk
8f70: 20 66 69 6c 65 20 28 74 68 61 74 20 69 73 20 61   file (that is a
8f80: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20  utomatically.** 
8f90: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
8fa0: 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 29   file is closed)
8fb0: 20 6f 72 20 69 74 20 61 6e 20 62 65 20 68 65 6c   or it an be hel
8fc0: 64 20 65 6e 74 69 72 65 6c 79 20 69 6e 20 6d 65  d entirely in me
8fd0: 6d 6f 72 79 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  mory..** The sql
8fe0: 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
8ff0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  () function is u
9000: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
9010: 20 77 68 69 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73   which..*/.int s
9020: 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f  qlite3BtreeFacto
9030: 72 79 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ry(.  sqlite3 *d
9040: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
9050: 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65  /* Main database
9060: 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 75   when opening au
9070: 78 20 6f 74 68 65 72 77 69 73 65 20 30 20 2a 2f  x otherwise 0 */
9080: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9090: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
90a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
90b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
90c0: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
90d0: 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 4a 6f 75 72  /.  int omitJour
90e0: 6e 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nal,          /*
90f0: 20 69 66 20 54 52 55 45 20 74 68 65 6e 20 64 6f   if TRUE then do
9100: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 20 74 68 69   not journal thi
9110: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
9120: 6e 43 61 63 68 65 2c 20 20 20 20 20 20 20 20 20  nCache,         
9130: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 61 6e        /* How man
9140: 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
9150: 61 67 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 69  age cache */.  i
9160: 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20  nt vfsFlags,    
9170: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
9180: 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
9190: 20 74 6f 20 76 66 73 4f 70 65 6e 20 2a 2f 0a 20   to vfsOpen */. 
91a0: 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
91b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
91c0: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
91d0: 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
91e0: 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  n here */.){.  i
91f0: 6e 74 20 62 74 46 6c 61 67 73 20 3d 20 30 3b 0a  nt btFlags = 0;.
9200: 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 61    int rc;.  .  a
9210: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9220: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
9230: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
9240: 28 20 70 70 42 74 72 65 65 20 21 3d 20 30 29 3b  ( ppBtree != 0);
9250: 0a 20 20 69 66 28 20 6f 6d 69 74 4a 6f 75 72 6e  .  if( omitJourn
9260: 61 6c 20 29 7b 0a 20 20 20 20 62 74 46 6c 61 67  al ){.    btFlag
9270: 73 20 7c 3d 20 42 54 52 45 45 5f 4f 4d 49 54 5f  s |= BTREE_OMIT_
9280: 4a 4f 55 52 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69  JOURNAL;.  }.  i
9290: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
92a0: 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b  QLITE_NoReadlock
92b0: 20 29 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20   ){.    btFlags 
92c0: 7c 3d 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44  |= BTREE_NO_READ
92d0: 4c 4f 43 4b 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  LOCK;.  }.#ifnde
92e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
92f0: 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 7a 46 69  MORYDB.  if( zFi
9300: 6c 65 6e 61 6d 65 3d 3d 30 20 26 26 20 73 71 6c  lename==0 && sql
9310: 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
9320: 28 64 62 29 20 29 7b 0a 20 20 20 20 7a 46 69 6c  (db) ){.    zFil
9330: 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79  ename = ":memory
9340: 3a 22 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  :";.  }.#endif..
9350: 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
9360: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
9370: 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 7a 46  IN_DB)!=0 && (zF
9380: 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a  ilename==0 || *z
9390: 46 69 6c 65 6e 61 6d 65 3d 3d 30 29 20 29 7b 0a  Filename==0) ){.
93a0: 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28      vfsFlags = (
93b0: 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49  vfsFlags & ~SQLI
93c0: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
93d0: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54   | SQLITE_OPEN_T
93e0: 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 72 63  EMP_DB;.  }.  rc
93f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
9400: 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  pen(zFilename, (
9410: 73 71 6c 69 74 65 33 20 2a 29 64 62 2c 20 70 70  sqlite3 *)db, pp
9420: 42 74 72 65 65 2c 20 62 74 46 6c 61 67 73 2c 20  Btree, btFlags, 
9430: 76 66 73 46 6c 61 67 73 29 3b 0a 0a 20 20 2f 2a  vfsFlags);..  /*
9440: 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
9450: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
9460: 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
9470: 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
9480: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 65 66   to the.  ** def
9490: 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
94a0: 70 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 20  pt, if the call 
94b0: 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 72  to BtreeOpen() r
94c0: 65 74 75 72 6e 65 64 20 61 20 68 61 6e 64 6c 65  eturned a handle
94d0: 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 61 6e  .  ** open on an
94e0: 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
94f0: 20 70 61 67 65 72 2d 63 61 63 68 65 2c 20 64 6f   pager-cache, do
9500: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
9510: 70 61 67 65 72 2d 63 61 63 68 65 20 0a 20 20 2a  pager-cache .  *
9520: 2a 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69  * size..  */.  i
9530: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9540: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 74   && 0==sqlite3Bt
9550: 72 65 65 53 63 68 65 6d 61 28 2a 70 70 42 74 72  reeSchema(*ppBtr
9560: 65 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  ee, 0, 0) ){.   
9570: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
9580: 43 61 63 68 65 53 69 7a 65 28 2a 70 70 42 74 72  CacheSize(*ppBtr
9590: 65 65 2c 20 6e 43 61 63 68 65 29 3b 0a 20 20 7d  ee, nCache);.  }
95a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
95b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
95c0: 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
95d0: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
95e0: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
95f0: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
9600: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
9610: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
9620: 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
9630: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
9640: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
9650: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
9660: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
9670: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66  NOMEM);.  }.  if
9680: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
9690: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
96a0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
96b0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
96c0: 4c 49 54 45 5f 4d 49 53 55 53 45 29 3b 0a 20 20  LITE_MISUSE);.  
96d0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
96e0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
96f0: 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
9700: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
9710: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
9720: 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
9730: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9740: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
9750: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62  e3_value_text(db
9760: 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73  ->pErr);.    ass
9770: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
9780: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
9790: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
97a0: 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
97b0: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a  r(db->errCode);.
97c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
97d0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
97e0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
97f0: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64  turn z;.}..#ifnd
9800: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
9810: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TF16./*.** Retur
9820: 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  n UTF-16 encoded
9830: 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
9840: 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
9850: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
9860: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f  .** error..*/.co
9870: 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
9880: 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74  3_errmsg16(sqlit
9890: 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69  e3 *db){.  stati
98a0: 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f  c const u16 outO
98b0: 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  fMem[] = {.    '
98c0: 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20  o', 'u', 't', ' 
98d0: 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27  ', 'o', 'f', ' '
98e0: 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c  , 'm', 'e', 'm',
98f0: 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20   'o', 'r', 'y', 
9900: 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  0.  };.  static 
9910: 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65  const u16 misuse
9920: 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20  [] = {.    'l', 
9930: 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27  'i', 'b', 'r', '
9940: 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20  a', 'r', 'y', ' 
9950: 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27  ', .    'r', 'o'
9960: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c  , 'u', 't', 'i',
9970: 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20   'n', 'e', ' ', 
9980: 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27  .    'c', 'a', '
9990: 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64  l', 'l', 'e', 'd
99a0: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27  ', ' ', .    'o'
99b0: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c  , 'u', 't', ' ',
99c0: 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20   .    'o', 'f', 
99d0: 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27  ' ', .    's', '
99e0: 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65  e', 'q', 'u', 'e
99f0: 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27  ', 'n', 'c', 'e'
9a00: 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73  , 0.  };..  cons
9a10: 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28  t void *z;.  if(
9a20: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
9a30: 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66  rn (void *)outOf
9a40: 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  Mem;.  }.  if( !
9a50: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
9a60: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
9a70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
9a80: 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d  id *)misuse;.  }
9a90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9aa0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
9ab0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
9ac0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9ad0: 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74   z = (void *)out
9ae0: 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OfMem;.  }else{.
9af0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
9b00: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
9b10: 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  >pErr);.    if( 
9b20: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
9b30: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
9b40: 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73  (db->pErr, -1, s
9b50: 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
9b60: 3e 65 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20  >errCode),.     
9b70: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
9b80: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
9b90: 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  );.      z = sql
9ba0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
9bb0: 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
9bc0: 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c   }.    /* A mall
9bd0: 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61  oc() may have fa
9be0: 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  iled within the 
9bf0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
9c00: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20  value_text16(). 
9c10: 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20     ** above. If 
9c20: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
9c30: 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d  , then the db->m
9c40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
9c50: 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
9c60: 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
9c70: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f  re returning. Do
9c80: 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20   this directly, 
9c90: 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20  instead of via. 
9ca0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69     ** sqlite3Api
9cb0: 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64  Exit(), to avoid
9cc0: 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74   setting the dat
9cd0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72  abase handle err
9ce0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20  or message..    
9cf0: 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  */.    db->mallo
9d00: 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d  cFailed = 0;.  }
9d10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9d20: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9d30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
9d40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9d50: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
9d60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
9d70: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72  e most recent er
9d80: 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ror code generat
9d90: 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20  ed by an SQLite 
9da0: 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c  routine. If NULL
9db0: 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f   is.** passed to
9dc0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
9dd0: 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c  we assume a mall
9de0: 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69  oc() failed duri
9df0: 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ng sqlite3_open(
9e00: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
9e10: 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  3_errcode(sqlite
9e20: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
9e30: 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
9e40: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
9e50: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
9e60: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
9e70: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
9e80: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
9e90: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
9ea0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9eb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
9ec0: 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72  errCode & db->er
9ed0: 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rMask;.}.int sql
9ee0: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
9ef0: 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
9f00: 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
9f10: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
9f20: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
9f30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9f40: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
9f50: 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
9f60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9f70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9f80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
9f90: 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
9fa0: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  ode;.}../*.** Cr
9fb0: 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61  eate a new colla
9fc0: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ting function fo
9fd0: 72 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e  r database "db".
9fe0: 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e    The name is zN
9ff0: 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65  ame.** and the e
a000: 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a  ncoding is enc..
a010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
a020: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eateCollation(. 
a030: 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20   sqlite3* db,.  
a040: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
a050: 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20  e, .  u8 enc,.  
a060: 75 38 20 63 6f 6c 6c 54 79 70 65 2c 0a 20 20 76  u8 collType,.  v
a070: 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
a080: 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
a090: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
a0a0: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
a0b0: 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
a0c0: 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f  )(void*).){.  Co
a0d0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
a0e0: 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74 20  int enc2;.  int 
a0f0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
a100: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
a110: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
a120: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
a130: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
a140: 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
a150: 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
a160: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
a170: 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
a180: 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
a190: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
a1a0: 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
a1b0: 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
a1c0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
a1d0: 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
a1e0: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
a1f0: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
a200: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20  ly..  */.  enc2 
a210: 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73  = enc;.  testcas
a220: 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
a230: 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63  UTF16 );.  testc
a240: 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
a250: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
a260: 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53  );.  if( enc2==S
a270: 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65  QLITE_UTF16 || e
a280: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
a290: 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20  6_ALIGNED ){.   
a2a0: 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55   enc2 = SQLITE_U
a2b0: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a  TF16NATIVE;.  }.
a2c0: 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54    if( enc2<SQLIT
a2d0: 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53  E_UTF8 || enc2>S
a2e0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b  QLITE_UTF16BE ){
a2f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a300: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a  TE_MISUSE;.  }..
a310: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
a320: 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76  is call is remov
a330: 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67  ing or replacing
a340: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c   an existing col
a350: 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71  lation .  ** seq
a360: 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e  uence. If so, an
a370: 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
a380: 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62  ve VMs, return b
a390: 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20  usy. If there.  
a3a0: 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
a3b0: 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65   VMs, invalidate
a3c0: 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65   any pre-compile
a3d0: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
a3e0: 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  */.  pColl = sql
a3f0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
a400: 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
a410: 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ame, 0);.  if( p
a420: 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78  Coll && pColl->x
a430: 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Cmp ){.    if( d
a440: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
a450: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a460: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
a470: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
a480: 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65   "unable to dele
a490: 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74  te/modify collat
a4a0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65  ion sequence due
a4b0: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
a4c0: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72  ments");.      r
a4d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
a4e0: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  Y;.    }.    sql
a4f0: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
a500: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
a510: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c  ;..    /* If col
a520: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
a530: 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65  pColl was create
a540: 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20  d directly by a 
a550: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
a560: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
a570: 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74  llation, and not
a580: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79   generated by sy
a590: 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20  nthCollSeq(),.  
a5a0: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f    ** then any co
a5b0: 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e  pies made by syn
a5c0: 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64  thCollSeq() need
a5d0: 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74   to be invalidat
a5e0: 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c  ed..    ** Also,
a5f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72   collation destr
a600: 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e  uctor - CollSeq.
a610: 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f  xDel() - functio
a620: 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  n may need.    *
a630: 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a  * to be called..
a640: 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20      */ .    if( 
a650: 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53  (pColl->enc & ~S
a660: 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
a670: 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20  NED)==enc2 ){.  
a680: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f      CollSeq *aCo
a690: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ll = sqlite3Hash
a6a0: 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  Find(&db->aCollS
a6b0: 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  eq, zName, nName
a6c0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
a6d0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
a6e0: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
a6f0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26    CollSeq *p = &
a700: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
a710: 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43    if( p->enc==pC
a720: 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
a730: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65        if( p->xDe
a740: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
a750: 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65   p->xDel(p->pUse
a760: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
a770: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d            p->xCm
a780: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  p = 0;.        }
a790: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a7a0: 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   }..  pColl = sq
a7b0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
a7c0: 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
a7d0: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  Name, 1);.  if( 
a7e0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f  pColl ){.    pCo
a7f0: 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70  ll->xCmp = xComp
a800: 61 72 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e  are;.    pColl->
a810: 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20  pUser = pCtx;.  
a820: 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20    pColl->xDel = 
a830: 78 44 65 6c 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d  xDel;.    pColl-
a840: 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32  >enc = (u8)(enc2
a850: 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45   | (enc & SQLITE
a860: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29  _UTF16_ALIGNED))
a870: 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 74 79 70  ;.    pColl->typ
a880: 65 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a 20 20  e = collType;.  
a890: 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
a8a0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
a8b0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
a8c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
a8d0: 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66  * This array def
a8e0: 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20  ines hard upper 
a8f0: 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20  bounds on limit 
a900: 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20  values.  The.** 
a910: 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74  initializer must
a920: 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63   be kept in sync
a930: 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
a940: 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66  _LIMIT_*.** #def
a950: 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e  ines in sqlite3.
a960: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  h..*/.static con
a970: 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69  st int aHardLimi
a980: 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45  t[] = {.  SQLITE
a990: 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _MAX_LENGTH,.  S
a9a0: 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
a9b0: 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
a9c0: 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c  AX_COLUMN,.  SQL
a9d0: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
a9e0: 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
a9f0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
aa00: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
aa10: 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45  DBE_OP,.  SQLITE
aa20: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
aa30: 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  G,.  SQLITE_MAX_
aa40: 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49  ATTACHED,.  SQLI
aa50: 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
aa60: 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  ERN_LENGTH,.  SQ
aa70: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
aa80: 45 5f 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49  E_NUMBER,.  SQLI
aa90: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
aaa0: 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  EPTH,.};../*.** 
aab0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61  Make sure the ha
aac0: 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65  rd limits are se
aad0: 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20  t to reasonable 
aae0: 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51  values.*/.#if SQ
aaf0: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c  LITE_MAX_LENGTH<
ab00: 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
ab10: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75  TE_MAX_LENGTH mu
ab20: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
ab30: 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
ab40: 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
ab50: 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
ab60: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
ab70: 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
ab80: 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
ab90: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
aba0: 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49  _SQL_LENGTH>SQLI
abb0: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20  TE_MAX_LENGTH.# 
abc0: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
abd0: 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
abe0: 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20   not be greater 
abf0: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f  than SQLITE_MAX_
ac00: 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69  LENGTH.#endif.#i
ac10: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  f SQLITE_MAX_COM
ac20: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23  POUND_SELECT<2.#
ac30: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
ac40: 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
ac50: 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  T must be at lea
ac60: 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 2.#endif.#if 
ac70: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
ac80: 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51  OP<40.# error SQ
ac90: 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
aca0: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
acb0: 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  t 40.#endif.#if 
acc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
acd0: 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c  ION_ARG<0 || SQL
ace0: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
acf0: 5f 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f  _ARG>1000.# erro
ad00: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  r SQLITE_MAX_FUN
ad10: 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62  CTION_ARG must b
ad20: 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
ad30: 31 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  1000.#endif.#if 
ad40: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
ad50: 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  HED<0 || SQLITE_
ad60: 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 33 30 0a  MAX_ATTACHED>30.
ad70: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
ad80: 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74  AX_ATTACHED must
ad90: 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
ada0: 64 20 33 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  d 30.#endif.#if 
adb0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
adc0: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31  PATTERN_LENGTH<1
add0: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
ade0: 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
adf0: 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
ae00: 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
ae10: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
ae20: 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20  _COLUMN>32767.# 
ae30: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
ae40: 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74  _COLUMN must not
ae50: 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65   exceed 32767.#e
ae60: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
ae70: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
ae80: 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
ae90: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
aea0: 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  EPTH must be at 
aeb0: 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a  least 1.#endif..
aec0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
aed0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d  e value of a lim
aee0: 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20  it.  Report the 
aef0: 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66  old value..** If
af00: 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69   an invalid limi
af10: 74 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c  t index is suppl
af20: 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a  ied, report -1..
af30: 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
af40: 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70  es but still rep
af50: 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
af60: 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
af70: 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
af80: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c  e..**.** A new l
af90: 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20  ower limit does 
afa0: 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74  not shrink exist
afb0: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a  ing constructs..
afc0: 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65  ** It merely pre
afd0: 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72  vents new constr
afe0: 75 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64  ucts that exceed
aff0: 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72   the limit.** fr
b000: 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69  om forming..*/.i
b010: 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  nt sqlite3_limit
b020: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
b030: 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e  t limitId, int n
b040: 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20  ewLimit){.  int 
b050: 6f 6c 64 4c 69 6d 69 74 3b 0a 20 20 69 66 28 20  oldLimit;.  if( 
b060: 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d  limitId<0 || lim
b070: 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c  itId>=SQLITE_N_L
b080: 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75  IMIT ){.    retu
b090: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64  rn -1;.  }.  old
b0a0: 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d  Limit = db->aLim
b0b0: 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69  it[limitId];.  i
b0c0: 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29  f( newLimit>=0 )
b0d0: 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  {.    if( newLim
b0e0: 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
b0f0: 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
b100: 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
b110: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a  Limit[limitId];.
b120: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c      }.    db->aL
b130: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20  imit[limitId] = 
b140: 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  newLimit;.  }.  
b150: 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b  return oldLimit;
b160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
b170: 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
b180: 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20  work of opening 
b190: 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65  a database on be
b1a0: 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  half of.** sqlit
b1b0: 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71  e3_open() and sq
b1c0: 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20  lite3_open16(). 
b1d0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
b1e0: 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65  ename "zFilename
b1f0: 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20  "  .** is UTF-8 
b200: 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  encoded..*/.stat
b210: 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62  ic int openDatab
b220: 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ase(.  const cha
b230: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a  r *zFilename, /*
b240: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
b250: 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  me UTF-8 encoded
b260: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
b270: 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20  ppDb,        /* 
b280: 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61  OUT: Returned da
b290: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
b2a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 6c 61 67  .  unsigned flag
b2b0: 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  s,        /* Ope
b2c0: 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a  rational flags *
b2d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
b2e0: 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61  zVfs       /* Na
b2f0: 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
b300: 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c   use */.){.  sql
b310: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
b320: 72 63 3b 0a 20 20 69 6e 74 20 69 73 54 68 72 65  rc;.  int isThre
b330: 61 64 73 61 66 65 3b 0a 0a 20 20 2a 70 70 44 62  adsafe;..  *ppDb
b340: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
b350: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
b360: 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
b370: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
b380: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b390: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  n rc;.#endif..  
b3a0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
b3b0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
b3c0: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54  ex==0 ){.    isT
b3d0: 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20  hreadsafe = 0;. 
b3e0: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
b3f0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e   & SQLITE_OPEN_N
b400: 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73  OMUTEX ){.    is
b410: 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
b420: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
b430: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
b440: 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20  FULLMUTEX ){.   
b450: 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
b460: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
b470: 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 73  isThreadsafe = s
b480: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
b490: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20  ig.bFullMutex;. 
b4a0: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26   }.  if( flags &
b4b0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
b4c0: 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20  VATECACHE ){.   
b4d0: 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
b4e0: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
b4f0: 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  HE;.  }else if( 
b500: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
b510: 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45  fig.sharedCacheE
b520: 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c  nabled ){.    fl
b530: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
b540: 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  EN_SHAREDCACHE;.
b550: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
b560: 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72   harmful bits fr
b570: 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  om the flags par
b580: 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  ameter.  **.  **
b590: 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   The SQLITE_OPEN
b5a0: 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c  _NOMUTEX and SQL
b5b0: 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
b5c0: 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20  EX flags were.  
b5d0: 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e  ** dealt with in
b5e0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
b5f0: 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64  de block.  Besid
b600: 65 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e  es these, the on
b610: 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e  ly.  ** valid in
b620: 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71  put flags for sq
b630: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20  lite3_open_v2() 
b640: 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  are SQLITE_OPEN_
b650: 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53  READONLY,.  ** S
b660: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
b670: 52 49 54 45 2c 20 61 6e 64 20 53 51 4c 49 54 45  RITE, and SQLITE
b680: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2e 20 20 53  _OPEN_CREATE.  S
b690: 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a  ilently mask.  *
b6a0: 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20  * off all other 
b6b0: 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c  flags..  */.  fl
b6c0: 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54  ags &=  ~( SQLIT
b6d0: 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
b6e0: 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
b6f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
b700: 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
b720: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
b730: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
b740: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
b750: 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  MP_DB | .       
b760: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
b770: 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
b780: 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
b790: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
b7a0: 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  AIN_JOURNAL | . 
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
b7c0: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
b7d0: 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
b7e0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
b7f0: 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
b800: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
b810: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
b820: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20  STER_JOURNAL |. 
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
b840: 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
b850: 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
b860: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46     SQLITE_OPEN_F
b870: 55 4c 4c 4d 55 54 45 58 0a 20 20 20 20 20 20 20  ULLMUTEX.       
b880: 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41        );..  /* A
b890: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
b8a0: 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
b8b0: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69  e */.  db = sqli
b8c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
b8d0: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29  izeof(sqlite3) )
b8e0: 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20  ;.  if( db==0 ) 
b8f0: 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
b900: 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73  .  if( isThreads
b910: 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  afe ){.    db->m
b920: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
b930: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
b940: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29  MUTEX_RECURSIVE)
b950: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75  ;.    if( db->mu
b960: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
b970: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
b980: 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a  ;.      db = 0;.
b990: 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64        goto opend
b9a0: 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  b_out;.    }.  }
b9b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b9c0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
b9d0: 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
b9e0: 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e   = 0xff;.  db->n
b9f0: 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61  Db = 2;.  db->ma
ba00: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
ba10: 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61  IC_BUSY;.  db->a
ba20: 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
ba30: 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ic;..  assert( s
ba40: 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
ba50: 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c  )==sizeof(aHardL
ba60: 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70  imit) );.  memcp
ba70: 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48  y(db->aLimit, aH
ba80: 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66  ardLimit, sizeof
ba90: 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20  (db->aLimit));. 
baa0: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
bab0: 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41  = 1;.  db->nextA
bac0: 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64  utovac = -1;.  d
bad0: 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20  b->nextPagesize 
bae0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  = 0;.  db->flags
baf0: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
bb00: 43 6f 6c 4e 61 6d 65 73 0a 23 69 66 20 53 51 4c  ColNames.#if SQL
bb10: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
bb20: 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20  _FORMAT<4.      
bb30: 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
bb40: 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
bb50: 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  t.#endif.#ifdef 
bb60: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
bb70: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
bb90: 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e  SQLITE_LoadExten
bba0: 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20  sion.#endif.#if 
bbb0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52  SQLITE_DEFAULT_R
bbc0: 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52  ECURSIVE_TRIGGER
bbd0: 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S.              
bbe0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54     | SQLITE_RecT
bbf0: 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 20  riggers.#endif. 
bc00: 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33       ;.  sqlite3
bc10: 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43  HashInit(&db->aC
bc20: 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
bc30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
bc40: 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69  TUALTABLE.  sqli
bc50: 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
bc60: 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69  >aModule);.#endi
bc70: 66 0a 0a 20 20 64 62 2d 3e 70 56 66 73 20 3d 20  f..  db->pVfs = 
bc80: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
bc90: 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 21 64  (zVfs);.  if( !d
bca0: 62 2d 3e 70 56 66 73 20 29 7b 0a 20 20 20 20 72  b->pVfs ){.    r
bcb0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
bcc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
bcd0: 6f 72 28 64 62 2c 20 72 63 2c 20 22 6e 6f 20 73  or(db, rc, "no s
bce0: 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56  uch vfs: %s", zV
bcf0: 66 73 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  fs);.    goto op
bd00: 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
bd10: 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66 61   /* Add the defa
bd20: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
bd30: 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20 42  quence BINARY. B
bd40: 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72 20  INARY works for 
bd50: 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20  both UTF-8.  ** 
bd60: 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20 61  and UTF-16, so a
bd70: 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f 72  dd a version for
bd80: 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20 61   each to avoid a
bd90: 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a 20  ny unnecessary. 
bda0: 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e   ** conversions.
bdb0: 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20   The only error 
bdc0: 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20 68  that can occur h
bdd0: 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28  ere is a malloc(
bde0: 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a  ) failure..  */.
bdf0: 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
be00: 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20  n(db, "BINARY", 
be10: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
be20: 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c  ITE_COLL_BINARY,
be30: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
be40: 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75 6e        binCollFun
be50: 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
be60: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49  ollation(db, "BI
be70: 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54  NARY", SQLITE_UT
be80: 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f 43 4f  F16BE, SQLITE_CO
be90: 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a 20 20  LL_BINARY, 0,.  
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
bec0: 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
bed0: 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
bee0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
bef0: 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e   SQLITE_COLL_BIN
bf00: 41 52 59 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ARY, 0,.        
bf10: 20 20 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c            binCol
bf20: 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
bf30: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
bf40: 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45   "RTRIM", SQLITE
bf50: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 43 4f  _UTF8, SQLITE_CO
bf60: 4c 4c 5f 55 53 45 52 2c 20 28 76 6f 69 64 2a 29  LL_USER, (void*)
bf70: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
bf80: 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63       binCollFunc
bf90: 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
bfa0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
bfb0: 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
bfc0: 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70  out;.  }.  db->p
bfd0: 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  DfltColl = sqlit
bfe0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
bff0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22  , SQLITE_UTF8, "
c000: 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 61  BINARY", 0);.  a
c010: 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74  ssert( db->pDflt
c020: 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Coll!=0 );..  /*
c030: 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d   Also add a UTF-
c040: 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  8 case-insensiti
c050: 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ve collation seq
c060: 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61  uence. */.  crea
c070: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
c080: 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45  "NOCASE", SQLITE
c090: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 43 4f  _UTF8, SQLITE_CO
c0a0: 4c 4c 5f 4e 4f 43 41 53 45 2c 20 30 2c 0a 20 20  LL_NOCASE, 0,.  
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0c0: 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
c0d0: 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4f  unc, 0);..  /* O
c0e0: 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20  pen the backend 
c0f0: 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20  database driver 
c100: 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61  */.  db->openFla
c110: 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63  gs = flags;.  rc
c120: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
c130: 61 63 74 6f 72 79 28 64 62 2c 20 7a 46 69 6c 65  actory(db, zFile
c140: 6e 61 6d 65 2c 20 30 2c 20 53 51 4c 49 54 45 5f  name, 0, SQLITE_
c150: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
c160: 5a 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ZE, .           
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f  flags | SQLITE_O
c190: 50 45 4e 5f 4d 41 49 4e 5f 44 42 2c 0a 20 20 20  PEN_MAIN_DB,.   
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62          &db->aDb
c1c0: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20  [0].pBt);.  if( 
c1d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c1e0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
c1f0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
c200: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
c210: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
c220: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
c230: 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20  or(db, rc, 0);. 
c240: 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
c250: 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44  ut;.  }.  db->aD
c260: 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[0].pSchema = s
c270: 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
c280: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  db, db->aDb[0].p
c290: 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  Bt);.  db->aDb[1
c2a0: 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ].pSchema = sqli
c2b0: 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c  te3SchemaGet(db,
c2c0: 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20   0);...  /* The 
c2d0: 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c  default safety_l
c2e0: 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69  evel for the mai
c2f0: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 27 66  n database is 'f
c300: 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65  ull'; for the te
c310: 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  mp.  ** database
c320: 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54   it is 'NONE'. T
c330: 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
c340: 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61  pager layer defa
c350: 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64  ults.  .  */.  d
c360: 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20  b->aDb[0].zName 
c370: 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e  = "main";.  db->
c380: 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[0].safety_le
c390: 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61  vel = 3;.  db->a
c3a0: 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74  Db[1].zName = "t
c3b0: 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  emp";.  db->aDb[
c3c0: 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  1].safety_level 
c3d0: 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69  = 1;..  db->magi
c3e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
c3f0: 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d  _OPEN;.  if( db-
c400: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c410: 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
c420: 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
c430: 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69  Register all bui
c440: 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c  lt-in functions,
c450: 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65   but do not atte
c460: 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a  mpt to read the.
c470: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63    ** database sc
c480: 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69  hema yet. This i
c490: 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20  s delayed until 
c4a0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
c4b0: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
c4c0: 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20   is accessed..  
c4d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  */.  sqlite3Erro
c4e0: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
c4f0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65   0);.  sqlite3Re
c500: 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e  gisterBuiltinFun
c510: 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f  ctions(db);..  /
c520: 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63  * Load automatic
c530: 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78   extensions - ex
c540: 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61  tensions that ha
c550: 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65 72  ve been register
c560: 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  ed.  ** using th
c570: 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61  e sqlite3_automa
c580: 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20  tic_extension() 
c590: 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  API..  */.  sqli
c5a0: 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e  te3AutoLoadExten
c5b0: 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72 63 20  sions(db);.  rc 
c5c0: 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
c5d0: 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 21  e(db);.  if( rc!
c5e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c5f0: 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
c600: 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  t;.  }..#ifdef S
c610: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
c620: 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  1.  if( !db->mal
c630: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c640: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
c650: 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69  te3Fts1Init(sqli
c660: 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
c670: 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
c680: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
c690: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c6a0: 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28  NABLE_FTS2.  if(
c6b0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
c6c0: 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
c6d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72  _OK ){.    exter
c6e0: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  n int sqlite3Fts
c6f0: 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b  2Init(sqlite3*);
c700: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c710: 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts2Init(db);. 
c720: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
c730: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c740: 46 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS3.  if( !db->
c750: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
c760: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c770: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c780: 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts3Init(db);. 
c790: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
c7a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c7b0: 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  ICU.  if( !db->m
c7c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
c7d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c7e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c7f0: 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  IcuInit(db);.  }
c800: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
c810: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54  SQLITE_ENABLE_RT
c820: 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  REE.  if( !db->m
c830: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
c840: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
c850: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52     rc = sqlite3R
c860: 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20  treeInit(db);.  
c870: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
c880: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
c890: 53 56 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  SV.  if( !db->ma
c8a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
c8b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
c8c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 73    rc = sqlite3Cs
c8d0: 76 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  vInit(db);.  }.#
c8e0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
c8f0: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
c900: 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45  ;..  /* -DSQLITE
c910: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
c920: 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58  _MODE=1 makes EX
c930: 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66 61  CLUSIVE the defa
c940: 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  ult locking.  **
c950: 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45   mode.  -DSQLITE
c960: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
c970: 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52  _MODE=0 make NOR
c980: 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20  MAL the default 
c990: 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
c9a0: 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e  e.  Doing nothin
c9b0: 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61  g at all also ma
c9c0: 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64  kes NORMAL the d
c9d0: 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66  efault..  */.#if
c9e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
c9f0: 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a  LT_LOCKING_MODE.
ca00: 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f    db->dfltLockMo
ca10: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  de = SQLITE_DEFA
ca20: 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
ca30: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
ca40: 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69  LockingMode(sqli
ca50: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
ca60: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20  ->aDb[0].pBt),. 
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
ca90: 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
caa0: 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  MODE);.#endif.. 
cab0: 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c   /* Enable the l
cac0: 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20  ookaside-malloc 
cad0: 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73  subsystem */.  s
cae0: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
caf0: 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  , 0, sqlite3Glob
cb00: 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
cb10: 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  side,.          
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
cb30: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
cb40: 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a  g.nLookaside);..
cb50: 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66  opendb_out:.  if
cb60: 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65  ( db ){.    asse
cb70: 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30  rt( db->mutex!=0
cb80: 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65   || isThreadsafe
cb90: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c  ==0 || sqlite3Gl
cba0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
cbb0: 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
cbc0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
cbd0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
cbe0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
cbf0: 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
cc00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cc10: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71  _NOMEM ){.    sq
cc20: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
cc30: 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d  .    db = 0;.  }
cc40: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
cc50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62  ITE_OK ){.    db
cc60: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
cc70: 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d  _MAGIC_SICK;.  }
cc80: 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 20  .  *ppDb = db;. 
cc90: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
cca0: 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d  piExit(0, rc);.}
ccb0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
ccc0: 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
ccd0: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
cce0: 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  e3_open(.  const
ccf0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
cd00: 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
cd10: 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e  pDb .){.  return
cd20: 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
cd30: 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20  ilename, ppDb,. 
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
cd60: 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
cd70: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
cd80: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
cd90: 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f  e3_open_v2(.  co
cda0: 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61  nst char *filena
cdb0: 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73  me,   /* Databas
cdc0: 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d  e filename (UTF-
cdd0: 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  8) */.  sqlite3 
cde0: 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20  **ppDb,         
cdf0: 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64  /* OUT: SQLite d
ce00: 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
ce10: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
ce20: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a        /* Flags *
ce30: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ce40: 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e  zVfs        /* N
ce50: 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c  ame of VFS modul
ce60: 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  e to use */.){. 
ce70: 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
ce80: 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70  base(filename, p
ce90: 70 44 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73  pDb, flags, zVfs
cea0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
ceb0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
cec0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
ced0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
cee0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cef0: 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74  _open16(.  const
cf00: 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
cf10: 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
cf20: 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  pDb.){.  char co
cf30: 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b  nst *zFilename8;
cf40: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
cf50: 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38  encoded in UTF-8
cf60: 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d   instead of UTF-
cf70: 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  16 */.  sqlite3_
cf80: 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
cf90: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
cfa0: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20  ( zFilename );. 
cfb0: 20 61 73 73 65 72 74 28 20 70 70 44 62 20 29 3b   assert( ppDb );
cfc0: 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
cfd0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cfe0: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
cff0: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
d000: 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
d010: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
d020: 6e 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71  ndif.  pVal = sq
d030: 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
d040: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
d050: 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
d060: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49   zFilename, SQLI
d070: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20  TE_UTF16NATIVE, 
d080: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
d090: 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73    zFilename8 = s
d0a0: 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
d0b0: 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
d0c0: 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  8);.  if( zFilen
d0d0: 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
d0e0: 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
d0f0: 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a  ilename8, ppDb,.
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d110: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
d120: 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
d130: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
d140: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
d150: 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53  ( *ppDb || rc==S
d160: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
d170: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d180: 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72  E_OK && !DbHasPr
d190: 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c  operty(*ppDb, 0,
d1a0: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
d1b0: 29 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a  ) ){.      ENC(*
d1c0: 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55  ppDb) = SQLITE_U
d1d0: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20  TF16NATIVE;.    
d1e0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
d1f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
d200: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
d210: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
d220: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
d230: 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b  3ApiExit(0, rc);
d240: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
d250: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
d260: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
d270: 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
d280: 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
d290: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
d2a0: 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
d2b0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
d2c0: 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
d2d0: 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
d2e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
d2f0: 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
d300: 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
d310: 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
d320: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
d330: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
d340: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
d350: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d360: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
d370: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
d380: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
d390: 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
d3a0: 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ation(db, zName,
d3b0: 20 28 75 38 29 65 6e 63 2c 20 53 51 4c 49 54 45   (u8)enc, SQLITE
d3c0: 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78  _COLL_USER, pCtx
d3d0: 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
d3e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
d3f0: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
d400: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d410: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d420: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d430: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
d440: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
d450: 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
d460: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
d470: 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
d480: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
d490: 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ation_v2(.  sqli
d4a0: 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
d4b0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
d4c0: 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
d4d0: 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
d4e0: 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
d4f0: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
d500: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
d510: 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29  ),.  void(*xDel)
d520: 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74  (void*).){.  int
d530: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
d540: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
d550: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
d560: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
d570: 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
d580: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
d590: 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c   zName, (u8)enc,
d5a0: 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45   SQLITE_COLL_USE
d5b0: 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  R, pCtx, xCompar
d5c0: 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d  e, xDel);.  rc =
d5d0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
d5e0: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
d5f0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
d600: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
d610: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
d620: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
d630: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
d640: 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
d650: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
d660: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
d670: 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
d680: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d690: 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73  collation16(.  s
d6a0: 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
d6b0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65  onst void *zName
d6c0: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20  ,.  int enc, .  
d6d0: 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
d6e0: 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
d6f0: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
d700: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
d710: 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  d*).){.  int rc 
d720: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
d730: 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73  har *zName8;.  s
d740: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
d750: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
d760: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
d770: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
d780: 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33  zName8 = sqlite3
d790: 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61  Utf16to8(db, zNa
d7a0: 6d 65 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20 7a  me, -1);.  if( z
d7b0: 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20  Name8 ){.    rc 
d7c0: 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
d7d0: 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75  n(db, zName8, (u
d7e0: 38 29 65 6e 63 2c 20 53 51 4c 49 54 45 5f 43 4f  8)enc, SQLITE_CO
d7f0: 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78 2c 20 78  LL_USER, pCtx, x
d800: 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20  Compare, 0);.   
d810: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d820: 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a  b, zName8);.  }.
d830: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
d840: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
d850: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d860: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d870: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d880: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d890: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
d8a0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
d8b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
d8c0: 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
d8d0: 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
d8e0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
d8f0: 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
d900: 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
d910: 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
d920: 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
d930: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d940: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
d950: 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  d(.  sqlite3 *db
d960: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
d970: 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
d980: 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29  id(*xCollNeeded)
d990: 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c  (void*,sqlite3*,
d9a0: 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e  int eTextRep,con
d9b0: 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73  st char*).){.  s
d9c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
d9d0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
d9e0: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
d9f0: 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a   = xCollNeeded;.
da00: 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
da10: 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70  d16 = 0;.  db->p
da20: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
da30: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
da40: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
da50: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
da60: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
da70: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
da80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
da90: 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  16./*.** Registe
daa0: 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
dab0: 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
dac0: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
dad0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
dae0: 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
daf0: 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
db00: 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
db10: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
db20: 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
db30: 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
db40: 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65  eded16(.  sqlite
db50: 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
db60: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
db70: 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
db80: 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71  eded16)(void*,sq
db90: 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
dba0: 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  Rep,const void*)
dbb0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
dbc0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
dbd0: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
dbe0: 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64  lNeeded = 0;.  d
dbf0: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
dc00: 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36   = xCollNeeded16
dc10: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ;.  db->pCollNee
dc20: 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65  dedArg = pCollNe
dc30: 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74  ededArg;.  sqlit
dc40: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
dc50: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
dc60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
dc70: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
dc80: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
dc90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
dca0: 4f 4d 49 54 5f 47 4c 4f 42 41 4c 52 45 43 4f 56  OMIT_GLOBALRECOV
dcb0: 45 52 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ER.#ifndef SQLIT
dcc0: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
dcd0: 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  D./*.** This fun
dce0: 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20  ction is now an 
dcf0: 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20  anachronism. It 
dd00: 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  used to be used 
dd10: 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
dd20: 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61  a.** malloc() fa
dd30: 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74  ilure, but SQLit
dd40: 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20  e now does this 
dd50: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a  automatically..*
dd60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c  /.int sqlite3_gl
dd70: 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69  obal_recover(voi
dd80: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d){.  return SQL
dd90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
dda0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
ddb0: 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
ddc0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61  er or not the da
ddd0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
dde0: 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  n is in autocomm
ddf0: 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74  it.** mode.  Ret
de00: 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
de10: 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e  s and FALSE if n
de20: 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  ot.  Autocommit 
de30: 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79  mode is on.** by
de40: 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63   default.  Autoc
de50: 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65  ommit is disable
de60: 64 20 62 79 20 61 20 42 45 47 49 4e 20 73 74 61  d by a BEGIN sta
de70: 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61  tement and reena
de80: 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e  bled.** by the n
de90: 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f  ext COMMIT or RO
dea0: 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  LLBACK..**.*****
deb0: 2a 2a 20 54 48 49 53 20 49 53 20 41 4e 20 45 58  ** THIS IS AN EX
dec0: 50 45 52 49 4d 45 4e 54 41 4c 20 41 50 49 20 41  PERIMENTAL API A
ded0: 4e 44 20 49 53 20 53 55 42 4a 45 43 54 20 54 4f  ND IS SUBJECT TO
dee0: 20 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a   CHANGE ******.*
def0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65  /.int sqlite3_ge
df00: 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c  t_autocommit(sql
df10: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74  ite3 *db){.  ret
df20: 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  urn db->autoComm
df30: 69 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  it;.}..#ifdef SQ
df40: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
df50: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
df60: 6f 75 74 69 6e 65 20 69 73 20 73 75 62 74 69 74  outine is subtit
df70: 75 74 65 64 20 66 6f 72 20 63 6f 6e 73 74 61 6e  uted for constan
df80: 74 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  t SQLITE_CORRUPT
df90: 20 69 6e 0a 2a 2a 20 64 65 62 75 67 67 69 6e 67   in.** debugging
dfa0: 20 62 75 69 6c 64 73 2e 20 20 54 68 69 73 20 70   builds.  This p
dfb0: 72 6f 76 69 64 65 73 20 61 20 77 61 79 20 74 6f  rovides a way to
dfc0: 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
dfd0: 74 20 66 6f 72 20 77 68 65 6e 0a 2a 2a 20 63 6f  t for when.** co
dfe0: 72 72 75 70 74 69 6f 6e 20 69 73 20 66 69 72 73  rruption is firs
dff0: 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69  t detected..*/.i
e000: 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
e010: 74 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  t(void){.  retur
e020: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e030: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
e040: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e050: 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
e060: 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65   This is a conve
e070: 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74  nience routine t
e080: 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74  hat makes sure t
e090: 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73  hat all thread-s
e0a0: 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20  pecific.** data 
e0b0: 66 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20  for this thread 
e0c0: 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63  has been dealloc
e0d0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ated..**.** SQLi
e0e0: 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  te no longer use
e0f0: 73 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  s thread-specifi
e100: 63 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72  c data so this r
e110: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a  outine is now a.
e120: 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73  ** no-op.  It is
e130: 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69   retained for hi
e140: 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69  storical compati
e150: 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  bility..*/.void 
e160: 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
e170: 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a  leanup(void){.}.
e180: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
e190: 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d  turn meta inform
e1a0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70  ation about a sp
e1b0: 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66  ecific column of
e1c0: 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
e1d0: 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
e1e0: 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28  t in sqlite3.h (
e1f0: 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72  sqlite.h.in) for
e200: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66   details..*/.#if
e210: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e220: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e230: 41 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61  A.int sqlite3_ta
e240: 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
e250: 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ata(.  sqlite3 *
e260: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
e270: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
e280: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
e290: 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
e2a0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ,        /* Data
e2b0: 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c  base name or NUL
e2c0: 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
e2d0: 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20  r *zTableName,  
e2e0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65     /* Table name
e2f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e300: 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20   *zColumnName,  
e310: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
e320: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
e330: 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20   **pzDataType,  
e340: 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63    /* OUTPUT: Dec
e350: 6c 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20  lared data type 
e360: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
e370: 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20  **pzCollSeq,    
e380: 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c   /* OUTPUT: Coll
e390: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
e3a0: 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e  ame */.  int *pN
e3b0: 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20  otNull,         
e3c0: 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
e3d0: 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c  True if NOT NULL
e3e0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73   constraint exis
e3f0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72  ts */.  int *pPr
e400: 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20  imaryKey,       
e410: 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
e420: 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61  rue if column pa
e430: 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e  rt of PK */.  in
e440: 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20  t *pAutoinc     
e450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
e460: 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c  PUT: True if col
e470: 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72  umn is auto-incr
e480: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ement */.){.  in
e490: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
e4a0: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62  rrMsg = 0;.  Tab
e4b0: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
e4c0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30  Column *pCol = 0
e4d0: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20  ;.  int iCol;.. 
e4e0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61   char const *zDa
e4f0: 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68  taType = 0;.  ch
e500: 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53  ar const *zCollS
e510: 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f  eq = 0;.  int no
e520: 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  tnull = 0;.  int
e530: 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b   primarykey = 0;
e540: 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d  .  int autoinc =
e550: 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65   0;..  /* Ensure
e560: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
e570: 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f  hema has been lo
e580: 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  aded */.  sqlite
e590: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
e5a0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 28 76 6f 69  ->mutex);.  (voi
e5b0: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
e5c0: 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  n(db);.  sqlite3
e5d0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
e5e0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
e5f0: 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d  3Init(db, &zErrM
e600: 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  sg);.  if( SQLIT
e610: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
e620: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
e630: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
e640: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75   the table in qu
e650: 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62  estion */.  pTab
e660: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
e670: 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61  ble(db, zTableNa
e680: 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  me, zDbName);.  
e690: 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61  if( !pTab || pTa
e6a0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
e6b0: 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
e6c0: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
e6d0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
e6e0: 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68  he column for wh
e6f0: 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75  ich info is requ
e700: 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73  ested */.  if( s
e710: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
e720: 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
e730: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69    iCol = pTab->i
e740: 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43  PKey;.    if( iC
e750: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol>=0 ){.      p
e760: 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
e770: 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20  l[iCol];.    }. 
e780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
e790: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
e7a0: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
e7b0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26  {.      pCol = &
e7c0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
e7d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
e7e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
e7f0: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75  ol->zName, zColu
e800: 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
e810: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e820: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e830: 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  iCol==pTab->nCol
e840: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
e850: 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   0;.      goto e
e860: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
e870: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
e880: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74  llowing block st
e890: 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e  ores the meta in
e8a0: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
e8b0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a  ill be returned.
e8c0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c    ** to the call
e8d0: 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  er in local vari
e8e0: 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c  ables zDataType,
e8f0: 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75   zCollSeq, notnu
e900: 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20  ll, primarykey. 
e910: 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e   ** and autoinc.
e920: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
e930: 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73  here are two pos
e940: 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a  sibilities:.  **
e950: 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68   .  **     1. Th
e960: 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75  e specified colu
e970: 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69  mn name was rowi
e980: 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72  d", "oid" or "_r
e990: 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20  owid_" .  **    
e9a0: 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73      and there is
e9b0: 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64   no explicitly d
e9c0: 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75  eclared IPK colu
e9d0: 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mn. .  **.  **  
e9e0: 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20     2. The table 
e9f0: 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e  is not a view an
ea00: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  d the column nam
ea10: 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20  e identified an 
ea20: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70  .  **        exp
ea30: 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
ea40: 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65   column. Copy me
ea50: 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ta information f
ea60: 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20  rom *pCol..  */ 
ea70: 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
ea80: 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70     zDataType = p
ea90: 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20  Col->zType;.    
eaa0: 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d  zCollSeq = pCol-
eab0: 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e  >zColl;.    notn
eac0: 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e  ull = pCol->notN
ead0: 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d  ull!=0;.    prim
eae0: 61 72 79 6b 65 79 20 20 3d 20 70 43 6f 6c 2d 3e  arykey  = pCol->
eaf0: 69 73 50 72 69 6d 4b 65 79 21 3d 30 3b 0a 20 20  isPrimKey!=0;.  
eb00: 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62    autoinc = pTab
eb10: 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26  ->iPKey==iCol &&
eb20: 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
eb30: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
eb40: 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ent)!=0;.  }else
eb50: 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
eb60: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
eb70: 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b   primarykey = 1;
eb80: 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c  .  }.  if( !zCol
eb90: 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c  lSeq ){.    zCol
eba0: 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22 3b  lSeq = "BINARY";
ebb0: 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a  .  }..error_out:
ebc0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
ebd0: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 28  eaveAll(db);.  (
ebe0: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
ebf0: 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a  tyOff(db);..  /*
ec00: 20 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e   Whether the fun
ec10: 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65  ction call succe
ec20: 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20  eded or failed, 
ec30: 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70  set the output p
ec40: 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74  arameters.  ** t
ec50: 6f 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72  o whatever their
ec60: 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61   local counterpa
ec70: 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20  rts contain. If 
ec80: 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63  an error did occ
ec90: 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61  ur,.  ** this ha
eca0: 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
ecb0: 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70  zeroing all outp
ecc0: 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  ut parameters.. 
ecd0: 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61   */.  if( pzData
ece0: 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79  Type ) *pzDataTy
ecf0: 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a  pe = zDataType;.
ed00: 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20    if( pzCollSeq 
ed10: 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a  ) *pzCollSeq = z
ed20: 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70  CollSeq;.  if( p
ed30: 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e  NotNull ) *pNotN
ed40: 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20  ull = notnull;. 
ed50: 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79   if( pPrimaryKey
ed60: 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20   ) *pPrimaryKey 
ed70: 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20  = primarykey;.  
ed80: 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a  if( pAutoinc ) *
ed90: 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69  pAutoinc = autoi
eda0: 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  nc;..  if( SQLIT
edb0: 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61  E_OK==rc && !pTa
edc0: 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
edd0: 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d  DbFree(db, zErrM
ede0: 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67  sg);.    zErrMsg
edf0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
ee00: 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74  f(db, "no such t
ee10: 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e  able column: %s.
ee20: 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  %s", zTableName,
ee30: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e  .        zColumn
ee40: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
ee50: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
ee60: 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
ee70: 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73  (db, rc, (zErrMs
ee80: 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d  g?"%s":0), zErrM
ee90: 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  sg);.  sqlite3Db
eea0: 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
eeb0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
eec0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
eed0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
eee0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
eef0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
ef00: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
ef10: 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
ef20: 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
ef30: 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
ef40: 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
ef50: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65  int sqlite3_slee
ef60: 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c  p(int ms){.  sql
ef70: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a  ite3_vfs *pVfs;.
ef80: 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73    int rc;.  pVfs
ef90: 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
efa0: 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56  ind(0);.  if( pV
efb0: 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  fs==0 ) return 0
efc0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
efd0: 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d  ction works in m
efe0: 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74  illiseconds, but
eff0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
f000: 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20  OsSleep() .  ** 
f010: 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65  API uses microse
f020: 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65  conds. Hence the
f030: 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20   1000's..  */.  
f040: 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53  rc = (sqlite3OsS
f050: 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a  leep(pVfs, 1000*
f060: 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74  ms)/1000);.  ret
f070: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f080: 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
f090: 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20  le the extended 
f0a0: 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f  result codes..*/
f0b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74  .int sqlite3_ext
f0c0: 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
f0d0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
f0e0: 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71  int onoff){.  sq
f0f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f100: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
f110: 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e  db->errMask = on
f120: 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66  off ? 0xffffffff
f130: 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74   : 0xff;.  sqlit
f140: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
f150: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
f160: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f170: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
f180: 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  he xFileControl 
f190: 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74  method on a part
f1a0: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e  icular database.
f1b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
f1c0: 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c  file_control(sql
f1d0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
f1e0: 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69  char *zDbName, i
f1f0: 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
f200: 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
f210: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69  QLITE_ERROR;.  i
f220: 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
f230: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f240: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
f250: 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  zDbName==0 ){.  
f260: 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 7d 65 6c    iDb = 0;.  }el
f270: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 44 62 3d  se{.    for(iDb=
f280: 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  0; iDb<db->nDb; 
f290: 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  iDb++){.      if
f2a0: 28 20 73 74 72 63 6d 70 28 64 62 2d 3e 61 44 62  ( strcmp(db->aDb
f2b0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62  [iDb].zName, zDb
f2c0: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
f2d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
f2e0: 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 7b  ( iDb<db->nDb ){
f2f0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 72  .    Btree *pBtr
f300: 65 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ee = db->aDb[iDb
f310: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
f320: 42 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20 50  Btree ){.      P
f330: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
f340: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
f350: 20 2a 66 64 3b 0a 20 20 20 20 20 20 73 71 6c 69   *fd;.      sqli
f360: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
f370: 74 72 65 65 29 3b 0a 20 20 20 20 20 20 70 50 61  tree);.      pPa
f380: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
f390: 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b  eePager(pBtree);
f3a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f3b0: 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
f3c0: 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61    fd = sqlite3Pa
f3d0: 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b  gerFile(pPager);
f3e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
f3f0: 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  d!=0 );.      if
f400: 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
f410: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
f420: 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
f430: 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67  rol(fd, op, pArg
f440: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f450: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
f460: 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  ve(pBtree);.    
f470: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
f480: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
f490: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
f4a0: 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a   rc;   .}../*.**
f4b0: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68   Interface to th
f4c0: 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e  e testing logic.
f4d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
f4e0: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
f4f0: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74   op, ...){.  int
f500: 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66   rc = 0;.#ifndef
f510: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49   SQLITE_OMIT_BUI
f520: 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c  LTIN_TEST.  va_l
f530: 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
f540: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
f550: 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
f560: 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20   /*.    ** Save 
f570: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
f580: 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20  e of the PRNG.. 
f590: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
f5a0: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
f5b0: 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20  RNG_SAVE: {.    
f5c0: 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76    sqlite3PrngSav
f5d0: 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
f5e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
f5f0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74    /*.    ** Rest
f600: 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ore the state of
f610: 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65   the PRNG to the
f620: 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65   last state save
f630: 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50  d using.    ** P
f640: 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52  RNG_SAVE.  If PR
f650: 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65  NG_SAVE has neve
f660: 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61  r before been ca
f670: 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  lled, then.    *
f680: 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73  * this verb acts
f690: 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54   like PRNG_RESET
f6a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
f6b0: 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
f6c0: 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20  L_PRNG_RESTORE: 
f6d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
f6e0: 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28  rngRestoreState(
f6f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f700: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
f710: 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50    ** Reset the P
f720: 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20  RNG back to its 
f730: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
f740: 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63  ate.  The next c
f750: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
f760: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
f770: 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74  () will reseed t
f780: 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20  he PRNG using a 
f790: 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20  single call.    
f7a0: 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f  ** to the xRando
f7b0: 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20  mness method of 
f7c0: 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e  the default VFS.
f7d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
f7e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
f7f0: 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20  _PRNG_RESET: {. 
f800: 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
f810: 52 65 73 65 74 53 74 61 74 65 28 29 3b 0a 20 20  ResetState();.  
f820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f830: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
f840: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
f850: 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53  ntrol(BITVEC_TES
f860: 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d  T, size, program
f870: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
f880: 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e  Run a test again
f890: 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65  st a Bitvec obje
f8a0: 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65  ct of size.  The
f8b0: 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e   program argumen
f8c0: 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61  t.    ** is an a
f8d0: 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73  rray of integers
f8e0: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
f8f0: 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20  e test.  Return 
f900: 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d  -1 on a.    ** m
f910: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
f920: 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63   error, 0 on suc
f930: 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  cess, or non-zer
f940: 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  o for an error..
f950: 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73      ** See the s
f960: 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
f970: 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64  tinTest() for ad
f980: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
f990: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
f9a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
f9b0: 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
f9c0: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  T: {.      int s
f9d0: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
f9e0: 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  nt);.      int *
f9f0: 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  aProg = va_arg(a
fa00: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
fa10: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
fa20: 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a  ecBuiltinTest(sz
fa30: 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20  , aProg);.      
fa40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
fa50: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
fa60: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
fa70: 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  l(BENIGN_MALLOC_
fa80: 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78  HOOKS, xBegin, x
fa90: 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  End).    **.    
faa0: 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b  ** Register hook
fab0: 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64  s to call to ind
fac0: 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c  icate which mall
fad0: 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20  oc() failures . 
fae0: 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e     ** are benign
faf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
fb00: 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
fb10: 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  L_BENIGN_MALLOC_
fb20: 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74  HOOKS: {.      t
fb30: 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f  ypedef void (*vo
fb40: 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69  id_function)(voi
fb50: 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66  d);.      void_f
fb60: 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42  unction xBenignB
fb70: 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64  egin;.      void
fb80: 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
fb90: 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e  nEnd;.      xBen
fba0: 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72  ignBegin = va_ar
fbb0: 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
fbc0: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e  ion);.      xBen
fbd0: 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28  ignEnd = va_arg(
fbe0: 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f  ap, void_functio
fbf0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
fc00: 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f  3BenignMallocHoo
fc10: 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c  ks(xBenignBegin,
fc20: 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20   xBenignEnd);.  
fc30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fc40: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
fc50: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
fc60: 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
fc70: 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59  TCTRL_PENDING_BY
fc80: 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  TE, unsigned int
fc90: 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
fca0: 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e  * Set the PENDIN
fcb0: 47 20 62 79 74 65 20 74 6f 20 74 68 65 20 76 61  G byte to the va
fcc0: 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d  lue in the argum
fcd0: 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20  ent, if X>0..   
fce0: 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e   ** Make no chan
fcf0: 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65  ges if X==0.  Re
fd00: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
fd10: 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79  f the pending by
fd20: 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20  te.    ** as it 
fd30: 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20  existing before 
fd40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
fd50: 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a   called..    **.
fd60: 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54      ** IMPORTANT
fd70: 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  :  Changing the 
fd80: 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f  PENDING byte fro
fd90: 6d 20 30 78 34 30 30 30 30 30 30 30 20 72 65 73  m 0x40000000 res
fda0: 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61  ults in.    ** a
fdb0: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64  n incompatible d
fdc0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
fdd0: 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74  mat.  Changing t
fde0: 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a  he PENDING byte.
fdf0: 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79      ** while any
fe00: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
fe10: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73  tion is open res
fe20: 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65  ults in undefine
fe30: 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 69 6c  d and.    ** dil
fe40: 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f  eterious behavio
fe50: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
fe60: 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
fe70: 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a  RL_PENDING_BYTE:
fe80: 20 7b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65   {.      unsigne
fe90: 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76  d int newVal = v
fea0: 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e  a_arg(ap, unsign
feb0: 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 72  ed int);.      r
fec0: 63 20 3d 20 73 71 6c 69 74 65 33 50 65 6e 64 69  c = sqlite3Pendi
fed0: 6e 67 42 79 74 65 3b 0a 20 20 20 20 20 20 69 66  ngByte;.      if
fee0: 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74  ( newVal ) sqlit
fef0: 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20  e3PendingByte = 
ff00: 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 62 72  newVal;.      br
ff10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
ff20: 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
ff30: 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
ff40: 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
ff50: 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20  ASSERT, int X). 
ff60: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
ff70: 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  s action provide
ff80: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  s a run-time tes
ff90: 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
ffa0: 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61   or not.    ** a
ffb0: 73 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62  ssert() was enab
ffc0: 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
ffd0: 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  ime.  If X is tr
ffe0: 75 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a  ue and assert().
fff0: 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65      ** is enable
10000 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
10010 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65  rn value is true
10020 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20  .  If X is true 
10030 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72  and.    ** asser
10040 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c  t() is disabled,
10050 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
10060 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20   value is zero. 
10070 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20   If X is.    ** 
10080 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74  false and assert
10090 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  () is enabled, t
100a0 68 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f  hen the assertio
100b0 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a  n fires and the.
100c0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
100d0 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20  borts.  If X is 
100e0 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74  false and assert
100f0 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
10100 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
10110 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
10120 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
10130 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
10140 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a  TCTRL_ASSERT: {.
10150 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69        volatile i
10160 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt x = 0;.      
10170 61 73 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f  assert( (x = va_
10180 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20  arg(ap,int))!=0 
10190 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b  );.      rc = x;
101a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
101b0 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    }...    /*.   
101c0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
101d0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
101e0 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
101f0 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  , int X).    **.
10200 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69      ** This acti
10210 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75  on provides a ru
10220 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73  n-time test to s
10230 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59  ee how the ALWAY
10240 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56  S and.    ** NEV
10250 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64  ER macros were d
10260 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c  efined at compil
10270 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20  e-time..    **. 
10280 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e     ** The return
10290 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53   value is ALWAYS
102a0 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  (X).  .    **.  
102b0 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65    ** The recomme
102c0 6e 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d  nded test is X==
102d0 32 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  2.  If the retur
102e0 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68  n value is 2, th
102f0 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  at means.    ** 
10300 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
10310 45 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f  ER() are both no
10320 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
10330 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69   macros, which i
10340 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  s the.    ** def
10350 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49  ault setting.  I
10360 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
10370 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c  ue is 1, then AL
10380 57 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72  WAYS() is either
10390 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64  .    ** hard-cod
103a0 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c  ed to true or el
103b0 73 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66  se it asserts if
103c0 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73   its argument is
103d0 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54   false..    ** T
103e0 68 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f  he first behavio
103f0 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f  r (hard-coded to
10400 20 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61   true) is the ca
10410 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
10420 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
10430 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
10440 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
10450 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f  led and the seco
10460 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69  nd.    ** behavi
10470 6f 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68  or (assert if th
10480 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c  e argument to AL
10490 57 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29  WAYS() is false)
104a0 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
104b0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
104c0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
104d0 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
104e0 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20  ) is enabled..  
104f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
10500 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72  run-time test pr
10510 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f  ocedure might lo
10520 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ok something lik
10530 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
10540 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c     **    if( sql
10550 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
10560 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
10570 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20  L_ALWAYS, 2)==2 
10580 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  ){.    **      /
10590 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  / ALWAYS() and N
105a0 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70  EVER() are no-op
105b0 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61   pass-through ma
105c0 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d  cros.    **    }
105d0 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
105e0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
105f0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
10600 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20  SERT, 1) ){.    
10610 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
10620 53 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61  S(x) asserts tha
10630 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56  t x is true. NEV
10640 45 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20  ER(x) asserts x 
10650 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
10660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a      }else{.    *
10670 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
10680 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  (x) is a constan
10690 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69  t 1.  NEVER(x) i
106a0 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a  s a constant 0..
106b0 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20      **    }.    
106c0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
106d0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
106e0 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  YS: {.      int 
106f0 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
10700 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41  t);.      rc = A
10710 4c 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20  LWAYS(x);.      
10720 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
10730 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
10740 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
10750 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
10760 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  RVE, sqlite3 *db
10770 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a  , int N).    **.
10780 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e      ** Set the n
10790 52 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20  Reserve size to 
107a0 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  N for the main d
107b0 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64  atabase on the d
107c0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63  atabase.    ** c
107d0 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20  onnection db..  
107e0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
107f0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
10800 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  SERVE: {.      s
10810 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
10820 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
10830 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  );.      int x =
10840 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
10850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
10860 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
10870 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c  utex);.      sql
10880 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
10890 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  Size(db->aDb[0].
108a0 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20  pBt, 0, x, 0);. 
108b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
108c0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
108d0 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
108e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 76  ;.    }..  }.  v
108f0 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69  a_end(ap);.#endi
10900 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
10910 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f  _BUILTIN_TEST */
10920 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.