/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 8704f23153fdcf3b748d8e7ca7e4ec7d7cd319be:


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: 2a 0a 2a 2a 20 24 49 64 3a 20 6d 61 69 6e 2e 63  *.** $Id: main.c
0270: 2c 76 20 31 2e 35 30 30 20 32 30 30 38 2f 30 39  ,v 1.500 2008/09
0280: 2f 30 38 20 30 38 3a 30 38 3a 30 39 20 64 61 6e  /08 08:08:09 dan
0290: 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a  ielk1977 Exp $.*
02a0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
02b0: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
02c0: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 23 69 66  e <ctype.h>..#if
02d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
02e0: 45 5f 46 54 53 33 0a 23 20 69 6e 63 6c 75 64 65  E_FTS3.# include
02f0: 20 22 66 74 73 33 2e 68 22 0a 23 65 6e 64 69 66   "fts3.h".#endif
0300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
0310: 4e 41 42 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e  NABLE_RTREE.# in
0320: 63 6c 75 64 65 20 22 72 74 72 65 65 2e 68 22 0a  clude "rtree.h".
0330: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
0340: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a  LITE_ENABLE_ICU.
0350: 23 20 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  # include "sqlit
0360: 65 69 63 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a  eicu.h".#endif..
0370: 2f 2a 0a 2a 2a 20 54 68 65 20 76 65 72 73 69 6f  /*.** The versio
0380: 6e 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79  n of the library
0390: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 73  .*/.const char s
03a0: 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d  qlite3_version[]
03b0: 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f   = SQLITE_VERSIO
03c0: 4e 3b 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  N;.const char *s
03d0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
03e0: 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  n(void){ return 
03f0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 3b  sqlite3_version;
0400: 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c   }.int sqlite3_l
0410: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
0420: 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53  (void){ return S
0430: 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
0440: 4d 42 45 52 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  MBER; }.int sqli
0450: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 76  te3_threadsafe(v
0460: 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c  oid){ return SQL
0470: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3b 20  ITE_THREADSAFE; 
0480: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
0490: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
04a0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
04b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
04c0: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ACE)./*.** If th
04d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
04e0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20  tion pointer is 
04f0: 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a  not NULL and if.
0500: 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
0510: 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62  _IOTRACE is enab
0520: 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67  led, then messag
0530: 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a  es describing.**
0540: 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20   I/O active are 
0550: 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68  written using th
0560: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  is function.  Th
0570: 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20  ese messages.** 
0580: 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72  are intended for
0590: 20 64 65 62 75 67 67 69 6e 67 20 61 63 74 69 76   debugging activ
05a0: 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ity only..*/.voi
05b0: 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54 72 61  d (*sqlite3IoTra
05c0: 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ce)(const char*,
05d0: 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64 69   ...) = 0;.#endi
05e0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
05f0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
0600: 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73   variable points
0610: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69   to a string whi
0620: 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d  ch is the.** nam
0630: 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
0640: 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65  , then that dire
0650: 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73  ctory will be us
0660: 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74  ed to store.** t
0670: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
0680: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  **.** See also t
0690: 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f  he "PRAGMA temp_
06a0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22  store_directory"
06b0: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   SQL command..*/
06c0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74  .char *sqlite3_t
06d0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
06e0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  0;../*.** Initia
06f0: 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a  lize SQLite.  .*
0700: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0710: 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
0720: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
0730: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
0740: 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e  tion,.** VFS, an
0750: 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  d mutex subsyste
0760: 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ms prior to doin
0770: 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f  g any serious wo
0780: 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74  rk with.** SQLit
0790: 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20  e.  But as long 
07a0: 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f  as you do not co
07b0: 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54  mpile with SQLIT
07c0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
07d0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
07e0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61  will be called a
07f0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20  utomatically by 
0800: 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63  key routines suc
0810: 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  h as.** sqlite3_
0820: 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  open().  .**.** 
0830: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0840: 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f  a no-op except o
0850: 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73 74  n its very first
0860: 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72   call for the pr
0870: 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72  ocess,.** or for
0880: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
0890: 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
08a0: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
08b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
08c0: 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c  t thread to call
08d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
08e0: 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ns the initializ
08f0: 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70  ation to.** comp
0900: 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73  letion.  If subs
0910: 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20 63  equent threads c
0920: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
0930: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
0940: 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20  t.** thread has 
0950: 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69  finished the ini
0960: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
0970: 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ess, then the su
0980: 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65  bsequent.** thre
0990: 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  ads must block u
09a0: 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
09b0: 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20 77  hread finishes w
09c0: 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ith the initiali
09d0: 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  zation..**.** Th
09e0: 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20 6d  e first thread m
09f0: 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72  ight call this r
0a00: 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65  outine recursive
0a10: 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a  ly.  Recursive.*
0a20: 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20  * calls to this 
0a30: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
0a40: 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75  ot block, of cou
0a50: 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  rse.  Otherwise 
0a60: 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  the.** initializ
0a70: 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f  ation process wo
0a80: 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65  uld never comple
0a90: 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20  te..**.** Let X 
0aa0: 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68 72  be the first thr
0ab0: 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69  ead to enter thi
0ac0: 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20  s routine.  Let 
0ad0: 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a  Y be some other.
0ae0: 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e  ** thread.  Then
0af0: 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69   while the initi
0b00: 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  al invocation of
0b10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79   this routine by
0b20: 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c   X is.** incompl
0b30: 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75 69  ete, it is requi
0b40: 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  red that:.**.** 
0b50: 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74     *  Calls to t
0b60: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d  his routine from
0b70: 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e   Y must block un
0b80: 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f  til the outer-mo
0b90: 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c  st.**       call
0ba0: 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e   by X completes.
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63  .**.**    *  Rec
0bc0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20  ursive calls to 
0bd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
0be0: 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75 72  m thread X retur
0bf0: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  n immediately.**
0c00: 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 62         without b
0c10: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
0c20: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
0c30: 7a 65 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ze(void){.  sqli
0c40: 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
0c50: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
0c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0c70: 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65  main static mute
0c80: 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  x */.  int rc;  
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
0cc0: 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  de */..#ifdef SQ
0cd0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
0ce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64  rc = sqlite3_wsd
0cf0: 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b  _init(4096, 24);
0d00: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
0d10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
0d20: 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
0d30: 66 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  f..  /* If SQLit
0d40: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
0d50: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
0d60: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
0d70: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
0d80: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
0d90: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
0da0: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
0db0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
0dc0: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
0dd0: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
0de0: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
0df0: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
0e00: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
0e10: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
0e20: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
0e30: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
0e40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0e50: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
0e60: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
0e70: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
0e80: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
0e90: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
0ea0: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
0eb0: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
0ec0: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
0ed0: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
0ee0: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
0ef0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
0f00: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
0f10: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
0f20: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
0f30: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
0f40: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
0f50: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
0f60: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
0f70: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
0f80: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
0f90: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
0fa0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
0fb0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
0fc0: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
0fd0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
0fe0: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
0ff0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
1000: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
1010: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
1020: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
1030: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
1040: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1050: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1060: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1070: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1080: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1090: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
10a0: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
10b0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
10c0: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
10d0: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
10e0: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
10f0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
1100: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
1110: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
1120: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
1130: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
1140: 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72  ..  */.  pMaster
1150: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
1160: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1170: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
1180: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1190: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
11a0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
11b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
11c0: 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20  allocInit ){.   
11d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c   rc = sqlite3Mal
11e0: 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20  locInit();.  }. 
11f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1200: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1210: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1220: 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a  MallocInit = 1;.
1230: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
1240: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1250: 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  itMutex ){.     
1260: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1270: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20  nfig.pInitMutex 
1280: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
1290: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
12a0: 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
12b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
12c0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
12d0: 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65  Mutex && !sqlite
12e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
12f0: 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  nitMutex ){.    
1300: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1310: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
1320: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1330: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65  GlobalConfig.nRe
1340: 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20  fInitMutex++;.  
1350: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1360: 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
1370: 3b 0a 0a 20 20 2f 2a 20 49 66 20 75 6e 61 62 6c  ;..  /* If unabl
1380: 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
1390: 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79  the malloc subsy
13a0: 73 74 65 6d 2c 20 74 68 65 6e 20 72 65 74 75 72  stem, then retur
13b0: 6e 20 65 61 72 6c 79 2e 0a 20 20 2a 2a 20 54 68  n early..  ** Th
13c0: 65 72 65 20 69 73 20 6c 69 74 74 6c 65 20 68 6f  ere is little ho
13d0: 70 65 20 6f 66 20 67 65 74 74 69 6e 67 20 53 51  pe of getting SQ
13e0: 4c 69 74 65 20 74 6f 20 72 75 6e 20 69 66 20 74  Lite to run if t
13f0: 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73  he malloc.  ** s
1400: 75 62 73 79 73 74 65 6d 20 63 61 6e 6e 6f 74 20  ubsystem cannot 
1410: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
1420: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
1430: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1440: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1450: 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65 73 74    /* Do the rest
1460: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
1470: 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65  zation under the
1480: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
1490: 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 77 65   so.  ** that we
14a0: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
14b0: 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73 69 76   handle recursiv
14c0: 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a  e calls into.  *
14d0: 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
14e0: 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72 65 63  lize().  The rec
14f0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72  ursive calls nor
1500: 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75  mally come throu
1510: 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  gh.  ** sqlite3_
1520: 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e 20 69  os_init() when i
1530: 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  t invokes sqlite
1540: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 29  3_vfs_register()
1550: 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a  , but other.  **
1560: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1570: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 70   might also be p
1580: 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
1590: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
15a0: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
15b0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
15c0: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
15d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
15e0: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
15f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1600: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1610: 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61 73 68  .    FuncDefHash
1620: 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41   *pHash = &GLOBA
1630: 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73  L(FuncDefHash, s
1640: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63  qlite3GlobalFunc
1650: 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69  tions);.    sqli
1660: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1670: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a  inProgress = 1;.
1680: 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68      memset(pHash
1690: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
16a0: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
16b0: 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ns));.    sqlite
16c0: 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46  3RegisterGlobalF
16d0: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20  unctions();.    
16e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 73 5f  rc = sqlite3_os_
16f0: 69 6e 69 74 28 29 3b 0a 20 20 20 20 69 66 28 20  init();.    if( 
1700: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1710: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1720: 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c  te3PcacheInitial
1730: 69 7a 65 28 29 3b 0a 20 20 20 20 20 20 73 71 6c  ize();.      sql
1740: 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72  ite3PCacheBuffer
1750: 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c  Setup( sqlite3Gl
1760: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65  obalConfig.pPage
1770: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
1780: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1790: 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33  .szPage, sqlite3
17a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61  GlobalConfig.nPa
17b0: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ge);.    }.    s
17c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17d0: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
17e0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  0;.    sqlite3Gl
17f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
1800: 74 20 3d 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  t = (rc==SQLITE_
1810: 4f 4b 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 7d  OK ? 1 : 0);.  }
1820: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1830: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 47 6c  _leave(sqlite3Gl
1840: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1850: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f  Mutex);..  /* Go
1860: 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20   back under the 
1870: 73 74 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64  static mutex and
1880: 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65   clean up the re
1890: 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74  cursive.  ** mut
18a0: 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20  ex to prevent a 
18b0: 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20  resource leak.. 
18c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
18d0: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
18e0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  r);.  sqlite3Glo
18f0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1900: 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28  itMutex--;.  if(
1910: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1920: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1930: 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ex<=0 ){.    ass
1940: 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ert( sqlite3Glob
1950: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
1960: 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  tMutex==0 );.   
1970: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
1980: 72 65 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ree(sqlite3Globa
1990: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
19a0: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
19b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
19c0: 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d  itMutex = 0;.  }
19d0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
19e0: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
19f0: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1a00: 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61 20 73  wing is just a s
1a10: 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d  anity check to m
1a20: 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74 65 20  ake sure SQLite 
1a30: 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f  has.  ** been co
1a40: 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74 6c 79  mpiled correctly
1a50: 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  .  It is importa
1a60: 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73 20 63  nt to run this c
1a70: 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65  ode, but.  ** we
1a80: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
1a90: 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20  un it too often 
1aa0: 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50 55 20  and soak up CPU 
1ab0: 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20  cycles for no.  
1ac0: 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77  ** reason.  So w
1ad0: 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20 64 75  e run it once du
1ae0: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
1af0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
1b00: 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  f NDEBUG.  /* Th
1b10: 69 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f  is section of co
1b20: 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75  de's only "outpu
1b30: 74 22 20 69 73 20 76 69 61 20 61 73 73 65 72 74  t" is via assert
1b40: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a  () statements. *
1b50: 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c  /.  if ( rc==SQL
1b60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36  ITE_OK ){.    u6
1b70: 34 20 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c  4 x = (((u64)1)<
1b80: 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62  <63)-1;.    doub
1b90: 6c 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74  le y;.    assert
1ba0: 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a  (sizeof(x)==8);.
1bb0: 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f      assert(sizeo
1bc0: 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29  f(x)==sizeof(y))
1bd0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c  ;.    memcpy(&y,
1be0: 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73   &x, 8);.    ass
1bf0: 65 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61  ert( sqlite3IsNa
1c00: 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  N(y) );.  }.#end
1c10: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
1c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74  .}../*.** Undo t
1c30: 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 73 71  he effects of sq
1c40: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1c50: 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65  ().  Must not be
1c60: 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a   called while.**
1c70: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
1c80: 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20  anding database 
1c90: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d  connections or m
1ca0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1cb0: 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e  s or.** while an
1cc0: 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65  y part of SQLite
1cd0: 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e   is otherwise in
1ce0: 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65   use in any thre
1cf0: 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ad.  This.** rou
1d00: 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65  tine is not thre
1d10: 61 64 73 61 66 65 2e 20 20 4e 6f 74 20 62 79 20  adsafe.  Not by 
1d20: 61 20 6c 6f 6e 67 20 73 68 6f 74 2e 0a 2a 2f 0a  a long shot..*/.
1d30: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  int sqlite3_shut
1d40: 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 20 20 73 71  down(void){.  sq
1d50: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1d60: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d  g.isMallocInit =
1d70: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   0;.  sqlite3Pca
1d80: 63 68 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a 20  cheShutdown();. 
1d90: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
1da0: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
1db0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f  ){.    sqlite3_o
1dc0: 73 5f 65 6e 64 28 29 3b 0a 20 20 7d 0a 20 20 69  s_end();.  }.  i
1dd0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1de0: 43 6f 6e 66 69 67 2e 6d 2e 78 53 68 75 74 64 6f  Config.m.xShutdo
1df0: 77 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  wn ){.    sqlite
1e00: 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20  3MallocEnd();.  
1e10: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
1e20: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
1e30: 78 2e 78 4d 75 74 65 78 45 6e 64 20 29 7b 0a 20  x.xMutexEnd ){. 
1e40: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45     sqlite3MutexE
1e50: 6e 64 28 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nd();.  }.  sqli
1e60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1e70: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65  isInit = 0;.  re
1e80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
1ea0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
1eb0: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
1ec0: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
1ed0: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
1ee0: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
1ef0: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
1f00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f10: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
1f20: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
1f30: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
1f40: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
1f50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
1f60: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1f70: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
1f80: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
1f90: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
1fa0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
1fb0: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
1fc0: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
1fd0: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
1fe0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1ff0: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
2000: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2010: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2020: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
2030: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
2040: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
2050: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
2060: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
2070: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
2080: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
2090: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
20a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
20b0: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
20c0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
20d0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
20e0: 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
20f0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
2100: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47  LITE_CONFIG_SING
2110: 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20  LETHREAD: {.    
2120: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c    /* Disable all
2130: 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20   mutexing */.   
2140: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2150: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2160: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  x = 0;.      sql
2170: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2180: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b  .bFullMutex = 0;
2190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
21a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
21b0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49  ITE_CONFIG_MULTI
21c0: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
21d0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
21e0: 69 6e 67 20 6f 66 20 64 61 74 61 62 61 73 65 20  ing of database 
21f0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
2200: 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d       /* Enable m
2210: 75 74 65 78 69 6e 67 20 6f 66 20 63 6f 72 65 20  utexing of core 
2220: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
2230: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2240: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
2250: 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20  reMutex = 1;.   
2260: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2270: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
2280: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  x = 0;.      bre
2290: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
22a0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
22b0: 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20  _SERIALIZED: {. 
22c0: 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61       /* Enable a
22d0: 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20  ll mutexing */. 
22e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
22f0: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
2300: 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  tex = 1;.      s
2310: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2320: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
2330: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
2340: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2350: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
2360: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
2370: 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72  Specify an alter
2380: 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63 20 69 6d  native malloc im
2390: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
23a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
23b0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76  balConfig.m = *v
23c0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
23d0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b  3_mem_methods*);
23e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
23f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2400: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41  ITE_CONFIG_GETMA
2410: 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LLOC: {.      /*
2420: 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75   Retrieve the cu
2430: 72 72 65 6e 74 20 6d 61 6c 6c 6f 63 28 29 20 69  rrent malloc() i
2440: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
2450: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2460: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2470: 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71  .xMalloc==0 ) sq
2480: 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75  lite3MemSetDefau
2490: 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f  lt();.      *va_
24a0: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
24b0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20  mem_methods*) = 
24c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
24d0: 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65  fig.m;.      bre
24e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
24f0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2500: 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  _MUTEX: {.      
2510: 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c  /* Specify an al
2520: 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78 20  ternative mutex 
2530: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
2540: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2550: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
2560: 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  x = *va_arg(ap, 
2570: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
2580: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
2590: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
25b0: 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20  IG_GETMUTEX: {. 
25c0: 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65       /* Retrieve
25d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74   the current mut
25e0: 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ex implementatio
25f0: 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61  n */.      *va_a
2600: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d  rg(ap, sqlite3_m
2610: 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d  utex_methods*) =
2620: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2630: 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20  nfig.mutex;.    
2640: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2650: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2660: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a  ONFIG_MEMSTATUS:
2670: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62   {.      /* Enab
2680: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
2690: 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74 75 73 20  e malloc status 
26a0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  collection */.  
26b0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
26c0: 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74  lConfig.bMemstat
26d0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
26e0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
26f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2700: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43  SQLITE_CONFIG_SC
2710: 52 41 54 43 48 3a 20 7b 0a 20 20 20 20 20 20 2f  RATCH: {.      /
2720: 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62 75  * Designate a bu
2730: 66 66 65 72 20 66 6f 72 20 73 63 72 61 74 63 68  ffer for scratch
2740: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f   memory space */
2750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2760: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61  obalConfig.pScra
2770: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
2780: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
2790: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
27a0: 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 76  ig.szScratch = v
27b0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
27c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
27d0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74  balConfig.nScrat
27e0: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
27f0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
2800: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2810: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2820: 50 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20  PAGECACHE: {.   
2830: 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20     /* Designate 
2840: 61 20 62 75 66 66 65 72 20 66 6f 72 20 73 63 72  a buffer for scr
2850: 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61 63  atch memory spac
2860: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
2870: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
2880: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
2890: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
28a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
28b0: 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f  fig.szPage = va_
28c0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
28d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
28e0: 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20  lConfig.nPage = 
28f0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
2900: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2910: 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
2920: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
2930: 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e  EMSYS3) || defin
2940: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2950: 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61  _MEMSYS5).    ca
2960: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2970: 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f  _HEAP: {.      /
2980: 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62 75  * Designate a bu
2990: 66 66 65 72 20 66 6f 72 20 68 65 61 70 20 6d 65  ffer for heap me
29a0: 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20  mory space */.  
29b0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
29c0: 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20  lConfig.pHeap = 
29d0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
29e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29f0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65  GlobalConfig.nHe
2a00: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
2a10: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
2a20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2a30: 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61  mnReq = va_arg(a
2a40: 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20  p, int);..      
2a50: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2a60: 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30  lConfig.pHeap==0
2a70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2a80: 66 20 74 68 65 20 68 65 61 70 20 70 6f 69 6e 74  f the heap point
2a90: 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  er is NULL, then
2aa0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 6d 61 6c   restore the mal
2ab0: 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  loc implementati
2ac0: 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  on.        ** ba
2ad0: 63 6b 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74  ck to NULL point
2ae0: 65 72 73 20 74 6f 6f 2e 20 20 54 68 69 73 20 77  ers too.  This w
2af0: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 6d 61  ill cause the ma
2b00: 6c 6c 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20 20  lloc to go.     
2b10: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74     ** back to it
2b20: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
2b30: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
2b40: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
2b50: 28 29 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  () is.        **
2b60: 20 72 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f   run..        */
2b70: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
2b80: 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  &sqlite3GlobalCo
2b90: 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f  nfig.m, 0, sizeo
2ba0: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  f(sqlite3GlobalC
2bb0: 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20  onfig.m));.     
2bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bd0: 2f 2a 20 54 68 65 20 68 65 61 70 20 70 6f 69 6e  /* The heap poin
2be0: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
2bf0: 20 74 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e   then install on
2c00: 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
2c10: 20 2a 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e   ** mem5.c/mem3.
2c20: 63 20 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e 65  c methods. If ne
2c30: 69 74 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45 4d  ither ENABLE_MEM
2c40: 53 59 53 33 20 6e 6f 72 0a 20 20 20 20 20 20 20  SYS3 nor.       
2c50: 20 2a 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59   ** ENABLE_MEMSY
2c60: 53 35 20 69 73 20 64 65 66 69 6e 65 64 2c 20 72  S5 is defined, r
2c70: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  eturn an error..
2c80: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
2c90: 65 66 61 75 6c 74 20 63 61 73 65 20 61 6e 64 20  efault case and 
2ca0: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e  return an error.
2cb0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64  .        */.#ifd
2cc0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2cd0: 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20  _MEMSYS3.       
2ce0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2cf0: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
2d00: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29  3MemGetMemsys3()
2d10: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
2d20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
2d30: 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71  MSYS5.        sq
2d40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2d50: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
2d60: 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23  mGetMemsys5();.#
2d70: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
2d80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2d90: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
2da0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
2db0: 4c 45 5f 4d 45 4d 53 59 53 36 29 0a 20 20 20 20  LE_MEMSYS6).    
2dc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2dd0: 49 47 5f 43 48 55 4e 4b 41 4c 4c 4f 43 3a 20 7b  IG_CHUNKALLOC: {
2de0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2df0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 6d 61 6c  obalConfig.nSmal
2e00: 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  l = va_arg(ap, i
2e10: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
2e20: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2e30: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
2e40: 74 4d 65 6d 73 79 73 36 28 29 3b 0a 20 20 20 20  tMemsys6();.    
2e50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
2e60: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
2e70: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
2e80: 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20  OKASIDE: {.     
2e90: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2ea0: 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65  nfig.szLookaside
2eb0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
2ec0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2ed0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c  3GlobalConfig.nL
2ee0: 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72  ookaside = va_ar
2ef0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
2f00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
2f10: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
2f20: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
2f40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
2f50: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
2f60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2f70: 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f  ** Set up the lo
2f80: 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20  okaside buffers 
2f90: 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
2fa0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65  onnection..** Re
2fb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
2fc0: 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20  n success.  .** 
2fd0: 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20  If lookaside is 
2fe0: 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20  already active, 
2ff0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
3000: 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a  SY..**.** The sz
3010: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
3020: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
3030: 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73  s in each lookas
3040: 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65  ide slot..** The
3050: 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69   cnt parameter i
3060: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
3070: 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72  slots.  If pStar
3080: 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a  t is NULL the.**
3090: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c   space for the l
30a0: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
30b0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
30c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
30d0: 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20  )..** If pStart 
30e0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
30f0: 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79   it is sz*cnt by
3100: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  tes of memory to
3110: 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20   use for.** the 
3120: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
3130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3140: 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73  setupLookaside(s
3150: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
3160: 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20   *pBuf, int sz, 
3170: 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64  int cnt){.  void
3180: 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20   *pStart;.  if( 
3190: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
31a0: 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ut ){.    return
31b0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
31c0: 7d 0a 20 20 69 66 28 20 73 7a 3c 30 20 29 20 73  }.  if( sz<0 ) s
31d0: 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e 74  z = 0;.  if( cnt
31e0: 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20  <0 ) cnt = 0;.  
31f0: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
3200: 20 20 20 73 7a 20 3d 20 28 73 7a 20 2b 20 37 29     sz = (sz + 7)
3210: 26 7e 37 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  &~7;.    sqlite3
3220: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
3230: 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20  c();.    pStart 
3240: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
3250: 20 73 7a 2a 63 6e 74 20 29 3b 0a 20 20 20 20 73   sz*cnt );.    s
3260: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
3270: 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 65 6c 73 65  alloc();.  }else
3280: 7b 0a 20 20 20 20 73 7a 20 3d 20 73 7a 26 7e 37  {.    sz = sz&~7
3290: 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  ;.    pStart = p
32a0: 42 75 66 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  Buf;.  }.  if( d
32b0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
32c0: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
32d0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
32e0: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
32f0: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.  }.  db->look
3300: 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20 70  aside.pStart = p
3310: 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f  Start;.  db->loo
3320: 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30  kaside.pFree = 0
3330: 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ;.  db->lookasid
3340: 65 2e 73 7a 20 3d 20 73 7a 3b 0a 20 20 64 62 2d  e.sz = sz;.  db-
3350: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
3360: 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 3b 0a  oced = pBuf==0;.
3370: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
3380: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c      int i;.    L
3390: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b  ookasideSlot *p;
33a0: 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73  .    p = (Lookas
33b0: 69 64 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b  ideSlot*)pStart;
33c0: 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31  .    for(i=cnt-1
33d0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
33e0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64      p->pNext = d
33f0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72  b->lookaside.pFr
3400: 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f  ee;.      db->lo
3410: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20  okaside.pFree = 
3420: 70 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f  p;.      p = (Lo
3430: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28  okasideSlot*)&((
3440: 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20  u8*)p)[sz];.    
3450: 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  }.    db->lookas
3460: 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20  ide.pEnd = p;.  
3470: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
3480: 62 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20  bEnabled = 1;.  
3490: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c  }else{.    db->l
34a0: 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20  ookaside.pEnd = 
34b0: 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  0;.    db->looka
34c0: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
34d0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
34e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
34f0: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
3500: 6e 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61  n settings for a
3510: 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74  n individual dat
3520: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
3530: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
3540: 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65  db_config(sqlite
3550: 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e  3 *db, int op, .
3560: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
3570: 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76  p;.  int rc;.  v
3580: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
3590: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
35a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
35b0: 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53  _DBCONFIG_LOOKAS
35c0: 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  IDE: {.      voi
35d0: 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67  d *pBuf = va_arg
35e0: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
35f0: 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61     int sz = va_a
3600: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3610: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f     int cnt = va_
3620: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3630: 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f      rc = setupLo
3640: 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66  okaside(db, pBuf
3650: 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20  , sz, cnt);.    
3660: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3670: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
3680: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3690: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
36a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
36b0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
36c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
36d0: 2a 20 52 6f 75 74 69 6e 65 20 6e 65 65 64 65 64  * Routine needed
36e0: 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65 20   to support the 
36f0: 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
3700: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3710: 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
3720: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 76  .void sqlite3Cov
3730: 65 72 61 67 65 28 69 6e 74 20 78 29 7b 0a 20 20  erage(int x){.  
3740: 73 74 61 74 69 63 20 69 6e 74 20 64 75 6d 6d 79  static int dummy
3750: 20 3d 20 30 3b 0a 20 20 64 75 6d 6d 79 20 2b 3d   = 0;.  dummy +=
3760: 20 78 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   x;.}.#endif.../
3770: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
3780: 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
3790: 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e  [0..n-1] contain
37a0: 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f  s all spaces..*/
37b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53  .static int allS
37c0: 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72  paces(const char
37d0: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77   *z, int n){.  w
37e0: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e  hile( n>0 && z[n
37f0: 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b  -1]==' ' ){ n--;
3800: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30   }.  return n==0
3810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3820: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  is the default c
3830: 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
3840: 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22  n named "BINARY"
3850: 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73   which is always
3860: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  .** available..*
3870: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46  *.** If the padF
3880: 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
3890: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70  not NULL then sp
38a0: 61 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74  ace padding at t
38b0: 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72  he end.** of str
38c0: 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e  ings is ignored.
38d0: 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74    This implement
38e0: 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c  s the RTRIM coll
38f0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
3900: 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63   int binCollFunc
3910: 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61  (.  void *padFla
3920: 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g,.  int nKey1, 
3930: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
3940: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
3950: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
3960: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e  2.){.  int rc, n
3970: 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b  ;.  n = nKey1<nK
3980: 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b  ey2 ? nKey1 : nK
3990: 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63  ey2;.  rc = memc
39a0: 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c  mp(pKey1, pKey2,
39b0: 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   n);.  if( rc==0
39c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46   ){.    if( padF
39d0: 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  lag.     && allS
39e0: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
39f0: 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29  ey1)+n, nKey1-n)
3a00: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
3a10: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32  es(((char*)pKey2
3a20: 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20  )+n, nKey2-n).  
3a30: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65    ){.      /* Le
3a40: 61 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64  ave rc unchanged
3a50: 20 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c   at 0 */.    }el
3a60: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e  se{.      rc = n
3a70: 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20  Key1 - nKey2;.  
3a80: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3a90: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e   rc;.}../*.** An
3aa0: 6f 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63  other built-in c
3ab0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
3ac0: 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a  e: NOCASE. .**.*
3ad0: 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67  * This collating
3ae0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74   sequence is int
3af0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
3b00: 20 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70   for "case indep
3b10: 65 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72  endant.** compar
3b20: 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20  ison". SQLite's 
3b30: 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70  knowledge of upp
3b40: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73  er and lower cas
3b50: 65 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a  e equivalents.**
3b60: 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f   extends only to
3b70: 20 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65   the 26 characte
3b80: 72 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45  rs used in the E
3b90: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e  nglish language.
3ba0: 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f  .**.** At the mo
3bb0: 6d 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e  ment there is on
3bc0: 6c 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65  ly a UTF-8 imple
3bd0: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  mentation..*/.st
3be0: 61 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43  atic int nocaseC
3bf0: 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20  ollatingFunc(.  
3c00: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3c10: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
3c20: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20  t void *pKey1,. 
3c30: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
3c40: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
3c50: 0a 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74  .  int r = sqlit
3c60: 65 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20  e3StrNICmp(.    
3c70: 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29    (const char *)
3c80: 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68  pKey1, (const ch
3c90: 61 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65  ar *)pKey2, (nKe
3ca0: 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a  y1<nKey2)?nKey1:
3cb0: 6e 4b 65 79 32 29 3b 0a 20 20 69 66 28 20 30 3d  nKey2);.  if( 0=
3cc0: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
3cd0: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
3ce0: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
3cf0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
3d00: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
3d10: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
3d20: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
3d30: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
3d40: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
3d50: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
3d60: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
3d70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3d80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
3d90: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
3da0: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
3db0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
3dc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3dd0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
3de0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
3df0: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  ->nChange;.}../*
3e00: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
3e10: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
3e20: 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62   since the datab
3e30: 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f  ase handle was o
3e40: 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pened..*/.int sq
3e50: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
3e60: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
3e70: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e  {.  return db->n
3e80: 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a  TotalChange;.}..
3e90: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65  /*.** Close an e
3ea0: 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64  xisting SQLite d
3eb0: 61 74 61 62 61 73 65 0a 2a 2f 0a 69 6e 74 20 73  atabase.*/.int s
3ec0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c  qlite3_close(sql
3ed0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73  ite3 *db){.  Has
3ee0: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 6e 74 20  hElem *i;.  int 
3ef0: 6a 3b 0a 0a 20 20 69 66 28 20 21 64 62 20 29 7b  j;..  if( !db ){
3f00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3f10: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
3f20: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
3f30: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
3f40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
3f50: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
3f60: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
3f70: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
3f80: 78 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  x);..#ifdef SQLI
3f90: 54 45 5f 53 53 45 0a 20 20 7b 0a 20 20 20 20 65  TE_SSE.  {.    e
3fa0: 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69 74  xtern void sqlit
3fb0: 65 33 53 73 65 43 6c 65 61 6e 75 70 28 73 71 6c  e3SseCleanup(sql
3fc0: 69 74 65 33 2a 29 3b 0a 20 20 20 20 73 71 6c 69  ite3*);.    sqli
3fd0: 74 65 33 53 73 65 43 6c 65 61 6e 75 70 28 64 62  te3SseCleanup(db
3fe0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a  );.  }.#endif ..
3ff0: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e    sqlite3ResetIn
4000: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
4010: 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20   0);..  /* If a 
4020: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
4030: 70 65 6e 2c 20 74 68 65 20 52 65 73 65 74 49 6e  pen, the ResetIn
4040: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 29 20 63  ternalSchema() c
4050: 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  all above.  ** w
4060: 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c  ill not have cal
4070: 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e  led the xDisconn
4080: 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20  ect() method on 
4090: 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a  any virtual.  **
40a0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64   tables in the d
40b0: 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
40c0: 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ay. The followin
40d0: 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c  g sqlite3VtabRol
40e0: 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c  lback().  ** cal
40f0: 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65  l will do so. We
4100: 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73   need to do this
4110: 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63   before the chec
4120: 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a  k for active.  *
4130: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
4140: 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76   below, as the v
4150: 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  -table implement
4160: 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f  ation may be sto
4170: 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70  ring.  ** some p
4180: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
4190: 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ts internally.. 
41a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61   */.  sqlite3Vta
41b0: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a  bRollback(db);..
41c0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
41d0: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
41e0: 67 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 53 51  g VMs, return SQ
41f0: 4c 49 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20  LITE_BUSY. */.  
4200: 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b  if( db->pVdbe ){
4210: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4220: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  r(db, SQLITE_BUS
4230: 59 2c 20 0a 20 20 20 20 20 20 20 20 22 55 6e 61  Y, .        "Una
4240: 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65  ble to close due
4250: 20 74 6f 20 75 6e 66 69 6e 61 6c 69 73 65 64 20   to unfinalised 
4260: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
4270: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
4280: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
4290: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
42a0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
42b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
42c0: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
42d0: 4f 6b 28 64 62 29 20 29 3b 0a 0a 20 20 66 6f 72  Ok(db) );..  for
42e0: 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b  (j=0; j<db->nDb;
42f0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   j++){.    struc
4300: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
4310: 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  >aDb[j];.    if(
4320: 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pDb->pBt ){.   
4330: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
4340: 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a  lose(pDb->pBt);.
4350: 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d        pDb->pBt =
4360: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21   0;.      if( j!
4370: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =1 ){.        pD
4380: 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a  b->pSchema = 0;.
4390: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
43a0: 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 73 65 74  }.  sqlite3Reset
43b0: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
43c0: 62 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  b, 0);.  assert(
43d0: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20   db->nDb<=2 );. 
43e0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
43f0: 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  ==db->aDbStatic 
4400: 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
4410: 41 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46  ArraySize(db->aF
4420: 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20  unc.a); j++){.  
4430: 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74    FuncDef *pNext
4440: 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20  , *pHash, *p;.  
4450: 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e    for(p=db->aFun
4460: 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61  c.a[j]; p; p=pHa
4470: 73 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68  sh){.      pHash
4480: 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20   = p->pHash;.   
4490: 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20     while( p ){. 
44a0: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
44b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
44c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
44d0: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70  b, p);.        p
44e0: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20   = pNext;.      
44f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  }.    }.  }.  fo
4500: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
4510: 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  rst(&db->aCollSe
4520: 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  q); i; i=sqliteH
4530: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
4540: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
4550: 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c  = (CollSeq *)sql
4560: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
4570: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e      /* Invoke an
4580: 79 20 64 65 73 74 72 75 63 74 6f 72 73 20 72 65  y destructors re
4590: 67 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c  gistered for col
45a0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
45b0: 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20  user data. */.  
45c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
45d0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
45e0: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b  pColl[j].xDel ){
45f0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a  .        pColl[j
4600: 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e  ].xDel(pColl[j].
4610: 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pUser);.      }.
4620: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4630: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
4640: 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
4650: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
4660: 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
4670: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
4680: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f  IRTUALTABLE.  fo
4690: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
46a0: 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  rst(&db->aModule
46b0: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
46c0: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
46d0: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28  Module *pMod = (
46e0: 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48  Module *)sqliteH
46f0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
4700: 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72  if( pMod->xDestr
4710: 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64  oy ){.      pMod
4720: 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d  ->xDestroy(pMod-
4730: 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20  >pAux);.    }.  
4740: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4750: 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20  db, pMod);.  }. 
4760: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
4770: 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  r(&db->aModule);
4780: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
4790: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
47a0: 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65  TE_OK, 0); /* De
47b0: 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61  allocates any ca
47c0: 63 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e  ched error strin
47d0: 67 73 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  gs. */.  if( db-
47e0: 3e 70 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >pErr ){.    sql
47f0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
4800: 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73  ->pErr);.  }.  s
4810: 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e  qlite3CloseExten
4820: 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62  sions(db);..  db
4830: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
4840: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
4850: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
4860: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
4870: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
4880: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
4890: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
48a0: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
48b0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
48c0: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
48d0: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
48e0: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
48f0: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
4900: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
4910: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
4920: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
4930: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
4940: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
4950: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
4960: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
4970: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
4980: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
4990: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
49a0: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
49b0: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
49c0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
49d0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
49e0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
49f0: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
4a00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
4a10: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
4a20: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
4a30: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
4a40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4a50: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
4a60: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71  Start);.  }.  sq
4a70: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a  lite3_free(db);.
4a80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4a90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
4aa0: 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61  lback all databa
4ab0: 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69  se files..*/.voi
4ac0: 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
4ad0: 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  kAll(sqlite3 *db
4ae0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
4af0: 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20  t inTrans = 0;. 
4b00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4b10: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
4b20: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
4b30: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
4b40: 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d  lloc();.  for(i=
4b50: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
4b60: 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  +){.    if( db->
4b70: 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a 20 20  aDb[i].pBt ){.  
4b80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
4b90: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 64 62  treeIsInTrans(db
4ba0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b  ->aDb[i].pBt) ){
4bb0: 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73  .        inTrans
4bc0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
4bd0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
4be0: 52 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 61 44 62  Rollback(db->aDb
4bf0: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20  [i].pBt);.      
4c00: 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61  db->aDb[i].inTra
4c10: 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ns = 0;.    }.  
4c20: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52  }.  sqlite3VtabR
4c30: 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73  ollback(db);.  s
4c40: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
4c50: 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20  alloc();..  if( 
4c60: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
4c70: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
4c80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4c90: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
4ca0: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73  ments(db);.    s
4cb0: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
4cc0: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
4cd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f  ;.  }..  /* If o
4ce0: 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ne has been conf
4cf0: 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74  igured, invoke t
4d00: 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b  he rollback-hook
4d10: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   callback */.  i
4d20: 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  f( db->xRollback
4d30: 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54  Callback && (inT
4d40: 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74  rans || !db->aut
4d50: 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20  oCommit) ){.    
4d60: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
4d70: 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62  lback(db->pRollb
4d80: 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a  ackArg);.  }.}..
4d90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
4da0: 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61  tatic string tha
4db0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
4dc0: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
4dd0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
4de0: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63  * argument..*/.c
4df0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
4e00: 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29  e3ErrStr(int rc)
4e10: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
4e20: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  z;.  switch( rc 
4e30: 26 20 30 78 66 66 20 29 7b 0a 20 20 20 20 63 61  & 0xff ){.    ca
4e40: 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 0a 20  se SQLITE_ROW:. 
4e50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
4e60: 4f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ONE:.    case SQ
4e70: 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20  LITE_OK:        
4e80: 20 7a 20 3d 20 22 6e 6f 74 20 61 6e 20 65 72 72   z = "not an err
4e90: 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  or";            
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
4eb0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
4ec0: 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20  LITE_ERROR:     
4ed0: 20 7a 20 3d 20 22 53 51 4c 20 6c 6f 67 69 63 20   z = "SQL logic 
4ee0: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
4ef0: 20 64 61 74 61 62 61 73 65 22 3b 20 20 20 62 72   database";   br
4f00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
4f10: 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20  LITE_PERM:      
4f20: 20 7a 20 3d 20 22 61 63 63 65 73 73 20 70 65 72   z = "access per
4f30: 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 3b  mission denied";
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
4f50: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
4f60: 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20  LITE_ABORT:     
4f70: 20 7a 20 3d 20 22 63 61 6c 6c 62 61 63 6b 20 72   z = "callback r
4f80: 65 71 75 65 73 74 65 64 20 71 75 65 72 79 20 61  equested query a
4f90: 62 6f 72 74 22 3b 20 20 20 20 20 20 20 20 62 72  bort";        br
4fa0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
4fb0: 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20  LITE_BUSY:      
4fc0: 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 69   z = "database i
4fd0: 73 20 6c 6f 63 6b 65 64 22 3b 20 20 20 20 20 20  s locked";      
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
4ff0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5000: 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20  LITE_LOCKED:    
5010: 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 74   z = "database t
5020: 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 3b  able is locked";
5030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
5040: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5050: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  LITE_NOMEM:     
5060: 20 7a 20 3d 20 22 6f 75 74 20 6f 66 20 6d 65 6d   z = "out of mem
5070: 6f 72 79 22 3b 20 20 20 20 20 20 20 20 20 20 20  ory";           
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
5090: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
50a0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20  LITE_READONLY:  
50b0: 20 7a 20 3d 20 22 61 74 74 65 6d 70 74 20 74 6f   z = "attempt to
50c0: 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c   write a readonl
50d0: 79 20 64 61 74 61 62 61 73 65 22 3b 20 20 62 72  y database";  br
50e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
50f0: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20  LITE_INTERRUPT: 
5100: 20 7a 20 3d 20 22 69 6e 74 65 72 72 75 70 74 65   z = "interrupte
5110: 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d";             
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
5130: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5140: 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20  LITE_IOERR:     
5150: 20 7a 20 3d 20 22 64 69 73 6b 20 49 2f 4f 20 65   z = "disk I/O e
5160: 72 72 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20  rror";          
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
5180: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5190: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20  LITE_CORRUPT:   
51a0: 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 64   z = "database d
51b0: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
51c0: 66 6f 72 6d 65 64 22 3b 20 20 20 20 20 20 62 72  formed";      br
51d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
51e0: 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20  LITE_FULL:      
51f0: 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 6f   z = "database o
5200: 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 3b  r disk is full";
5210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
5220: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5230: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20  LITE_CANTOPEN:  
5240: 20 7a 20 3d 20 22 75 6e 61 62 6c 65 20 74 6f 20   z = "unable to 
5250: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
5260: 6c 65 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  le";          br
5270: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5280: 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20  LITE_EMPTY:     
5290: 20 7a 20 3d 20 22 74 61 62 6c 65 20 63 6f 6e 74   z = "table cont
52a0: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 3b 20 20  ains no data";  
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
52c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
52d0: 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20  LITE_SCHEMA:    
52e0: 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 73   z = "database s
52f0: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
5300: 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72  d";           br
5310: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5320: 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20  LITE_TOOBIG:    
5330: 20 7a 20 3d 20 22 53 74 72 69 6e 67 20 6f 72 20   z = "String or 
5340: 42 4c 4f 42 20 65 78 63 65 65 64 65 64 20 73 69  BLOB exceeded si
5350: 7a 65 20 6c 69 6d 69 74 22 3b 20 20 20 20 62 72  ze limit";    br
5360: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5370: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a  LITE_CONSTRAINT:
5380: 20 7a 20 3d 20 22 63 6f 6e 73 74 72 61 69 6e 74   z = "constraint
5390: 20 66 61 69 6c 65 64 22 3b 20 20 20 20 20 20 20   failed";       
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
53b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
53c0: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20  LITE_MISMATCH:  
53d0: 20 7a 20 3d 20 22 64 61 74 61 74 79 70 65 20 6d   z = "datatype m
53e0: 69 73 6d 61 74 63 68 22 3b 20 20 20 20 20 20 20  ismatch";       
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
5400: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5410: 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20  LITE_MISUSE:    
5420: 20 7a 20 3d 20 22 6c 69 62 72 61 72 79 20 72 6f   z = "library ro
5430: 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74  utine called out
5440: 20 6f 66 20 73 65 71 75 65 6e 63 65 22 3b 62 72   of sequence";br
5450: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5460: 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20  LITE_NOLFS:     
5470: 20 7a 20 3d 20 22 6c 61 72 67 65 20 66 69 6c 65   z = "large file
5480: 20 73 75 70 70 6f 72 74 20 69 73 20 64 69 73 61   support is disa
5490: 62 6c 65 64 22 3b 20 20 20 20 20 20 20 20 62 72  bled";        br
54a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
54b0: 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20  LITE_AUTH:      
54c0: 20 7a 20 3d 20 22 61 75 74 68 6f 72 69 7a 61 74   z = "authorizat
54d0: 69 6f 6e 20 64 65 6e 69 65 64 22 3b 20 20 20 20  ion denied";    
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
54f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5500: 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20  LITE_FORMAT:    
5510: 20 7a 20 3d 20 22 61 75 78 69 6c 69 61 72 79 20   z = "auxiliary 
5520: 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20  database format 
5530: 65 72 72 6f 72 22 3b 20 20 20 20 20 20 20 62 72  error";       br
5540: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5550: 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20  LITE_RANGE:     
5560: 20 7a 20 3d 20 22 62 69 6e 64 20 6f 72 20 63 6f   z = "bind or co
5570: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f  lumn index out o
5580: 66 20 72 61 6e 67 65 22 3b 20 20 20 20 20 62 72  f range";     br
5590: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
55a0: 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20  LITE_NOTADB:    
55b0: 20 7a 20 3d 20 22 66 69 6c 65 20 69 73 20 65 6e   z = "file is en
55c0: 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f  crypted or is no
55d0: 74 20 61 20 64 61 74 61 62 61 73 65 22 3b 62 72  t a database";br
55e0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
55f0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
5600: 20 7a 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72   z = "unknown er
5610: 72 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20 20  ror";           
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
5630: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
5640: 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n z;.}../*.** Th
5650: 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
5660: 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c  ments a busy cal
5670: 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70  lback that sleep
5680: 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61  s and tries.** a
5690: 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d  gain until a tim
56a0: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65  eout value is re
56b0: 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65  ached.  The time
56c0: 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  out value is.** 
56d0: 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
56e0: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
56f0: 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74  s passed in as t
5700: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
5710: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
5720: 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c  int sqliteDefaul
5730: 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20  tBusyCallback(. 
5740: 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20  void *ptr,      
5750: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5760: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5770: 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20  */. int count   
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5790: 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  Number of times 
57a0: 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62  table has been b
57b0: 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51  usy */.){.#if SQ
57c0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28  LITE_OS_WIN || (
57d0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
57e0: 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
57f0: 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63 6f  EEP).  static co
5800: 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20  nst u8 delays[] 
5810: 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35  =.     { 1, 2, 5
5820: 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35  , 10, 15, 20, 25
5830: 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20  , 25,  25,  50, 
5840: 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74   50, 100 };.  st
5850: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f  atic const u8 to
5860: 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  tals[] =.     { 
5870: 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c  0, 1, 3,  8, 18,
5880: 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33   33, 53, 78, 103
5890: 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20  , 128, 178, 228 
58a0: 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c  };.# define NDEL
58b0: 41 59 20 28 73 69 7a 65 6f 66 28 64 65 6c 61 79  AY (sizeof(delay
58c0: 73 29 2f 73 69 7a 65 6f 66 28 64 65 6c 61 79 73  s)/sizeof(delays
58d0: 5b 30 5d 29 29 0a 20 20 73 71 6c 69 74 65 33 20  [0])).  sqlite3 
58e0: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
58f0: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
5900: 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69  out = db->busyTi
5910: 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c  meout;.  int del
5920: 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73  ay, prior;..  as
5930: 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29  sert( count>=0 )
5940: 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20  ;.  if( count < 
5950: 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65  NDELAY ){.    de
5960: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75  lay = delays[cou
5970: 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  nt];.    prior =
5980: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a   totals[count];.
5990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c    }else{.    del
59a0: 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c  ay = delays[NDEL
59b0: 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72  AY-1];.    prior
59c0: 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59   = totals[NDELAY
59d0: 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75  -1] + delay*(cou
59e0: 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a  nt-(NDELAY-1));.
59f0: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
5a00: 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75  + delay > timeou
5a10: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
5a20: 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72   timeout - prior
5a30: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
5a40: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
5a50: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
5a60: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
5a70: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
5a80: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73  urn 1;.#else.  s
5a90: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
5aa0: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
5ab0: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73  nt timeout = ((s
5ac0: 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62  qlite3 *)ptr)->b
5ad0: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66  usyTimeout;.  if
5ae0: 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30  ( (count+1)*1000
5af0: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
5b00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5b10: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
5b20: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
5b30: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
5b40: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
5b50: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
5b60: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
5b70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5b80: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
5b90: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
5ba0: 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63  ailed with a loc
5bb0: 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  k..** If this ro
5bc0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
5bd0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
5be0: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
5bf0: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
5c00: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
5c10: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
5c20: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
5c30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5c40: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
5c50: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
5c60: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
5c70: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c  f( NEVER(p==0) |
5c80: 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c  | p->xFunc==0 ||
5c90: 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65   p->nBusy<0 ) re
5ca0: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70  turn 0;.  rc = p
5cb0: 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c  ->xFunc(p->pArg,
5cc0: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66   p->nBusy);.  if
5cd0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
5ce0: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
5cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
5d00: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
5d10: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
5d20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
5d30: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
5d40: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
5d50: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
5d60: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
5d70: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
5d80: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
5d90: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
5da0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
5db0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
5dc0: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
5dd0: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
5de0: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
5df0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
5e00: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
5e10: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
5e20: 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79  er.xFunc = xBusy
5e30: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
5e40: 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b  ler.pArg = pArg;
5e50: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
5e60: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
5e70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
5e80: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
5e90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5ea0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
5eb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
5ec0: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
5ed0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5ee0: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
5ef0: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
5f00: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
5f10: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
5f20: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
5f30: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
5f40: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
5f50: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
5f60: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
5f70: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
5f80: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
5f90: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
5fa0: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
5fb0: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
5fc0: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
5fd0: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
5fe0: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
5ff0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
6000: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
6010: 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73  tex);.  if( nOps
6020: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50  >0 ){.    db->xP
6030: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
6040: 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  ess;.    db->nPr
6050: 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70 73  ogressOps = nOps
6060: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
6070: 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  essArg = pArg;. 
6080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
6090: 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  xProgress = 0;. 
60a0: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
60b0: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  Ops = 0;.    db-
60c0: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
60d0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
60e0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
60f0: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
6100: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
6110: 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20  outine installs 
6120: 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68  a default busy h
6130: 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74  andler that wait
6140: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65  s for the.** spe
6150: 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66  cified number of
6160: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65   milliseconds be
6170: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30  fore returning 0
6180: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6190: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71  _busy_timeout(sq
61a0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d  lite3 *db, int m
61b0: 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29  s){.  if( ms>0 )
61c0: 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69  {.    db->busyTi
61d0: 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20  meout = ms;.    
61e0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
61f0: 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44  dler(db, sqliteD
6200: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
6210: 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a  ck, (void*)db);.
6220: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
6230: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
6240: 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  r(db, 0, 0);.  }
6250: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6260: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
6270: 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  use any pending 
6280: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f  operation to sto
6290: 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73  p at its earlies
62a0: 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a  t opportunity..*
62b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69  /.void sqlite3_i
62c0: 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33  nterrupt(sqlite3
62d0: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e   *db){.  db->u1.
62e0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
62f0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1;.}.../*.** Thi
6300: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78  s function is ex
6310: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61  actly the same a
6320: 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s sqlite3_create
6330: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63  _function(), exc
6340: 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ept.** that it i
6350: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65  s designed to be
6360: 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72   called by inter
6370: 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69  nal code. The di
6380: 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74  fference is.** t
6390: 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  hat if a malloc(
63a0: 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74  ) fails in sqlit
63b0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
63c0: 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63  on(), an error c
63d0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
63e0: 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f  ed and the mallo
63f0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65  cFailed flag cle
6400: 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  ared. .*/.int sq
6410: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
6420: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
6430: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
6440: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
6450: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
6460: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  nc,.  void *pUse
6470: 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a  rData,.  void (*
6480: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
6490: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
64a0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
64b0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
64c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
64d0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
64e0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
64f0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
6500: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 46  context*).){.  F
6510: 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74  uncDef *p;.  int
6520: 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72   nName;..  asser
6530: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6540: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
6550: 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74   );.  if( zFunct
6560: 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20  ionName==0 ||.  
6570: 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28 78      (xFunc && (x
6580: 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29  Final || xStep))
6590: 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46 75   || .      (!xFu
65a0: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26  nc && (xFinal &&
65b0: 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20   !xStep)) ||.   
65c0: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 21     (!xFunc && (!
65d0: 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29  xFinal && xStep)
65e0: 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67  ) ||.      (nArg
65f0: 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49  <-1 || nArg>SQLI
6600: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
6610: 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32  ARG) ||.      (2
6620: 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  55<(nName = sqli
6630: 74 65 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a 46  te3Strlen(db, zF
6640: 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29  unctionName))) )
6650: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
6660: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52  or(db, SQLITE_ER
6670: 52 4f 52 2c 20 22 62 61 64 20 70 61 72 61 6d 65  ROR, "bad parame
6680: 74 65 72 73 22 29 3b 0a 20 20 20 20 72 65 74 75  ters");.    retu
6690: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
66a0: 0a 20 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20  .  }.  .#ifndef 
66b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
66c0: 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  6.  /* If SQLITE
66d0: 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
66e0: 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
66f0: 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
6700: 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
6710: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
6720: 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
6730: 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
6740: 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
6750: 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
6760: 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
6770: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
6780: 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nally..  **.  **
6790: 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69   If SQLITE_ANY i
67a0: 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64  s specified, add
67b0: 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20   three versions 
67c0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  of the function.
67d0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68    ** to the hash
67e0: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
67f0: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  f( enc==SQLITE_U
6800: 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20  TF16 ){.    enc 
6810: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
6820: 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TIVE;.  }else if
6830: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e  ( enc==SQLITE_AN
6840: 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  Y ){.    int rc;
6850: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6860: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
6870: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
6880: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
6890: 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72  ,.         pUser
68a0: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
68b0: 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 20  ep, xFinal);.   
68c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
68d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
68e0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
68f0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
6900: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
6910: 54 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20 20 20  TE_UTF16LE,.    
6920: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
6930: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
6940: 46 69 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  Final);.    }.  
6950: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6960: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
6970: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
6980: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
6990: 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73  TF16BE;.  }.#els
69a0: 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45  e.  enc = SQLITE
69b0: 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20  _UTF8;.#endif.  
69c0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
69d0: 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74  n existing funct
69e0: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65  ion is being ove
69f0: 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74  rridden or delet
6a00: 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20  ed. If so,.  ** 
6a10: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63  and there are ac
6a20: 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72  tive VMs, then r
6a30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
6a40: 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e  Y. If a function
6a50: 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f  .  ** is being o
6a60: 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65  verridden/delete
6a70: 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20  d but there are 
6a80: 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61  no active VMs, a
6a90: 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70  llow the.  ** op
6aa0: 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69  eration to conti
6ab0: 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61  nue but invalida
6ac0: 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c  te all precompil
6ad0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
6ae0: 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
6af0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
6b00: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
6b10: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 65 6e   nName, nArg, en
6b20: 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26  c, 0);.  if( p &
6b30: 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 65  & p->iPrefEnc==e
6b40: 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e  nc && p->nArg==n
6b50: 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Arg ){.    if( d
6b60: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
6b70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6b80: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
6b90: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
6ba0: 20 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65   "Unable to dele
6bb0: 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66  te/modify user-f
6bc0: 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61  unction due to a
6bd0: 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
6be0: 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ");.      assert
6bf0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
6c00: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
6c10: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
6c20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6c30: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
6c40: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
6c50: 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  s(db);.    }.  }
6c60: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
6c70: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
6c80: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
6c90: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Name, nArg, enc,
6ca0: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
6cb0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
6cc0: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
6cd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6ce0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
6cf0: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20   p->flags = 0;. 
6d00: 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e   p->xFunc = xFun
6d10: 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d 20  c;.  p->xStep = 
6d20: 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e  xStep;.  p->xFin
6d30: 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a  alize = xFinal;.
6d40: 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d    p->pUserData =
6d50: 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d   pUserData;.  p-
6d60: 3e 6e 41 72 67 20 3d 20 6e 41 72 67 3b 0a 20 20  >nArg = nArg;.  
6d70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
6d90: 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74  e new user funct
6da0: 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ions..*/.int sql
6db0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6dc0: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
6dd0: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
6de0: 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  r *zFunctionName
6df0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
6e00: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
6e10: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
6e20: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
6e30: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
6e40: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
6e50: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
6e60: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
6e70: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
6e80: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
6e90: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
6ea0: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  text*).){.  int 
6eb0: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rc;.  sqlite3_mu
6ec0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
6ed0: 74 65 78 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  tex);.  rc = sql
6ee0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
6ef0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
6f00: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
6f10: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  xFunc, xStep, xF
6f20: 69 6e 61 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71  inal);.  rc = sq
6f30: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
6f40: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
6f50: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
6f60: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
6f70: 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
6f80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
6f90: 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  6.int sqlite3_cr
6fa0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28  eate_function16(
6fb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
6fc0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
6fd0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
6fe0: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
6ff0: 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20  TextRep,.  void 
7000: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
7010: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
7020: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
7030: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
7040: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
7050: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
7060: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
7070: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
7080: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
7090: 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  xt*).){.  int rc
70a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38  ;.  char *zFunc8
70b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
70c0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
70d0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
70e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
70f0: 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71  );.  zFunc8 = sq
7100: 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
7110: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
7120: 20 2d 31 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c   -1);.  rc = sql
7130: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
7140: 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c  b, zFunc8, nArg,
7150: 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46   eTextRep, p, xF
7160: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
7170: 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  al);.  sqlite3Db
7180: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
7190: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
71a0: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
71b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
71c0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
71d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
71e0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
71f0: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
7200: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
7210: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
7220: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
7230: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
7240: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
7250: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
7260: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
7270: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
7280: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
7290: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
72a0: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
72b0: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
72c0: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
72d0: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
72e0: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
72f0: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
7300: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
7310: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
7320: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
7330: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
7340: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
7350: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
7360: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
7370: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
7380: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
7390: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
73a0: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
73b0: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
73c0: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
73d0: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
73e0: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
73f0: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
7400: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
7410: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
7420: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
7430: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
7440: 74 72 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 29  trlen(db, zName)
7450: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  ;.  int rc;.  sq
7460: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
7470: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
7480: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46  if( sqlite3FindF
7490: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  unction(db, zNam
74a0: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
74b0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d  SQLITE_UTF8, 0)=
74c0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
74d0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
74e0: 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  zName, nArg, SQL
74f0: 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69  0, sqlite3Invali
7520: 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29  dFunction, 0, 0)
7530: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
7540: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
7550: 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
7560: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7570: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
7580: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
7590: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
75a0: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
75b0: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
75c0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
75d0: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
75e0: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
75f0: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
7600: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
7610: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
7620: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
7630: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
7640: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
7650: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
7660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7670: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
7680: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
7690: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
76a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
76b0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
76c0: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
76d0: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
76e0: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
76f0: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
7700: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
7710: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
7720: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
7730: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
7740: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
7750: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
7760: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
7770: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
7780: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
7790: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
77a0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a  eturn pOld;.}./*
77b0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
77c0: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
77d0: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
77e0: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
77f0: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
7800: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
7810: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
7820: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
7830: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
7840: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
7850: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
7860: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
7870: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
7880: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
7890: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
78a0: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
78b0: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
78c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
78d0: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
78e0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
78f0: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
7900: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
7910: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
7920: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
7930: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
7940: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
7950: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
7960: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
7970: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
7980: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
7990: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
79a0: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
79b0: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
79c0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
79d0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
79e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
79f0: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
7a00: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7a10: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 20  _TRACE */../*** 
7a20: 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 2a 2a 2a  EXPERIMENTAL ***
7a30: 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
7a40: 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  a function to be
7a50: 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20   invoked when a 
7a60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
7a70: 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ents..** If the 
7a80: 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e  invoked function
7a90: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
7aa0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d  o, then the comm
7ab0: 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20  it becomes a.** 
7ac0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  rollback..*/.voi
7ad0: 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69  d *sqlite3_commi
7ae0: 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  t_hook(.  sqlite
7af0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
7b00: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
7b10: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
7b20: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
7b30: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
7b40: 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69  id*),  /* Functi
7b50: 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20  on to invoke on 
7b60: 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  each commit */. 
7b70: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
7b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
7b90: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
7ba0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
7bb0: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
7bc0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
7bd0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
7be0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69  Old = db->pCommi
7bf0: 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d  tArg;.  db->xCom
7c00: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  mitCallback = xC
7c10: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
7c20: 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67  CommitArg = pArg
7c30: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
7c40: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
7c50: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
7c60: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  d;.}../*.** Regi
7c70: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
7c80: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
7c90: 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
7ca0: 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
7cb0: 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
7cc0: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
7cd0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
7ce0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
7cf0: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20  3_update_hook(. 
7d00: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
7d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
7d20: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
7d30: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
7d40: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
7d50: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
7d60: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61  char const *,cha
7d70: 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65  r const *,sqlite
7d80: 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
7d90: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
7da0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
7db0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
7dc0: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
7dd0: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
7de0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
7df0: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
7e00: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a  db->pUpdateArg;.
7e10: 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
7e20: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
7e30: 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65  k;.  db->pUpdate
7e40: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
7e50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7e60: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
7e70: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
7e80: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
7e90: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
7ea0: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
7eb0: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
7ec0: 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  is rolled.** bac
7ed0: 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  k by this databa
7ee0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
7ef0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
7f00: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20  rollback_hook(. 
7f10: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
7f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
7f30: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
7f40: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
7f50: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
7f60: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a  back)(void*), /*
7f70: 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
7f80: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
7f90: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
7fa0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
7fb0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
7fc0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
7fd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
7fe0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
7ff0: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
8000: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20  >pRollbackArg;. 
8010: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
8020: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
8030: 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62  ck;.  db->pRollb
8040: 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ackArg = pArg;. 
8050: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
8060: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
8070: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
8080: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8090: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
80a0: 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 6e 6e  to create a conn
80b0: 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61  ection to a data
80c0: 62 61 73 65 20 42 54 72 65 65 0a 2a 2a 20 64 72  base BTree.** dr
80d0: 69 76 65 72 2e 20 20 49 66 20 7a 46 69 6c 65 6e  iver.  If zFilen
80e0: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
80f0: 6f 66 20 61 20 66 69 6c 65 2c 20 74 68 65 6e 20  of a file, then 
8100: 74 68 61 74 20 66 69 6c 65 20 69 73 0a 2a 2a 20  that file is.** 
8110: 6f 70 65 6e 65 64 20 61 6e 64 20 75 73 65 64 2e  opened and used.
8120: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
8130: 73 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  s the magic name
8140: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
8150: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
8160: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
8170: 6d 6f 72 79 20 28 61 6e 64 20 69 73 20 74 68 75  mory (and is thu
8180: 73 20 66 6f 72 67 6f 74 74 65 6e 20 61 73 20 73  s forgotten as s
8190: 6f 6f 6e 20 61 73 0a 2a 2a 20 74 68 65 20 63 6f  oon as.** the co
81a0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nnection is clos
81b0: 65 64 2e 29 20 20 49 66 20 7a 46 69 6c 65 6e 61  ed.)  If zFilena
81c0: 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
81d0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
81e0: 69 73 20 61 20 22 76 69 72 74 75 61 6c 22 20 64  is a "virtual" d
81f0: 61 74 61 62 61 73 65 20 66 6f 72 20 74 72 61 6e  atabase for tran
8200: 73 69 65 6e 74 20 75 73 65 20 6f 6e 6c 79 20 61  sient use only a
8210: 6e 64 20 69 73 20 64 65 6c 65 74 65 64 20 61 73  nd is deleted as
8220: 0a 2a 2a 20 73 6f 6f 6e 20 61 73 20 74 68 65 20  .** soon as the 
8230: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c  connection is cl
8240: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 69  osed..**.** A vi
8250: 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 63  rtual database c
8260: 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 20 64  an be either a d
8270: 69 73 6b 20 66 69 6c 65 20 28 74 68 61 74 20 69  isk file (that i
8280: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
8290: 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
82a0: 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  the file is clos
82b0: 65 64 29 20 6f 72 20 69 74 20 61 6e 20 62 65 20  ed) or it an be 
82c0: 68 65 6c 64 20 65 6e 74 69 72 65 6c 79 20 69 6e  held entirely in
82d0: 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 64 65 70 65   memory,.** depe
82e0: 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
82f0: 75 65 73 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ues of the SQLIT
8300: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 63 6f 6d  E_TEMP_STORE com
8310: 70 69 6c 65 2d 74 69 6d 65 20 6d 61 63 72 6f 20  pile-time macro 
8320: 61 6e 64 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 74  and the.** db->t
8330: 65 6d 70 5f 73 74 6f 72 65 20 76 61 72 69 61 62  emp_store variab
8340: 6c 65 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  le, according to
8350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
8360: 68 61 72 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51  hart:.**.**   SQ
8370: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20  LITE_TEMP_STORE 
8380: 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f      db->temp_sto
8390: 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20  re     Location 
83a0: 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  of temporary dat
83b0: 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  abase.**   -----
83c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
83d0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
83e0: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
83f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8400: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
8420: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
8430: 20 66 69 6c 65 0a 2a 2a 20 20 20 31 20 20 20 20   file.**   1    
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
8460: 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20 31 20      file.**   1 
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
8490: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a         memory.**
84a0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
84b0: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
84d0: 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
8500: 69 6c 65 0a 2a 2a 20 20 20 32 20 20 20 20 20 20  ile.**   2      
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8530: 20 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 32 20    memory.**   2 
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
8560: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a         memory.**
8570: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
8580: 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
8590: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
85a0: 72 79 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ry.*/.int sqlite
85b0: 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 0a 20  3BtreeFactory(. 
85c0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a   const sqlite3 *
85d0: 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  db,        /* Ma
85e0: 69 6e 20 64 61 74 61 62 61 73 65 20 77 68 65 6e  in database when
85f0: 20 6f 70 65 6e 69 6e 67 20 61 75 78 20 6f 74 68   opening aux oth
8600: 65 72 77 69 73 65 20 30 20 2a 2f 0a 20 20 63 6f  erwise 0 */.  co
8610: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
8620: 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ame,    /* Name 
8630: 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
8640: 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
8650: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
8660: 6e 74 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 2c 20  nt omitJournal, 
8670: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 54           /* if T
8680: 52 55 45 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  RUE then do not 
8690: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 66 69 6c  journal this fil
86a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 61 63 68  e */.  int nCach
86b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
86c0: 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 70 61 67   /* How many pag
86d0: 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
86e0: 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ache */.  int vf
86f0: 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
8700: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
8710: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 76  sed through to v
8720: 66 73 4f 70 65 6e 20 2a 2f 0a 20 20 42 74 72 65  fsOpen */.  Btre
8730: 65 20 2a 2a 70 70 42 74 72 65 65 20 20 20 20 20  e **ppBtree     
8740: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8750: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
8760: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
8770: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 74  e */.){.  int bt
8780: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74  Flags = 0;.  int
8790: 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65 72 74   rc;.  .  assert
87a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
87b0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
87c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 42  );.  assert( ppB
87d0: 74 72 65 65 20 21 3d 20 30 29 3b 0a 20 20 69 66  tree != 0);.  if
87e0: 28 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( omitJournal ){
87f0: 0a 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d 20  .    btFlags |= 
8800: 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  BTREE_OMIT_JOURN
8810: 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  AL;.  }.  if( db
8820: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
8830: 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20  _NoReadlock ){. 
8840: 20 20 20 62 74 46 6c 61 67 73 20 7c 3d 20 42 54     btFlags |= BT
8850: 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 3b  REE_NO_READLOCK;
8860: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65  .  }.  if( zFile
8870: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 20 53  name==0 ){.#if S
8880: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
8890: 3d 3d 30 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  ==0.    /* Do no
88a0: 74 68 69 6e 67 20 2a 2f 0a 23 65 6e 64 69 66 0a  thing */.#endif.
88b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
88c0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 69 66  MIT_MEMORYDB.#if
88d0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
88e0: 52 45 3d 3d 31 0a 20 20 20 20 69 66 28 20 64 62  RE==1.    if( db
88f0: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20  ->temp_store==2 
8900: 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a  ) zFilename = ":
8910: 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e 64 69 66  memory:";.#endif
8920: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
8930: 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 20 20 69 66  _STORE==2.    if
8940: 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  ( db->temp_store
8950: 21 3d 31 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20  !=1 ) zFilename 
8960: 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65  = ":memory:";.#e
8970: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
8980: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20  TEMP_STORE==3.  
8990: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a    zFilename = ":
89a0: 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e 64 69 66  memory:";.#endif
89b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
89c0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
89d0: 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28 76  */.  }..  if( (v
89e0: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
89f0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
8a00: 30 20 26 26 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  0 && (zFilename=
8a10: 3d 30 20 7c 7c 20 2a 7a 46 69 6c 65 6e 61 6d 65  =0 || *zFilename
8a20: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 76 66 73 46  ==0) ){.    vfsF
8a30: 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73  lags = (vfsFlags
8a40: 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & ~SQLITE_OPEN_
8a50: 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54  MAIN_DB) | SQLIT
8a60: 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a  E_OPEN_TEMP_DB;.
8a70: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
8a80: 65 33 42 74 72 65 65 4f 70 65 6e 28 7a 46 69 6c  e3BtreeOpen(zFil
8a90: 65 6e 61 6d 65 2c 20 28 73 71 6c 69 74 65 33 20  ename, (sqlite3 
8aa0: 2a 29 64 62 2c 20 70 70 42 74 72 65 65 2c 20 62  *)db, ppBtree, b
8ab0: 74 46 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73  tFlags, vfsFlags
8ac0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
8ad0: 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
8ae0: 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
8af0: 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
8b00: 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
8b10: 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
8b20: 75 65 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74  ue. Except, if t
8b30: 68 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65  he call to Btree
8b40: 4f 70 65 6e 28 29 20 72 65 74 75 72 6e 65 64 20  Open() returned 
8b50: 61 20 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 6f 70  a handle.  ** op
8b60: 65 6e 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  en on an existin
8b70: 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
8b80: 61 63 68 65 2c 20 64 6f 20 6e 6f 74 20 63 68 61  ache, do not cha
8b90: 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61  nge the pager-ca
8ba0: 63 68 65 20 0a 20 20 2a 2a 20 73 69 7a 65 2e 0a  che .  ** size..
8bb0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
8bc0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73  QLITE_OK && 0==s
8bd0: 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
8be0: 61 28 2a 70 70 42 74 72 65 65 2c 20 30 2c 20 30  a(*ppBtree, 0, 0
8bf0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8c00: 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
8c10: 65 28 2a 70 70 42 74 72 65 65 2c 20 6e 43 61 63  e(*ppBtree, nCac
8c20: 68 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  he);.  }.  retur
8c30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
8c40: 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f  eturn UTF-8 enco
8c50: 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
8c60: 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
8c70: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
8c80: 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
8c90: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
8ca0: 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69  ite3_errmsg(sqli
8cb0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73  te3 *db){.  cons
8cc0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28  t char *z;.  if(
8cd0: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
8ce0: 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
8cf0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  (SQLITE_NOMEM);.
8d00: 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
8d10: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
8d20: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
8d30: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
8d40: 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53  rrStr(SQLITE_MIS
8d50: 55 53 45 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  USE);.  }.  sqli
8d60: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
8d70: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
8d80: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
8d90: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 20 3d  cFailed );.  z =
8da0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
8db0: 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70  value_text(db->p
8dc0: 45 72 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Err);.  assert( 
8dd0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
8de0: 64 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  d );.  if( z==0 
8df0: 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
8e00: 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
8e10: 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Code);.  }.  sql
8e20: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
8e30: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
8e40: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e  eturn z;.}..#ifn
8e50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8e60: 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75  UTF16./*.** Retu
8e70: 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  rn UTF-16 encode
8e80: 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
8e90: 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
8ea0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
8eb0: 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
8ec0: 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
8ed0: 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69  e3_errmsg16(sqli
8ee0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 2f 2a 20 42  te3 *db){.  /* B
8ef0: 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 63  ecause all the c
8f00: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
8f10: 20 73 74 72 69 6e 67 20 61 72 65 20 69 6e 20 74   string are in t
8f20: 68 65 20 75 6e 69 63 6f 64 65 0a 20 20 2a 2a 20  he unicode.  ** 
8f30: 72 61 6e 67 65 20 30 78 30 30 2d 30 78 46 46 2c  range 0x00-0xFF,
8f40: 20 69 66 20 77 65 20 70 61 64 20 74 68 65 20 62   if we pad the b
8f50: 69 67 2d 65 6e 64 69 61 6e 20 73 74 72 69 6e 67  ig-endian string
8f60: 20 77 69 74 68 20 61 20 0a 20 20 2a 2a 20 7a 65   with a .  ** ze
8f70: 72 6f 20 62 79 74 65 2c 20 77 65 20 63 61 6e 20  ro byte, we can 
8f80: 6f 62 74 61 69 6e 20 74 68 65 20 6c 69 74 74 6c  obtain the littl
8f90: 65 2d 65 6e 64 69 61 6e 20 73 74 72 69 6e 67 20  e-endian string 
8fa0: 77 69 74 68 0a 20 20 2a 2a 20 26 62 69 67 5f 65  with.  ** &big_e
8fb0: 6e 64 69 61 6e 5b 31 5d 2e 0a 20 20 2a 2f 0a 20  ndian[1]..  */. 
8fc0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
8fd0: 61 72 20 6f 75 74 4f 66 4d 65 6d 42 65 5b 5d 20  ar outOfMemBe[] 
8fe0: 3d 20 7b 0a 20 20 20 20 30 2c 20 27 6f 27 2c 20  = {.    0, 'o', 
8ff0: 30 2c 20 27 75 27 2c 20 30 2c 20 27 74 27 2c 20  0, 'u', 0, 't', 
9000: 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20  0, ' ', .    0, 
9010: 27 6f 27 2c 20 30 2c 20 27 66 27 2c 20 30 2c 20  'o', 0, 'f', 0, 
9020: 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 6d 27  ' ', .    0, 'm'
9030: 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 27 6d 27  , 0, 'e', 0, 'm'
9040: 2c 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27 72 27  , 0, 'o', 0, 'r'
9050: 2c 20 30 2c 20 27 79 27 2c 20 30 2c 20 30 2c 20  , 0, 'y', 0, 0, 
9060: 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  0.  };.  static 
9070: 63 6f 6e 73 74 20 63 68 61 72 20 6d 69 73 75 73  const char misus
9080: 65 42 65 20 5b 5d 20 3d 20 7b 0a 20 20 20 20 30  eBe [] = {.    0
9090: 2c 20 27 6c 27 2c 20 30 2c 20 27 69 27 2c 20 30  , 'l', 0, 'i', 0
90a0: 2c 20 27 62 27 2c 20 30 2c 20 27 72 27 2c 20 30  , 'b', 0, 'r', 0
90b0: 2c 20 27 61 27 2c 20 30 2c 20 27 72 27 2c 20 30  , 'a', 0, 'r', 0
90c0: 2c 20 27 79 27 2c 20 30 2c 20 27 20 27 2c 20 0a  , 'y', 0, ' ', .
90d0: 20 20 20 20 30 2c 20 27 72 27 2c 20 30 2c 20 27      0, 'r', 0, '
90e0: 6f 27 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20 27  o', 0, 'u', 0, '
90f0: 74 27 2c 20 30 2c 20 27 69 27 2c 20 30 2c 20 27  t', 0, 'i', 0, '
9100: 6e 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 27  n', 0, 'e', 0, '
9110: 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 63 27 2c   ', .    0, 'c',
9120: 20 30 2c 20 27 61 27 2c 20 30 2c 20 27 6c 27 2c   0, 'a', 0, 'l',
9130: 20 30 2c 20 27 6c 27 2c 20 30 2c 20 27 65 27 2c   0, 'l', 0, 'e',
9140: 20 30 2c 20 27 64 27 2c 20 30 2c 20 27 20 27 2c   0, 'd', 0, ' ',
9150: 20 0a 20 20 20 20 30 2c 20 27 6f 27 2c 20 30 2c   .    0, 'o', 0,
9160: 20 27 75 27 2c 20 30 2c 20 27 74 27 2c 20 30 2c   'u', 0, 't', 0,
9170: 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 6f   ' ', .    0, 'o
9180: 27 2c 20 30 2c 20 27 66 27 2c 20 30 2c 20 27 20  ', 0, 'f', 0, ' 
9190: 27 2c 20 0a 20 20 20 20 30 2c 20 27 73 27 2c 20  ', .    0, 's', 
91a0: 30 2c 20 27 65 27 2c 20 30 2c 20 27 71 27 2c 20  0, 'e', 0, 'q', 
91b0: 30 2c 20 27 75 27 2c 20 30 2c 20 27 65 27 2c 20  0, 'u', 0, 'e', 
91c0: 30 2c 20 27 6e 27 2c 20 30 2c 20 27 63 27 2c 20  0, 'n', 0, 'c', 
91d0: 30 2c 20 27 65 27 2c 20 30 2c 20 30 2c 20 30 0a  0, 'e', 0, 0, 0.
91e0: 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f    };..  const vo
91f0: 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  id *z;.  if( !db
9200: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
9210: 76 6f 69 64 20 2a 29 28 26 6f 75 74 4f 66 4d 65  void *)(&outOfMe
9220: 6d 42 65 5b 53 51 4c 49 54 45 5f 55 54 46 31 36  mBe[SQLITE_UTF16
9230: 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54 45 5f 55  NATIVE==SQLITE_U
9240: 54 46 31 36 4c 45 3f 31 3a 30 5d 29 3b 0a 20 20  TF16LE?1:0]);.  
9250: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
9260: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
9270: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
9280: 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 28 26  eturn (void *)(&
9290: 6d 69 73 75 73 65 42 65 5b 53 51 4c 49 54 45 5f  misuseBe[SQLITE_
92a0: 55 54 46 31 36 4e 41 54 49 56 45 3d 3d 53 51 4c  UTF16NATIVE==SQL
92b0: 49 54 45 5f 55 54 46 31 36 4c 45 3f 31 3a 30 5d  ITE_UTF16LE?1:0]
92c0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
92d0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
92e0: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
92f0: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
9300: 69 6c 65 64 20 29 3b 0a 20 20 7a 20 3d 20 73 71  iled );.  z = sq
9310: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
9320: 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  16(db->pErr);.  
9330: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
9340: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
9350: 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
9360: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
9370: 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a 20 20 20  b->errCode),.   
9380: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
9390: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
93a0: 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  );.    z = sqlit
93b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
93c0: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20  db->pErr);.  }. 
93d0: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d   /* A malloc() m
93e0: 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  ay have failed w
93f0: 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74  ithin the call t
9400: 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  o sqlite3_value_
9410: 74 65 78 74 31 36 28 29 0a 20 20 2a 2a 20 61 62  text16().  ** ab
9420: 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ove. If this is 
9430: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
9440: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
9450: 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74  led flag needs t
9460: 6f 0a 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65  o.  ** be cleare
9470: 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
9480: 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65  ng. Do this dire
9490: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
94a0: 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
94b0: 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20 61  3ApiExit(), to a
94c0: 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68 65  void setting the
94d0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
94e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
94f0: 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f    */.  db->mallo
9500: 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 73  cFailed = 0;.  s
9510: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
9520: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
9530: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
9540: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9550: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
9560: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** Return the mo
9570: 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
9580: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
9590: 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74  y an SQLite rout
95a0: 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a  ine. If NULL is.
95b0: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ** passed to thi
95c0: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61  s function, we a
95d0: 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29  ssume a malloc()
95e0: 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73   failed during s
95f0: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a  qlite3_open()..*
9600: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  /.int sqlite3_er
9610: 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
9620: 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
9630: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
9640: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
9650: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9660: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
9670: 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
9680: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9690: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
96a0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
96b0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
96c0: 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  ode & db->errMas
96d0: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  k;.}../*.** Crea
96e0: 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  te a new collati
96f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ng function for 
9700: 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20  database "db".  
9710: 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d  The name is zNam
9720: 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63  e.** and the enc
9730: 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f  oding is enc..*/
9740: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61  .static int crea
9750: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  teCollation(.  s
9760: 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
9770: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
9780: 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
9790: 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
97a0: 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
97b0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
97c0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
97d0: 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
97e0: 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
97f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
9800: 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e    int enc2;.  in
9810: 74 20 6e 4e 61 6d 65 3b 0a 20 20 0a 20 20 61 73  t nName;.  .  as
9820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9830: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
9840: 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
9850: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
9860: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
9870: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
9880: 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
9890: 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
98a0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
98b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
98c0: 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
98d0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
98e0: 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
98f0: 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
9900: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
9910: 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 20 26  /.  enc2 = enc &
9920: 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41   ~SQLITE_UTF16_A
9930: 4c 49 47 4e 45 44 3b 0a 20 20 69 66 28 20 65 6e  LIGNED;.  if( en
9940: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
9950: 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
9960: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
9970: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 65 6e  E;.  }.  if( (en
9980: 63 32 26 7e 33 29 21 3d 30 20 29 7b 0a 20 20 20  c2&~3)!=0 ){.   
9990: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
99a0: 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ISUSE;.  }..  /*
99b0: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
99c0: 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20  all is removing 
99d0: 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20  or replacing an 
99e0: 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69  existing collati
99f0: 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  on .  ** sequenc
9a00: 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68  e. If so, and th
9a10: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
9a20: 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e  Ms, return busy.
9a30: 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61   If there.  ** a
9a40: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
9a50: 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
9a60: 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
9a70: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
9a80: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
9a90: 53 74 72 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d 65  Strlen(db, zName
9aa0: 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  );.  pColl = sql
9ab0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9ac0: 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
9ad0: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a  ame, nName, 0);.
9ae0: 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
9af0: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
9b00: 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65    if( db->active
9b10: 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20  VdbeCnt ){.     
9b20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
9b30: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
9b40: 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20          "Unable 
9b50: 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
9b60: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9b70: 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76  nce due to activ
9b80: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
9b90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9ba0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
9bb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
9bc0: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
9bd0: 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a  nts(db);..    /*
9be0: 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   If collation se
9bf0: 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73  quence pColl was
9c00: 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c   created directl
9c10: 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20  y by a call to. 
9c20: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72     ** sqlite3_cr
9c30: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20  eate_collation, 
9c40: 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  and not generate
9c50: 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  d by synthCollSe
9c60: 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  q(),.    ** then
9c70: 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65   any copies made
9c80: 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
9c90: 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  () need to be in
9ca0: 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a  validated..    *
9cb0: 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f  * Also, collatio
9cc0: 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43  n destructor - C
9cd0: 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20  ollSeq.xDel() - 
9ce0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65  function may nee
9cf0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63  d.    ** to be c
9d00: 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20  alled..    */ . 
9d10: 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65     if( (pColl->e
9d20: 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
9d30: 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63  16_ALIGNED)==enc
9d40: 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
9d50: 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *aColl = sqli
9d60: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
9d70: 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
9d80: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , nName);.      
9d90: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
9da0: 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
9db0: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
9dc0: 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b   *p = &aColl[j];
9dd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
9de0: 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
9df0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
9e00: 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20   p->xDel ){.    
9e10: 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28          p->xDel(
9e20: 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  p->pUser);.     
9e30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9e40: 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20   p->xCmp = 0;.  
9e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9e60: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
9e70: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
9e80: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
9e90: 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  enc2, zName, nNa
9ea0: 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  me, 1);.  if( pC
9eb0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  oll ){.    pColl
9ec0: 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72  ->xCmp = xCompar
9ed0: 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 70 55  e;.    pColl->pU
9ee0: 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 20 20  ser = pCtx;.    
9ef0: 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44  pColl->xDel = xD
9f00: 65 6c 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 65  el;.    pColl->e
9f10: 6e 63 20 3d 20 65 6e 63 32 20 7c 20 28 65 6e 63  nc = enc2 | (enc
9f20: 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f   & SQLITE_UTF16_
9f30: 41 4c 49 47 4e 45 44 29 3b 0a 20 20 7d 0a 20 20  ALIGNED);.  }.  
9f40: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
9f50: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
9f60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9f70: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
9f80: 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73  is array defines
9f90: 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
9fa0: 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75  ds on limit valu
9fb0: 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74  es.  The.** init
9fc0: 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20  ializer must be 
9fd0: 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74  kept in sync wit
9fe0: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d  h the SQLITE_LIM
9ff0: 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73  IT_*.** #defines
a000: 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a   in sqlite3.h..*
a010: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69  /.static const i
a020: 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20  nt aHardLimit[] 
a030: 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  = {.  SQLITE_MAX
a040: 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
a050: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
a060: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
a070: 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f  OLUMN,.  SQLITE_
a080: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a  MAX_EXPR_DEPTH,.
a090: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d    SQLITE_MAX_COM
a0a0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20  POUND_SELECT,.  
a0b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
a0c0: 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  OP,.  SQLITE_MAX
a0d0: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20  _FUNCTION_ARG,. 
a0e0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
a0f0: 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  CHED,.  SQLITE_M
a100: 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
a110: 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
a120: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
a130: 4d 42 45 52 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  MBER,.};../*.** 
a140: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61  Make sure the ha
a150: 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65  rd limits are se
a160: 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20  t to reasonable 
a170: 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51  values.*/.#if SQ
a180: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c  LITE_MAX_LENGTH<
a190: 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
a1a0: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75  TE_MAX_LENGTH mu
a1b0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
a1c0: 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
a1d0: 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
a1e0: 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
a1f0: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
a200: 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
a210: 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
a220: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
a230: 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49  _SQL_LENGTH>SQLI
a240: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20  TE_MAX_LENGTH.# 
a250: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
a260: 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
a270: 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20   not be greater 
a280: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f  than SQLITE_MAX_
a290: 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69  LENGTH.#endif.#i
a2a0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  f SQLITE_MAX_COM
a2b0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23  POUND_SELECT<2.#
a2c0: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
a2d0: 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
a2e0: 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  T must be at lea
a2f0: 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 2.#endif.#if 
a300: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
a310: 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51  OP<40.# error SQ
a320: 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
a330: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
a340: 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  t 40.#endif.#if 
a350: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
a360: 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c  ION_ARG<0 || SQL
a370: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
a380: 5f 41 52 47 3e 31 32 37 0a 23 20 65 72 72 6f 72  _ARG>127.# error
a390: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
a3a0: 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65  TION_ARG must be
a3b0: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
a3c0: 32 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  27.#endif.#if SQ
a3d0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
a3e0: 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  D<0 || SQLITE_MA
a3f0: 58 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 23 20  X_ATTACHED>30.# 
a400: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
a410: 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62  _ATTACHED must b
a420: 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
a430: 33 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  30.#endif.#if SQ
a440: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
a450: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23  TTERN_LENGTH<1.#
a460: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
a470: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
a480: 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
a490: 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
a4a0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  #if SQLITE_MAX_V
a4b0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 3c 31  ARIABLE_NUMBER<1
a4c0: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
a4d0: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
a4e0: 42 45 52 20 6d 75 73 74 20 62 65 20 61 74 20 6c  BER must be at l
a4f0: 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69  east 1.#endif.#i
a500: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
a510: 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f  UMN>32767.# erro
a520: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  r SQLITE_MAX_COL
a530: 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63  UMN must not exc
a540: 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66  eed 32767.#endif
a550: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
a560: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c  the value of a l
a570: 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68  imit.  Report th
a580: 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20  e old value..** 
a590: 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69  If an invalid li
a5a0: 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75 70  mit index is sup
a5b0: 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31  plied, report -1
a5c0: 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61  ..** Make no cha
a5d0: 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72  nges but still r
a5e0: 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
a5f0: 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  lue if the.** ne
a600: 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  w limit is negat
a610: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ive..**.** A new
a620: 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65   lower limit doe
a630: 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69  s not shrink exi
a640: 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73  sting constructs
a650: 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70  ..** It merely p
a660: 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73  revents new cons
a670: 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63 65  tructs that exce
a680: 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20  ed the limit.** 
a690: 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f  from forming..*/
a6a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d  .int sqlite3_lim
a6b0: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
a6c0: 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74  int limitId, int
a6d0: 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e   newLimit){.  in
a6e0: 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 20 20 69 66  t oldLimit;.  if
a6f0: 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c  ( limitId<0 || l
a700: 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e  imitId>=SQLITE_N
a710: 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65  _LIMIT ){.    re
a720: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f  turn -1;.  }.  o
a730: 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c  ldLimit = db->aL
a740: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20  imit[limitId];. 
a750: 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
a760: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4c   ){.    if( newL
a770: 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b  imit>aHardLimit[
a780: 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20  limitId] ){.    
a790: 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61    newLimit = aHa
a7a0: 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
a7b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
a7c0: 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  aLimit[limitId] 
a7d0: 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a  = newLimit;.  }.
a7e0: 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69    return oldLimi
a7f0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
a800: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
a810: 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e  e work of openin
a820: 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20  g a database on 
a830: 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c  behalf of.** sql
a840: 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20  ite3_open() and 
a850: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29  sqlite3_open16()
a860: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
a870: 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61  ilename "zFilena
a880: 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d  me"  .** is UTF-
a890: 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74  8 encoded..*/.st
a8a0: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74  atic int openDat
a8b0: 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63  abase(.  const c
a8c0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
a8d0: 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
a8e0: 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64  name UTF-8 encod
a8f0: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
a900: 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f  **ppDb,        /
a910: 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20  * OUT: Returned 
a920: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
a930: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 6c  */.  unsigned fl
a940: 61 67 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  ags,        /* O
a950: 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73  perational flags
a960: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
a970: 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20   *zVfs       /* 
a980: 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  Name of the VFS 
a990: 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73  to use */.){.  s
a9a0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
a9b0: 74 20 72 63 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  t rc;.  CollSeq 
a9c0: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 73  *pColl;.  int is
a9d0: 54 68 72 65 61 64 73 61 66 65 3b 0a 0a 23 69 66  Threadsafe;..#if
a9e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a9f0: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
aa00: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
aa10: 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
aa20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
aa30: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
aa40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
aa50: 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a  CoreMutex==0 ){.
aa60: 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
aa70: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
aa80: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
aa90: 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b  _OPEN_NOMUTEX ){
aaa0: 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
aab0: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
aac0: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
aad0: 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
aae0: 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
aaf0: 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  safe = 1;.  }els
ab00: 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  e{.    isThreads
ab10: 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  afe = sqlite3Glo
ab20: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
ab30: 75 74 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  utex;.  }..  /* 
ab40: 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62  Remove harmful b
ab50: 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61  its from the fla
ab60: 67 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  gs parameter */.
ab70: 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53    flags &=  ~( S
ab80: 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
ab90: 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
aba0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
abb0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a  _OPEN_MAIN_DB |.
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
abd0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
abe0: 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
abf0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
ac00: 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20  _TRANSIENT_DB | 
ac10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ac20: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
ac30: 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
ac40: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
ac50: 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
ac60: 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
ac70: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
ac80: 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a  N_SUBJOURNAL | .
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
aca0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
acb0: 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20  R_JOURNAL |.    
acc0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
acd0: 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c  E_OPEN_NOMUTEX |
ace0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
acf0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
ad00: 4d 55 54 45 58 0a 20 20 20 20 20 20 20 20 20 20  MUTEX.          
ad10: 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f     );..  /* Allo
ad20: 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 20  cate the sqlite 
ad30: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a  data structure *
ad40: 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33  /.  db = sqlite3
ad50: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
ad60: 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20  of(sqlite3) );. 
ad70: 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74   if( db==0 ) got
ad80: 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
ad90: 69 66 28 20 69 73 54 68 72 65 61 64 73 61 66 65  if( isThreadsafe
ada0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65   ){.    db->mute
adb0: 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
adc0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
add0: 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
ade0: 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78     if( db->mutex
adf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
ae00: 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20  ite3_free(db);. 
ae10: 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20       db = 0;.   
ae20: 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
ae30: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ut;.    }.  }.  
ae40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
ae50: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
ae60: 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20    db->errMask = 
ae70: 30 78 66 66 3b 0a 20 20 64 62 2d 3e 70 72 69 6f  0xff;.  db->prio
ae80: 72 4e 65 77 52 6f 77 69 64 20 3d 20 30 3b 0a 20  rNewRowid = 0;. 
ae90: 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20   db->nDb = 2;.  
aea0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
aeb0: 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
aec0: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
aed0: 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73  DbStatic;..  ass
aee0: 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e  ert( sizeof(db->
aef0: 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28  aLimit)==sizeof(
af00: 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20  aHardLimit) );. 
af10: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d   memcpy(db->aLim
af20: 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20  it, aHardLimit, 
af30: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
af40: 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43  t));.  db->autoC
af50: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d  ommit = 1;.  db-
af60: 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d  >nextAutovac = -
af70: 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67  1;.  db->nextPag
af80: 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d  esize = 0;.  db-
af90: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
afa0: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 0a 23  _ShortColNames.#
afb0: 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
afc0: 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a  T_FILE_FORMAT<4.
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afe0: 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   | SQLITE_Legacy
aff0: 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23  FileFmt.#endif.#
b000: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b010: 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
b020: 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ON.             
b030: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61      | SQLITE_Loa
b040: 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69  dExtension.#endi
b050: 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69  f.      ;.  sqli
b060: 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
b070: 3e 61 43 6f 6c 6c 53 65 71 2c 20 53 51 4c 49 54  >aCollSeq, SQLIT
b080: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
b090: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
b0a0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
b0b0: 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73  BLE.  sqlite3Has
b0c0: 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75  hInit(&db->aModu
b0d0: 6c 65 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f  le, SQLITE_HASH_
b0e0: 53 54 52 49 4e 47 2c 20 30 29 3b 0a 23 65 6e 64  STRING, 0);.#end
b0f0: 69 66 0a 0a 20 20 64 62 2d 3e 70 56 66 73 20 3d  if..  db->pVfs =
b100: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
b110: 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 21  d(zVfs);.  if( !
b120: 64 62 2d 3e 70 56 66 73 20 29 7b 0a 20 20 20 20  db->pVfs ){.    
b130: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
b140: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  R;.    sqlite3Er
b150: 72 6f 72 28 64 62 2c 20 72 63 2c 20 22 6e 6f 20  ror(db, rc, "no 
b160: 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a  such vfs: %s", z
b170: 56 66 73 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f  Vfs);.    goto o
b180: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
b190: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66    /* Add the def
b1a0: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
b1b0: 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20  equence BINARY. 
b1c0: 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72  BINARY works for
b1d0: 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a   both UTF-8.  **
b1e0: 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20   and UTF-16, so 
b1f0: 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f  add a version fo
b200: 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20  r each to avoid 
b210: 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a  any unnecessary.
b220: 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
b230: 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72  . The only error
b240: 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20   that can occur 
b250: 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63  here is a malloc
b260: 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2f  () failure..  */
b270: 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
b280: 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
b290: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
b2a0: 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
b2b0: 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
b2c0: 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
b2d0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
b2e0: 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
b2f0: 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
b300: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
b310: 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
b320: 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16LE, 0, binColl
b330: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
b340: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
b350: 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f  "RTRIM", SQLITE_
b360: 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20  UTF8, (void*)1, 
b370: 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
b380: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
b390: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
b3a0: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
b3b0: 20 20 7d 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43    }.  db->pDfltC
b3c0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
b3d0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c  dCollSeq(db, SQL
b3e0: 49 54 45 5f 55 54 46 38 2c 20 22 42 49 4e 41 52  ITE_UTF8, "BINAR
b3f0: 59 22 2c 20 36 2c 20 30 29 3b 0a 20 20 61 73 73  Y", 6, 0);.  ass
b400: 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ert( db->pDfltCo
b410: 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  ll!=0 );..  /* A
b420: 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d 38 20  lso add a UTF-8 
b430: 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
b440: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b450: 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65  nce. */.  create
b460: 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e  Collation(db, "N
b470: 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55  OCASE", SQLITE_U
b480: 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f  TF8, 0, nocaseCo
b490: 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b  llatingFunc, 0);
b4a0: 0a 0a 20 20 2f 2a 20 53 65 74 20 66 6c 61 67 73  ..  /* Set flags
b4b0: 20 6f 6e 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   on the built-in
b4c0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
b4d0: 6e 63 65 73 20 2a 2f 0a 20 20 64 62 2d 3e 70 44  nces */.  db->pD
b4e0: 66 6c 74 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20  fltColl->type = 
b4f0: 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41  SQLITE_COLL_BINA
b500: 52 59 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  RY;.  pColl = sq
b510: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
b520: 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (db, SQLITE_UTF8
b530: 2c 20 22 4e 4f 43 41 53 45 22 2c 20 36 2c 20 30  , "NOCASE", 6, 0
b540: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  );.  if( pColl )
b550: 7b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 74 79 70  {.    pColl->typ
b560: 65 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  e = SQLITE_COLL_
b570: 4e 4f 43 41 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f  NOCASE;.  }..  /
b580: 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65  * Open the backe
b590: 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76  nd database driv
b5a0: 65 72 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e  er */.  db->open
b5b0: 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
b5c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
b5d0: 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 7a 46  eeFactory(db, zF
b5e0: 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 53 51 4c 49  ilename, 0, SQLI
b5f0: 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
b600: 5f 53 49 5a 45 2c 20 0a 20 20 20 20 20 20 20 20  _SIZE, .        
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b620: 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54     flags | SQLIT
b630: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 2c 0a  E_OPEN_MAIN_DB,.
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e             &db->
b660: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69  aDb[0].pBt);.  i
b670: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b680: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
b690: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
b6a0: 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
b6b0: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  _out;.  }.  db->
b6c0: 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[0].pSchema =
b6d0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
b6e0: 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d  t(db, db->aDb[0]
b6f0: 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
b700: 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [1].pSchema = sq
b710: 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
b720: 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68  b, 0);...  /* Th
b730: 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79  e default safety
b740: 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d  _level for the m
b750: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
b760: 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20  'full'; for the 
b770: 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61  temp.  ** databa
b780: 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e  se it is 'NONE'.
b790: 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
b7a0: 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65  e pager layer de
b7b0: 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  faults.  .  */. 
b7c0: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d   db->aDb[0].zNam
b7d0: 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62  e = "main";.  db
b7e0: 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f  ->aDb[0].safety_
b7f0: 6c 65 76 65 6c 20 3d 20 33 3b 0a 23 69 66 6e 64  level = 3;.#ifnd
b800: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
b810: 45 4d 50 44 42 0a 20 20 64 62 2d 3e 61 44 62 5b  EMPDB.  db->aDb[
b820: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70  1].zName = "temp
b830: 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ";.  db->aDb[1].
b840: 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31  safety_level = 1
b850: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e  ;.#endif..  db->
b860: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
b870: 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28  AGIC_OPEN;.  if(
b880: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b890: 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
b8a0: 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
b8b0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
b8c0: 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69   built-in functi
b8d0: 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  ons, but do not 
b8e0: 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  attempt to read 
b8f0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
b900: 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68  e schema yet. Th
b910: 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e  is is delayed un
b920: 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69  til the first ti
b930: 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  me the database.
b940: 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64    ** is accessed
b950: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
b960: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
b970: 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  _OK, 0);.  sqlit
b980: 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69  e3RegisterBuilti
b990: 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a  nFunctions(db);.
b9a0: 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d  .  /* Load autom
b9b0: 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
b9c0: 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61  - extensions tha
b9d0: 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69  t have been regi
b9e0: 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e  stered.  ** usin
b9f0: 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75  g the sqlite3_au
ba00: 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f  tomatic_extensio
ba10: 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20  n() API..  */.  
ba20: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 41 75 74  (void)sqlite3Aut
ba30: 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28  oLoadExtensions(
ba40: 64 62 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  db);.  if( sqlit
ba50: 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d  e3_errcode(db)!=
ba60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ba70: 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
ba80: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
ba90: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31  LITE_ENABLE_FTS1
baa0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
bab0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
bac0: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
bad0: 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74  e3Fts1Init(sqlit
bae0: 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
baf0: 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64  qlite3Fts1Init(d
bb00: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
bb10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
bb20: 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20  ABLE_FTS2.  if( 
bb30: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
bb40: 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
bb50: 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  OK ){.    extern
bb60: 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32   int sqlite3Fts2
bb70: 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
bb80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bb90: 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts2Init(db);.  
bba0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
bbb0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
bbc0: 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS3.  if( !db->m
bbd0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
bbe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bbf0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bc00: 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts3Init(db);.  
bc10: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
bc20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
bc30: 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  CU.  if( !db->ma
bc40: 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
bc50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bc60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
bc70: 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  cuInit(db);.  }.
bc80: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
bc90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52  QLITE_ENABLE_RTR
bca0: 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  EE.  if( !db->ma
bcb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
bcc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
bcd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74    rc = sqlite3Rt
bce0: 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  reeInit(db);.  }
bcf0: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
bd00: 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
bd10: 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49  0);..  /* -DSQLI
bd20: 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
bd30: 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20  NG_MODE=1 makes 
bd40: 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65  EXCLUSIVE the de
bd50: 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
bd60: 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49  ** mode.  -DSQLI
bd70: 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
bd80: 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e  NG_MODE=0 make N
bd90: 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
bda0: 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
bdb0: 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68  ode.  Doing noth
bdc0: 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20  ing at all also 
bdd0: 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65  makes NORMAL the
bde0: 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23   default..  */.#
bdf0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  ifdef SQLITE_DEF
be00: 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
be10: 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b  E.  db->dfltLock
be20: 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
be30: 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
be40: 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  DE;.  sqlite3Pag
be50: 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71  erLockingMode(sq
be60: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
be70: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c  db->aDb[0].pBt),
be80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
be90: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
bea0: 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
beb0: 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a  G_MODE);.#endif.
bec0: 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65  .  /* Enable the
bed0: 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f   lookaside-mallo
bee0: 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20  c subsystem */. 
bef0: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
bf00: 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c  db, 0, sqlite3Gl
bf10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
bf20: 6b 61 73 69 64 65 2c 20 73 71 6c 69 74 65 33 47  kaside, sqlite3G
bf30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f  lobalConfig.nLoo
bf40: 6b 61 73 69 64 65 29 3b 0a 0a 6f 70 65 6e 64 62  kaside);..opendb
bf50: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20 29  _out:.  if( db )
bf60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
bf70: 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73  ->mutex!=0 || is
bf80: 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c  Threadsafe==0 ||
bf90: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
bfa0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d  nfig.bFullMutex=
bfb0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
bfc0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
bfd0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20  ->mutex);.  }.  
bfe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
bff0: 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20  code(db);.  if( 
c000: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
c010: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c020: 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64  close(db);.    d
c030: 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  b = 0;.  }else i
c040: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c050: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
c060: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
c070: 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70  _SICK;.  }.  *pp
c080: 44 62 20 3d 20 64 62 3b 0a 20 20 72 65 74 75 72  Db = db;.  retur
c090: 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  n sqlite3ApiExit
c0a0: 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (0, rc);.}../*.*
c0b0: 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
c0c0: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
c0d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
c0e0: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
c0f0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
c100: 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29  qlite3 **ppDb .)
c110: 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
c120: 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
c130: 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  e, ppDb,.       
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
c150: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
c160: 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
c170: 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d  EN_CREATE, 0);.}
c180: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
c190: 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68  n_v2(.  const ch
c1a0: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20  ar *filename,   
c1b0: 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
c1c0: 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  name (UTF-8) */.
c1d0: 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
c1e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
c1f0: 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64  : SQLite db hand
c200: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
c210: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
c220: 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  /* Flags */.  co
c230: 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
c240: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
c250: 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75   VFS module to u
c260: 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  se */.){.  retur
c270: 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66  n openDatabase(f
c280: 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 66  ilename, ppDb, f
c290: 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a  lags, zVfs);.}..
c2a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c2b0: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
c2c0: 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
c2d0: 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
c2e0: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nt sqlite3_open1
c2f0: 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  6(.  const void 
c300: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
c310: 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b  qlite3 **ppDb.){
c320: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
c330: 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20  Filename8;   /* 
c340: 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65  zFilename encode
c350: 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65  d in UTF-8 inste
c360: 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a  ad of UTF-16 */.
c370: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
c380: 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVal;.  int rc;
c390: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  ..  assert( zFil
c3a0: 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72  ename );.  asser
c3b0: 74 28 20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70  t( ppDb );.  *pp
c3c0: 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
c3d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
c3e0: 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
c3f0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
c400: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
c410: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
c420: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
c430: 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
c440: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
c450: 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65  (pVal, -1, zFile
c460: 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  name, SQLITE_UTF
c470: 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45  16NATIVE, SQLITE
c480: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c  _STATIC);.  zFil
c490: 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33  ename8 = sqlite3
c4a0: 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
c4b0: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
c4c0: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29  if( zFilename8 )
c4d0: 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44  {.    rc = openD
c4e0: 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
c4f0: 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20  e8, ppDb,.      
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
c520: 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
c530: 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a  PEN_CREATE, 0);.
c540: 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 44      assert( *ppD
c550: 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  b || rc==SQLITE_
c560: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28  NOMEM );.    if(
c570: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c580: 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  & !DbHasProperty
c590: 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63  (*ppDb, 0, DB_Sc
c5a0: 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20  hemaLoaded) ){. 
c5b0: 20 20 20 20 20 45 4e 43 28 2a 70 70 44 62 29 20       ENC(*ppDb) 
c5c0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
c5d0: 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  TIVE;.    }.  }e
c5e0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
c5f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
c600: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
c610: 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
c620: 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78  urn sqlite3ApiEx
c630: 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e  it(0, rc);.}.#en
c640: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
c650: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
c660: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
c670: 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
c680: 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
c690: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
c6a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c6b0: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
c6c0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
c6d0: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
c6e0: 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
c6f0: 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
c700: 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
c710: 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
c720: 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
c730: 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
c740: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
c750: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
c760: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
c770: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
c780: 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ailed );.  rc = 
c790: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
c7a0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20  db, zName, enc, 
c7b0: 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
c7c0: 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
c7d0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
c7e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
c7f0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
c800: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
c810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
c820: 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
c830: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
c840: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
c850: 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
c860: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c870: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
c880: 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
c890: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
c8a0: 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
c8b0: 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
c8c0: 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
c8d0: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
c8e0: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
c8f0: 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
c900: 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
c910: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
c920: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
c930: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
c940: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
c950: 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d  Failed );.  rc =
c960: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
c970: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c  (db, zName, enc,
c980: 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
c990: 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73   xDel);.  rc = s
c9a0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
c9b0: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
c9c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
c9d0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
c9e0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
c9f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
ca00: 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  16./*.** Registe
ca10: 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
ca20: 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
ca30: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
ca40: 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
ca50: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
ca60: 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  llation16(.  sql
ca70: 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
ca80: 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a  st void *zName,.
ca90: 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
caa0: 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
cab0: 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
cac0: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
cad0: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
cae0: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ).){.  int rc = 
caf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
cb00: 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c  r *zName8;.  sql
cb10: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
cb20: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
cb30: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
cb40: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e  ocFailed );.  zN
cb50: 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74  ame8 = sqlite3Ut
cb60: 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65  f16to8(db, zName
cb70: 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20 7a 4e 61  , -1);.  if( zNa
cb80: 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
cb90: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
cba0: 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 65 6e 63 2c  db, zName8, enc,
cbb0: 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
cbc0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
cbd0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
cbe0: 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  8);.  }.  rc = s
cbf0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
cc00: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
cc10: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
cc20: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
cc30: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
cc40: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
cc50: 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
cc60: 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
cc70: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
cc80: 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
cc90: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
cca0: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
ccb0: 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
ccc0: 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
ccd0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
cce0: 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
ccf0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
cd00: 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c  on_needed(.  sql
cd10: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
cd20: 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
cd30: 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
cd40: 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73  lNeeded)(void*,s
cd50: 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
cd60: 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tRep,const char*
cd70: 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ).){.  sqlite3_m
cd80: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
cd90: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
cda0: 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c  llNeeded = xColl
cdb0: 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43  Needed;.  db->xC
cdc0: 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b  ollNeeded16 = 0;
cdd0: 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  .  db->pCollNeed
cde0: 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65  edArg = pCollNee
cdf0: 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  dedArg;.  sqlite
ce00: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
ce10: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
ce20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ce30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ce40: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
ce50: 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
ce60: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
ce70: 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
ce80: 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
ce90: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
cea0: 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
ceb0: 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
cec0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
ced0: 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
cee0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
cef0: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a  ation_needed16(.
cf00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
cf10: 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
cf20: 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
cf30: 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28  *xCollNeeded16)(
cf40: 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
cf50: 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73  nt eTextRep,cons
cf60: 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71  t void*).){.  sq
cf70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
cf80: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
cf90: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20  db->xCollNeeded 
cfa0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  = 0;.  db->xColl
cfb0: 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c  Needed16 = xColl
cfc0: 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e  Needed16;.  db->
cfd0: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d  pCollNeededArg =
cfe0: 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b   pCollNeededArg;
cff0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d000: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
d010: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
d020: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
d030: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
d040: 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TF16 */..#ifndef
d050: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f   SQLITE_OMIT_GLO
d060: 42 41 4c 52 45 43 4f 56 45 52 0a 2f 2a 0a 2a 2a  BALRECOVER./*.**
d070: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d080: 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f  s now an anachro
d090: 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f  nism. It used to
d0a0: 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f   be used to reco
d0b0: 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61  ver from a.** ma
d0c0: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20  lloc() failure, 
d0d0: 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64  but SQLite now d
d0e0: 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74  oes this automat
d0f0: 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ically..*/.int s
d100: 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
d110: 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72  cover(void){.  r
d120: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d130: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
d140: 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   Test to see whe
d150: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
d160: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d170: 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  ion is in autoco
d180: 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52  mmit.** mode.  R
d190: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
d1a0: 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66   is and FALSE if
d1b0: 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69   not.  Autocommi
d1c0: 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20  t mode is on.** 
d1d0: 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74  by default.  Aut
d1e0: 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62  ocommit is disab
d1f0: 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73  led by a BEGIN s
d200: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65  tatement and ree
d210: 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65  nabled.** by the
d220: 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20   next COMMIT or 
d230: 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a  ROLLBACK..**.***
d240: 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41 4e 20  **** THIS IS AN 
d250: 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41 50 49  EXPERIMENTAL API
d260: 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43 54 20   AND IS SUBJECT 
d270: 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a  TO CHANGE ******
d280: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
d290: 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73  get_autocommit(s
d2a0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
d2b0: 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f  eturn db->autoCo
d2c0: 6d 6d 69 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  mmit;.}..#ifdef 
d2d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
d2e0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d2f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 73 75 62 74   routine is subt
d300: 69 74 75 74 65 64 20 66 6f 72 20 63 6f 6e 73 74  ituted for const
d310: 61 6e 74 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ant SQLITE_CORRU
d320: 50 54 20 69 6e 0a 2a 2a 20 64 65 62 75 67 67 69  PT in.** debuggi
d330: 6e 67 20 62 75 69 6c 64 73 2e 20 20 54 68 69 73  ng builds.  This
d340: 20 70 72 6f 76 69 64 65 73 20 61 20 77 61 79 20   provides a way 
d350: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
d360: 69 6e 74 20 66 6f 72 20 77 68 65 6e 0a 2a 2a 20  int for when.** 
d370: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 66 69  corruption is fi
d380: 72 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f  rst detected..*/
d390: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72  .int sqlite3Corr
d3a0: 75 70 74 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  upt(void){.  ret
d3b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d3c0: 50 54 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  PT;.}.#endif../*
d3d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f  .** This is a co
d3e0: 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e  nvenience routin
d3f0: 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
d400: 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61  e that all threa
d410: 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61  d-specific.** da
d420: 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65  ta for this thre
d430: 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c  ad has been deal
d440: 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  located..**.** S
d450: 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
d460: 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63  uses thread-spec
d470: 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69  ific data so thi
d480: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77  s routine is now
d490: 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74   a.** no-op.  It
d4a0: 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72   is retained for
d4b0: 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
d4c0: 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f  atibility..*/.vo
d4d0: 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  id sqlite3_threa
d4e0: 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b  d_cleanup(void){
d4f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d500: 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
d510: 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66  n about a specif
d520: 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64  ic column of a d
d530: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
d540: 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e  * See comment in
d550: 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69   sqlite3.h (sqli
d560: 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74  te.h.in) for det
d570: 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ails..*/.#ifdef 
d580: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
d590: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e  LUMN_METADATA.in
d5a0: 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  t sqlite3_table_
d5b0: 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
d5c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5e0: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  * Connection han
d5f0: 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
d600: 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20  har *zDbName,   
d610: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
d620: 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f   name or NULL */
d630: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d640: 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f  TableName,     /
d650: 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  * Table name */.
d660: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
d670: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a  olumnName,    /*
d680: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
d690: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
d6a0: 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a  zDataType,    /*
d6b0: 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65   OUTPUT: Declare
d6c0: 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20  d data type */. 
d6d0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
d6e0: 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20  CollSeq,     /* 
d6f0: 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f  OUTPUT: Collatio
d700: 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
d710: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75  */.  int *pNotNu
d720: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
d730: 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
d740: 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e   if NOT NULL con
d750: 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a  straint exists *
d760: 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72  /.  int *pPrimar
d770: 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  yKey,           
d780: 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
d790: 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f  if column part o
d7a0: 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  f PK */.  int *p
d7b0: 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20  Autoinc         
d7c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
d7d0: 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
d7e0: 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e  is auto-incremen
d7f0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
d800: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
d810: 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a  g = 0;.  Table *
d820: 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75  pTab = 0;.  Colu
d830: 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20  mn *pCol = 0;.  
d840: 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61  int iCol;..  cha
d850: 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79  r const *zDataTy
d860: 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
d870: 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d  onst *zCollSeq =
d880: 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c   0;.  int notnul
d890: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69  l = 0;.  int pri
d8a0: 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69  marykey = 0;.  i
d8b0: 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a  nt autoinc = 0;.
d8c0: 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65  .  /* Ensure the
d8d0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
d8e0: 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64   has been loaded
d8f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
d900: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
d910: 74 65 78 29 3b 0a 20 20 28 76 6f 69 64 29 73 71  tex);.  (void)sq
d920: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62  lite3SafetyOn(db
d930: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
d940: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
d950: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69   rc = sqlite3Ini
d960: 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b  t(db, &zErrMsg);
d970: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
d980: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 69  eaveAll(db);.  i
d990: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
d9a0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   ){.    goto err
d9b0: 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
d9c0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
d9d0: 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a  le in question *
d9e0: 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  /.  pTab = sqlit
d9f0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
da00: 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e  zTableName, zDbN
da10: 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61  ame);.  if( !pTa
da20: 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  b || pTab->pSele
da30: 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  ct ){.    pTab =
da40: 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   0;.    goto err
da50: 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
da60: 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d  * Find the colum
da70: 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f  n for which info
da80: 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f   is requested */
da90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73  .  if( sqlite3Is
daa0: 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d  Rowid(zColumnNam
dab0: 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  e) ){.    iCol =
dac0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
dad0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
dae0: 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
daf0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
db00: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
db10: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
db20: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
db30: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
db40: 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
db50: 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
db60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
db70: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
db80: 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  e, zColumnName) 
db90: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
dba0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dbb0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
dbc0: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
dbd0: 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
dbe0: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
dbf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
dc00: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
dc10: 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
dc20: 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
dc30: 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  n that will be r
dc40: 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20  eturned.  ** to 
dc50: 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f  the caller in lo
dc60: 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44  cal variables zD
dc70: 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65  ataType, zCollSe
dc80: 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d  q, notnull, prim
dc90: 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20  arykey.  ** and 
dca0: 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73  autoinc. At this
dcb0: 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65   point there are
dcc0: 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69   two possibiliti
dcd0: 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  es:.  ** .  **  
dce0: 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66     1. The specif
dcf0: 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ied column name 
dd00: 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64  was rowid", "oid
dd10: 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a  " or "_rowid_" .
dd20: 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20    **        and 
dd30: 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c  there is no expl
dd40: 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
dd50: 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a  IPK column. .  *
dd60: 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68  *.  **     2. Th
dd70: 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
dd80: 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f   view and the co
dd90: 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69  lumn name identi
dda0: 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20  fied an .  **   
ddb0: 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
ddc0: 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e  declared column.
ddd0: 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72   Copy meta infor
dde0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f  mation from *pCo
ddf0: 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  l..  */ .  if( p
de00: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  Col ){.    zData
de10: 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  Type = pCol->zTy
de20: 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71  pe;.    zCollSeq
de30: 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a   = pCol->zColl;.
de40: 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43      notnull = pC
de50: 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a  ol->notNull!=0;.
de60: 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20      primarykey  
de70: 3d 20 70 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65  = pCol->isPrimKe
de80: 79 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e  y!=0;.    autoin
de90: 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d  c = pTab->iPKey=
dea0: 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e  =iCol && (pTab->
deb0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
dec0: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b  toincrement)!=0;
ded0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44  .  }else{.    zD
dee0: 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47  ataType = "INTEG
def0: 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  ER";.    primary
df00: 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  key = 1;.  }.  i
df10: 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a  f( !zCollSeq ){.
df20: 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22      zCollSeq = "
df30: 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72  BINARY";.  }..er
df40: 72 6f 72 5f 6f 75 74 3a 0a 20 20 28 76 6f 69 64  ror_out:.  (void
df50: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66  )sqlite3SafetyOf
df60: 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  f(db);..  /* Whe
df70: 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f  ther the functio
df80: 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64  n call succeeded
df90: 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20   or failed, set 
dfa0: 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d  the output param
dfb0: 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68  eters.  ** to wh
dfc0: 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63  atever their loc
dfd0: 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20  al counterparts 
dfe0: 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65  contain. If an e
dff0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a  rror did occur,.
e000: 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68    ** this has th
e010: 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f  e effect of zero
e020: 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70  ing all output p
e030: 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a  arameters..  */.
e040: 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65    if( pzDataType
e050: 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d   ) *pzDataType =
e060: 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66   zDataType;.  if
e070: 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70  ( pzCollSeq ) *p
e080: 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c  zCollSeq = zColl
e090: 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e  Seq;.  if( pNotN
e0a0: 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20  ull ) *pNotNull 
e0b0: 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28  = notnull;.  if(
e0c0: 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a   pPrimaryKey ) *
e0d0: 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72  pPrimaryKey = pr
e0e0: 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20  imarykey;.  if( 
e0f0: 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74  pAutoinc ) *pAut
e100: 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a  oinc = autoinc;.
e110: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
e120: 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b  ==rc && !pTab ){
e130: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
e140: 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
e150: 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
e160: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
e170: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
e180: 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c   column: %s.%s",
e190: 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20   zTableName,.   
e1a0: 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65       zColumnName
e1b0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
e1c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
e1d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
e1e0: 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25   rc, (zErrMsg?"%
e1f0: 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b  s":0), zErrMsg);
e200: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
e210: 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
e220: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
e230: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
e240: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
e250: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
e260: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
e270: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  endif../*.** Sle
e280: 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
e290: 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
e2a0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
e2b0: 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20  e slept..*/.int 
e2c0: 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e  sqlite3_sleep(in
e2d0: 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  t ms){.  sqlite3
e2e0: 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e  _vfs *pVfs;.  in
e2f0: 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73  t rc;.  pVfs = s
e300: 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
e310: 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d  0);.  if( pVfs==
e320: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
e330: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
e340: 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69  n works in milli
e350: 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65  seconds, but the
e360: 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c   underlying OsSl
e370: 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20  eep() .  ** API 
e380: 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64  uses microsecond
e390: 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30 30  s. Hence the 100
e3a0: 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  0's..  */.  rc =
e3b0: 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70   (sqlite3OsSleep
e3c0: 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f  (pVfs, 1000*ms)/
e3d0: 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
e3e0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61  rc;.}../*.** Ena
e3f0: 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
e400: 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75  he extended resu
e410: 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74  lt codes..*/.int
e420: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
e430: 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73  d_result_codes(s
e440: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
e450: 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74 65  onoff){.  sqlite
e460: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
e470: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
e480: 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20  errMask = onoff 
e490: 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30  ? 0xffffffff : 0
e4a0: 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  xff;.  sqlite3_m
e4b0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
e4c0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
e4d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e4e0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78  .** Invoke the x
e4f0: 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68  FileControl meth
e500: 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  od on a particul
e510: 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ar database..*/.
e520: 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  int sqlite3_file
e530: 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  _control(sqlite3
e540: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
e550: 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f   *zDbName, int o
e560: 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
e570: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e580: 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69  E_ERROR;.  int i
e590: 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  Db;.  sqlite3_mu
e5a0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
e5b0: 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 4e  tex);.  if( zDbN
e5c0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 44  ame==0 ){.    iD
e5d0: 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  b = 0;.  }else{.
e5e0: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
e5f0: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
e600: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
e610: 72 63 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44 62  rcmp(db->aDb[iDb
e620: 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  ].zName, zDbName
e630: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
e640: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 44    }.  }.  if( iD
e650: 62 3c 64 62 2d 3e 6e 44 62 20 29 7b 0a 20 20 20  b<db->nDb ){.   
e660: 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
e670: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
e680: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 72 65  t;.    if( pBtre
e690: 65 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  e ){.      Pager
e6a0: 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20   *pPager;.      
e6b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
e6c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
e6d0: 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
e6e0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 20  );.      pPager 
e6f0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
e700: 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ger(pBtree);.   
e710: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
e720: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 64  r!=0 );.      fd
e730: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
e740: 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
e750: 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30     assert( fd!=0
e760: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 64   );.      if( fd
e770: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
e780: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e790: 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
e7a0: 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20  fd, op, pArg);. 
e7b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e7c0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
e7d0: 42 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Btree);.    }.  
e7e0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
e7f0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
e800: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
e810: 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74     .}../*.** Int
e820: 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65  erface to the te
e830: 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  sting logic..*/.
e840: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  int sqlite3_test
e850: 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c  _control(int op,
e860: 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20   ...){.  int rc 
e870: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
e880: 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
e890: 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20  _TEST.  va_list 
e8a0: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
e8b0: 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
e8c0: 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a  ( op ){..    /*.
e8d0: 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20      ** Save the 
e8e0: 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
e8f0: 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a   the PRNG..    *
e900: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
e910: 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
e920: 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SAVE: {.      sq
e930: 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61  lite3PrngSaveSta
e940: 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
e950: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
e960: 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20  .    ** Restore 
e970: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
e980: 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73   PRNG to the las
e990: 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73  t state saved us
e9a0: 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f  ing.    ** PRNG_
e9b0: 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53  SAVE.  If PRNG_S
e9c0: 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65  AVE has never be
e9d0: 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64  fore been called
e9e0: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
e9f0: 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b  is verb acts lik
ea00: 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20  e PRNG_RESET..  
ea10: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
ea20: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
ea30: 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  NG_RESTORE: {.  
ea40: 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
ea50: 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20  estoreState();. 
ea60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ea70: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
ea80: 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20   Reset the PRNG 
ea90: 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e  back to its unin
eaa0: 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e  itialized state.
eab0: 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a    The next call.
eac0: 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
ead0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77  3_randomness() w
eae0: 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50  ill reseed the P
eaf0: 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67  RNG using a sing
eb00: 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  le call.    ** t
eb10: 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  o the xRandomnes
eb20: 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  s method of the 
eb30: 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20  default VFS..   
eb40: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
eb50: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
eb60: 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20  G_RESET: {.     
eb70: 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 65   sqlite3PrngRese
eb80: 74 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  tState();.      
eb90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
eba0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
ebb0: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
ebc0: 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73  l(BITVEC_TEST, s
ebd0: 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20  ize, program).  
ebe0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20    **.    ** Run 
ebf0: 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61  a test against a
ec00: 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f   Bitvec object o
ec10: 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f  f size.  The pro
ec20: 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20  gram argument.  
ec30: 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79    ** is an array
ec40: 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
ec50: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65  t defines the te
ec60: 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f  st.  Return -1 o
ec70: 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  n a.    ** memor
ec80: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
ec90: 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73  or, 0 on success
eca0: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  , or non-zero fo
ecb0: 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  r an error..    
ecc0: 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74  ** See the sqlit
ecd0: 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
ece0: 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  est() for additi
ecf0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
ed00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
ed10: 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
ed20: 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b  L_BITVEC_TEST: {
ed30: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
ed40: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
ed50: 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f  .      int *aPro
ed60: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  g = va_arg(ap, i
ed70: 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt*);.      rc =
ed80: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
ed90: 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50  iltinTest(sz, aP
eda0: 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rog);.      brea
edb0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
edc0: 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
edd0: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45  _test_control(BE
ede0: 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
edf0: 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29  S, xBegin, xEnd)
ee00: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
ee10: 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f  egister hooks to
ee20: 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74   call to indicat
ee30: 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29  e which malloc()
ee40: 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a   failures .    *
ee50: 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20  * are benign..  
ee60: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
ee70: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45  LITE_TESTCTRL_BE
ee80: 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
ee90: 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64  S: {.      typed
eea0: 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66  ef void (*void_f
eeb0: 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a  unction)(void);.
eec0: 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
eed0: 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e  ion xBenignBegin
eee0: 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e  ;.      void_fun
eef0: 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64  ction xBenignEnd
ef00: 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42  ;.      xBenignB
ef10: 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70  egin = va_arg(ap
ef20: 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  , void_function)
ef30: 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45  ;.      xBenignE
ef40: 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  nd = va_arg(ap, 
ef50: 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
ef60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e        sqlite3Ben
ef70: 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78  ignMallocHooks(x
ef80: 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65  BenignBegin, xBe
ef90: 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20  nignEnd);.      
efa0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
efb0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
efc0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
efd0: 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
efe0: 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  T */.  return rc
eff0: 3b 0a 7d 0a                                      ;.}.