/ Hex Artifact Content
Login

Artifact aaf5af6ffe2c05f8ea4d75a850581a68ac529fa0:


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 34 39 31 20 32 30 30 38 2f 30 38  ,v 1.491 2008/08
0280: 2f 32 30 20 31 36 3a 33 35 3a 31 30 20 64 72 68  /20 16:35:10 drh
0290: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
02a0: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
02b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
02c0: 2e 68 3e 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .h>..#ifdef SQLI
02d0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 23  TE_ENABLE_FTS3.#
02e0: 20 69 6e 63 6c 75 64 65 20 22 66 74 73 33 2e 68   include "fts3.h
02f0: 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ".#endif.#ifdef 
0300: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54  SQLITE_ENABLE_RT
0310: 52 45 45 0a 23 20 69 6e 63 6c 75 64 65 20 22 72  REE.# include "r
0320: 74 72 65 65 2e 68 22 0a 23 65 6e 64 69 66 0a 0a  tree.h".#endif..
0330: 2f 2a 0a 2a 2a 20 54 68 65 20 76 65 72 73 69 6f  /*.** The versio
0340: 6e 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79  n of the library
0350: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 73  .*/.const char s
0360: 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d  qlite3_version[]
0370: 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f   = SQLITE_VERSIO
0380: 4e 3b 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  N;.const char *s
0390: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
03a0: 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  n(void){ return 
03b0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 3b  sqlite3_version;
03c0: 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c   }.int sqlite3_l
03d0: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
03e0: 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53  (void){ return S
03f0: 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
0400: 4d 42 45 52 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  MBER; }.int sqli
0410: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 76  te3_threadsafe(v
0420: 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c  oid){ return SQL
0430: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3b 20  ITE_THREADSAFE; 
0440: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
0450: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
0460: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
0470: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
0480: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ACE)./*.** If th
0490: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
04a0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20  tion pointer is 
04b0: 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a  not NULL and if.
04c0: 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
04d0: 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62  _IOTRACE is enab
04e0: 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67  led, then messag
04f0: 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a  es describing.**
0500: 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20   I/O active are 
0510: 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68  written using th
0520: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  is function.  Th
0530: 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20  ese messages.** 
0540: 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72  are intended for
0550: 20 64 65 62 75 67 67 69 6e 67 20 61 63 74 69 76   debugging activ
0560: 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ity only..*/.voi
0570: 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54 72 61  d (*sqlite3IoTra
0580: 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ce)(const char*,
0590: 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64 69   ...) = 0;.#endi
05a0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
05b0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
05c0: 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73   variable points
05d0: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69   to a string whi
05e0: 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d  ch is the.** nam
05f0: 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
0600: 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65  , then that dire
0610: 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73  ctory will be us
0620: 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74  ed to store.** t
0630: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
0640: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  **.** See also t
0650: 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f  he "PRAGMA temp_
0660: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22  store_directory"
0670: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   SQL command..*/
0680: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74  .char *sqlite3_t
0690: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
06a0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  0;../*.** Initia
06b0: 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a  lize SQLite.  .*
06c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
06d0: 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
06e0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
06f0: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
0700: 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e  tion,.** VFS, an
0710: 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  d mutex subsyste
0720: 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ms prior to doin
0730: 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f  g any serious wo
0740: 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74  rk with.** SQLit
0750: 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20  e.  But as long 
0760: 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f  as you do not co
0770: 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54  mpile with SQLIT
0780: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
0790: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
07a0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61  will be called a
07b0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20  utomatically by 
07c0: 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63  key routines suc
07d0: 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  h as.** sqlite3_
07e0: 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  open().  .**.** 
07f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0800: 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f  a no-op except o
0810: 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73 74  n its very first
0820: 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72   call for the pr
0830: 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72  ocess,.** or for
0840: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
0850: 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
0860: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
0870: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
0880: 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c  t thread to call
0890: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
08a0: 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ns the initializ
08b0: 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70  ation to.** comp
08c0: 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73  letion.  If subs
08d0: 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20 63  equent threads c
08e0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
08f0: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
0900: 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20  t.** thread has 
0910: 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69  finished the ini
0920: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
0930: 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ess, then the su
0940: 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65  bsequent.** thre
0950: 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  ads must block u
0960: 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
0970: 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20 77  hread finishes w
0980: 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ith the initiali
0990: 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  zation..**.** Th
09a0: 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20 6d  e first thread m
09b0: 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72  ight call this r
09c0: 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65  outine recursive
09d0: 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a  ly.  Recursive.*
09e0: 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20  * calls to this 
09f0: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
0a00: 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75  ot block, of cou
0a10: 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  rse.  Otherwise 
0a20: 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  the.** initializ
0a30: 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f  ation process wo
0a40: 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65  uld never comple
0a50: 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20  te..**.** Let X 
0a60: 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68 72  be the first thr
0a70: 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69  ead to enter thi
0a80: 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20  s routine.  Let 
0a90: 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a  Y be some other.
0aa0: 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e  ** thread.  Then
0ab0: 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69   while the initi
0ac0: 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  al invocation of
0ad0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79   this routine by
0ae0: 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c   X is.** incompl
0af0: 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75 69  ete, it is requi
0b00: 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  red that:.**.** 
0b10: 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74     *  Calls to t
0b20: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d  his routine from
0b30: 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e   Y must block un
0b40: 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f  til the outer-mo
0b50: 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c  st.**       call
0b60: 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e   by X completes.
0b70: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63  .**.**    *  Rec
0b80: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20  ursive calls to 
0b90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
0ba0: 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75 72  m thread X retur
0bb0: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  n immediately.**
0bc0: 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 62         without b
0bd0: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
0be0: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
0bf0: 7a 65 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ze(void){.  stat
0c00: 69 63 20 69 6e 74 20 69 6e 50 72 6f 67 72 65 73  ic int inProgres
0c10: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  s = 0;        /*
0c20: 20 50 72 65 76 65 6e 74 20 72 65 63 75 72 73 69   Prevent recursi
0c30: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
0c40: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
0c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0c60: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
0c70: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
0ca0: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  ult code */..  /
0cb0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61  * If SQLite is a
0cc0: 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74 65 6c  lready completel
0cd0: 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74  y initialized, t
0ce0: 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a 20 20  hen this call.  
0cf0: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e  ** to sqlite3_in
0d00: 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c  itialize() shoul
0d10: 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  d be a no-op.  B
0d20: 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ut the initializ
0d30: 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73 74 20  ation.  ** must 
0d40: 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20 53 6f  be complete.  So
0d50: 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e 6f 74   isInit must not
0d60: 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20 74 68   be set until th
0d70: 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a 2a 20  e very end.  ** 
0d80: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  of this routine.
0d90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
0da0: 74 65 33 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  te3Config.isInit
0db0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
0dc0: 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  _OK;..  /* Make 
0dd0: 73 75 72 65 20 74 68 65 20 6d 75 74 65 78 20 73  sure the mutex s
0de0: 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74  ubsystem is init
0df0: 69 61 6c 69 7a 65 64 2e 20 20 49 66 20 75 6e 61  ialized.  If una
0e00: 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69  ble to .  ** ini
0e10: 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 75 74 65  tialize the mute
0e20: 78 20 73 75 62 73 79 73 74 65 6d 2c 20 72 65 74  x subsystem, ret
0e30: 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 20 74  urn early with t
0e40: 68 65 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49  he error..  ** I
0e50: 66 20 74 68 65 20 73 79 73 74 65 6d 20 69 73 20  f the system is 
0e60: 73 6f 20 73 69 63 6b 20 74 68 61 74 20 77 65 20  so sick that we 
0e70: 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c  are unable to al
0e80: 6c 6f 63 61 74 65 20 61 20 6d 75 74 65 78 2c 0a  locate a mutex,.
0e90: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f    ** there is no
0ea0: 74 20 6d 75 63 68 20 53 51 4c 69 74 65 20 69 73  t much SQLite is
0eb0: 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 61 62 6c   going to be abl
0ec0: 65 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20  e to do..  **.  
0ed0: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 73 75 62  ** The mutex sub
0ee0: 73 79 73 74 65 6d 20 6d 75 73 74 20 74 61 6b 65  system must take
0ef0: 20 63 61 72 65 20 6f 66 20 73 65 72 69 61 6c 69   care of seriali
0f00: 7a 69 6e 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a  zing its own.  *
0f10: 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  * initialization
0f20: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
0f30: 6c 69 74 65 33 4d 75 74 65 78 49 6e 69 74 28 29  lite3MutexInit()
0f40: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
0f50: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e  urn rc;..  /* In
0f60: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c  itialize the mal
0f70: 6c 6f 63 28 29 20 73 79 73 74 65 6d 20 61 6e 64  loc() system and
0f80: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
0f90: 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e  InitMutex mutex.
0fa0: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70 65 72 61  .  ** This opera
0fb0: 74 69 6f 6e 20 69 73 20 70 72 6f 74 65 63 74 65  tion is protecte
0fc0: 64 20 62 79 20 74 68 65 20 53 54 41 54 49 43 5f  d by the STATIC_
0fd0: 4d 41 53 54 45 52 20 6d 75 74 65 78 2e 20 20 4e  MASTER mutex.  N
0fe0: 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75  ote that.  ** Mu
0ff0: 74 65 78 41 6c 6c 6f 63 28 29 20 69 73 20 63 61  texAlloc() is ca
1000: 6c 6c 65 64 20 66 6f 72 20 61 20 73 74 61 74 69  lled for a stati
1010: 63 20 6d 75 74 65 78 20 70 72 69 6f 72 20 74 6f  c mutex prior to
1020: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
1030: 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75  e.  ** malloc su
1040: 62 73 79 73 74 65 6d 20 2d 20 74 68 69 73 20 69  bsystem - this i
1050: 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20  mplies that the 
1060: 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  allocation of a 
1070: 73 74 61 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65  static.  ** mute
1080: 78 20 6d 75 73 74 20 6e 6f 74 20 72 65 71 75 69  x must not requi
1090: 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  re support from 
10a0: 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79  the malloc subsy
10b0: 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  stem..  */.  pMa
10c0: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
10d0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
10e0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
10f0: 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TER);.  sqlite3_
1100: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
1110: 74 65 72 29 3b 0a 20 20 69 66 28 20 21 73 71 6c  ter);.  if( !sql
1120: 69 74 65 33 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  ite3Config.isMal
1130: 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 72  locInit ){.    r
1140: 63 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  c = sqlite3Mallo
1150: 63 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69  cInit();.  }.  i
1160: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1170: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
1180: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
1190: 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  it = 1;.    if( 
11a0: 21 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 70  !sqlite3Config.p
11b0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
11c0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67     sqlite3Config
11d0: 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 73 71  .pInitMutex = sq
11e0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
11f0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
1200: 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20 69  URSIVE);.      i
1210: 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67  f( sqlite3Config
1220: 2e 62 43 6f 72 65 4d 75 74 65 78 20 26 26 20 21  .bCoreMutex && !
1230: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 70 49  sqlite3Config.pI
1240: 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  nitMutex ){.    
1250: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1260: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
1270: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1280: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
1290: 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  utex++;.  }.  sq
12a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12b0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f  e(pMaster);..  /
12c0: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 69  * If unable to i
12d0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61  nitialize the ma
12e0: 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2c 20  lloc subsystem, 
12f0: 74 68 65 6e 20 72 65 74 75 72 6e 20 65 61 72 6c  then return earl
1300: 79 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73  y..  ** There is
1310: 20 6c 69 74 74 6c 65 20 68 6f 70 65 20 6f 66 20   little hope of 
1320: 67 65 74 74 69 6e 67 20 53 51 4c 69 74 65 20 74  getting SQLite t
1330: 6f 20 72 75 6e 20 69 66 20 74 68 65 20 6d 61 6c  o run if the mal
1340: 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74  loc.  ** subsyst
1350: 65 6d 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 69  em cannot be ini
1360: 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
1370: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1380: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1390: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44   rc;.  }..  /* D
13a0: 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  o the rest of th
13b0: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
13c0: 20 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72   under the recur
13d0: 73 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20  sive mutex so.  
13e0: 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  ** that we will 
13f0: 62 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c  be able to handl
1400: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1410: 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  s into.  ** sqli
1420: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1430: 2e 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65  .  The recursive
1440: 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20   calls normally 
1450: 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a  come through.  *
1460: 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  * sqlite3_os_ini
1470: 74 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f  t() when it invo
1480: 6b 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  kes sqlite3_vfs_
1490: 72 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20  register(), but 
14a0: 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72  other.  ** recur
14b0: 73 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74  sive calls might
14c0: 20 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c   also be possibl
14d0: 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
14e0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
14f0: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 70 49 6e 69  lite3Config.pIni
1500: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
1510: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 69 73 49  qlite3Config.isI
1520: 6e 69 74 3d 3d 30 20 26 26 20 69 6e 50 72 6f 67  nit==0 && inProg
1530: 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ress==0 ){.    i
1540: 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20  nProgress = 1;. 
1550: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1560: 6f 73 5f 69 6e 69 74 28 29 3b 0a 20 20 20 20 69  os_init();.    i
1570: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1580: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1590: 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74  qlite3PcacheInit
15a0: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 20 20  ialize();.      
15b0: 73 71 6c 69 74 65 33 50 43 61 63 68 65 42 75 66  sqlite3PCacheBuf
15c0: 66 65 72 53 65 74 75 70 28 73 71 6c 69 74 65 33  ferSetup(sqlite3
15d0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 73 71  Config.pPage, sq
15e0: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 73 7a 50 61  lite3Config.szPa
15f0: 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  ge, .          s
1600: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 50 61  qlite3Config.nPa
1610: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
1620: 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  nProgress = 0;. 
1630: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67     sqlite3Config
1640: 2e 69 73 49 6e 69 74 20 3d 20 28 72 63 3d 3d 53  .isInit = (rc==S
1650: 51 4c 49 54 45 5f 4f 4b 20 3f 20 31 20 3a 20 30  QLITE_OK ? 1 : 0
1660: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1670: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
1680: 69 74 65 33 43 6f 6e 66 69 67 2e 70 49 6e 69 74  ite3Config.pInit
1690: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f  Mutex);..  /* Go
16a0: 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20   back under the 
16b0: 73 74 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64  static mutex and
16c0: 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65   clean up the re
16d0: 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74  cursive.  ** mut
16e0: 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20  ex to prevent a 
16f0: 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20  resource leak.. 
1700: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1710: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
1720: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e  r);.  sqlite3Con
1730: 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65  fig.nRefInitMute
1740: 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  x--;.  if( sqlit
1750: 65 33 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  e3Config.nRefIni
1760: 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20  tMutex<=0 ){.   
1770: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1780: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
1790: 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
17a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
17b0: 65 28 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  e(sqlite3Config.
17c0: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20  pInitMutex);.   
17d0: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 70   sqlite3Config.p
17e0: 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20  InitMutex = 0;. 
17f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1800: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1810: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
1820: 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61  lowing is just a
1830: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f   sanity check to
1840: 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74   make sure SQLit
1850: 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20  e has.  ** been 
1860: 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74  compiled correct
1870: 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72  ly.  It is impor
1880: 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73  tant to run this
1890: 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20   code, but.  ** 
18a0: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
18b0: 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65   run it too ofte
18c0: 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50  n and soak up CP
18d0: 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a  U cycles for no.
18e0: 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f    ** reason.  So
18f0: 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20   we run it once 
1900: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
1910: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ation..  */.#ifn
1920: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
1930: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 6f 66 20  This section of 
1940: 63 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74  code's only "out
1950: 70 75 74 22 20 69 73 20 76 69 61 20 61 73 73 65  put" is via asse
1960: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
1970: 20 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d 53   */.  if ( rc==S
1980: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1990: 75 36 34 20 78 20 3d 20 28 28 28 75 36 34 29 31  u64 x = (((u64)1
19a0: 29 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f  )<<63)-1;.    do
19b0: 75 62 6c 65 20 79 3b 0a 20 20 20 20 61 73 73 65  uble y;.    asse
19c0: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29  rt(sizeof(x)==8)
19d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a  ;.    assert(siz
19e0: 65 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79  eof(x)==sizeof(y
19f0: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
1a00: 79 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 61  y, &x, 8);.    a
1a10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 49 73  ssert( sqlite3Is
1a20: 4e 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65  NaN(y) );.  }.#e
1a30: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
1a40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  c;.}../*.** Undo
1a50: 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
1a60: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1a70: 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20  ze().  Must not 
1a80: 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a  be called while.
1a90: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  ** there are out
1aa0: 73 74 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73  standing databas
1ab0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
1ac0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1ad0: 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20  ons or.** while 
1ae0: 61 6e 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69  any part of SQLi
1af0: 74 65 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  te is otherwise 
1b00: 69 6e 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68  in use in any th
1b10: 72 65 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  read.  This.** r
1b20: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  outine is not th
1b30: 72 65 61 64 73 61 66 65 2e 20 20 4e 6f 74 20 62  readsafe.  Not b
1b40: 79 20 61 20 6c 6f 6e 67 20 73 68 6f 74 2e 0a 2a  y a long shot..*
1b50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68  /.int sqlite3_sh
1b60: 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 20 20  utdown(void){.  
1b70: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 69 73  sqlite3Config.is
1b80: 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a  MallocInit = 0;.
1b90: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
1ba0: 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 69 66 28  hutdown();.  if(
1bb0: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 69   sqlite3Config.i
1bc0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  sInit ){.    sql
1bd0: 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20  ite3_os_end();. 
1be0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1bf0: 43 6f 6e 66 69 67 2e 6d 2e 78 53 68 75 74 64 6f  Config.m.xShutdo
1c00: 77 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  wn ){.    sqlite
1c10: 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20  3MallocEnd();.  
1c20: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43  }.  if( sqlite3C
1c30: 6f 6e 66 69 67 2e 6d 75 74 65 78 2e 78 4d 75 74  onfig.mutex.xMut
1c40: 65 78 45 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c  exEnd ){.    sql
1c50: 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a  ite3MutexEnd();.
1c60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e    }.  sqlite3Con
1c70: 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  fig.isInit = 0;.
1c80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
1ca0: 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70  s API allows app
1cb0: 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64  lications to mod
1cc0: 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63  ify the global c
1cd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a  onfiguration of.
1ce0: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  ** the SQLite li
1cf0: 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d  brary at run-tim
1d00: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1d10: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
1d20: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
1d30: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
1d40: 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74  tstanding.** dat
1d50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1d60: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
1d70: 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72  cations.  This r
1d80: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a  outine is not.**
1d90: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61   threadsafe.  Fa
1da0: 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68  ilure to heed th
1db0: 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e  ese warnings can
1dc0: 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69   lead to unpredi
1dd0: 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69  ctable.** behavi
1de0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
1df0: 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70  e3_config(int op
1e00: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1e10: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ap;.  int rc =
1e20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1e30: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
1e40: 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20  () shall return 
1e50: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66  SQLITE_MISUSE if
1e60: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77   it is invoked w
1e70: 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51  hile.  ** the SQ
1e80: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20  Lite library is 
1e90: 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28  in use. */.  if(
1ea0: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 69   sqlite3Config.i
1eb0: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
1ec0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 0a 20  QLITE_MISUSE;.. 
1ed0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70   va_start(ap, op
1ee0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
1ef0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1f00: 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
1f10: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
1f20: 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d  /* Disable all m
1f30: 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20  utexing */.     
1f40: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62   sqlite3Config.b
1f50: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 0a 20  CoreMutex = 0;. 
1f60: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66       sqlite3Conf
1f70: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
1f80: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1f90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1fa0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c  QLITE_CONFIG_MUL
1fb0: 54 49 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20  TITHREAD: {.    
1fc0: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74    /* Disable mut
1fd0: 65 78 69 6e 67 20 6f 66 20 64 61 74 61 62 61 73  exing of databas
1fe0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
1ff0: 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65  .      /* Enable
2000: 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 63 6f 72   mutexing of cor
2010: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
2020: 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  s */.      sqlit
2030: 65 33 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  e3Config.bCoreMu
2040: 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  tex = 1;.      s
2050: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62 46 75  qlite3Config.bFu
2060: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20  llMutex = 0;.   
2070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2080: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2090: 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45  CONFIG_SERIALIZE
20a0: 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e  D: {.      /* En
20b0: 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e  able all mutexin
20c0: 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  g */.      sqlit
20d0: 65 33 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  e3Config.bCoreMu
20e0: 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  tex = 1;.      s
20f0: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62 46 75  qlite3Config.bFu
2100: 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20  llMutex = 1;.   
2110: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2120: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2130: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b  CONFIG_MALLOC: {
2140: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
2150: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
2160: 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e   malloc implemen
2170: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
2180: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d 20  sqlite3Config.m 
2190: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
21a0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
21b0: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
21c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
21d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47   SQLITE_CONFIG_G
21e0: 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20  ETMALLOC: {.    
21f0: 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68    /* Retrieve th
2200: 65 20 63 75 72 72 65 6e 74 20 6d 61 6c 6c 6f 63  e current malloc
2210: 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  () implementatio
2220: 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  n */.      if( s
2230: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d 2e 78  qlite3Config.m.x
2240: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
2250: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
2260: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
2270: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
2280: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
2290: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d 3b 0a 20  lite3Config.m;. 
22a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22b0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
22c0: 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20  E_CONFIG_MUTEX: 
22d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
22e0: 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  fy an alternativ
22f0: 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e  e mutex implemen
2300: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
2310: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d 75  sqlite3Config.mu
2320: 74 65 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  tex = *va_arg(ap
2330: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
2340: 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20  methods*);.     
2350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2360: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2370: 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b  NFIG_GETMUTEX: {
2380: 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65  .      /* Retrie
2390: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  ve the current m
23a0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
23b0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61  ion */.      *va
23c0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
23d0: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
23e0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67   = sqlite3Config
23f0: 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72  .mutex;.      br
2400: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2410: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
2420: 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20  G_MEMSTATUS: {. 
2430: 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6f       /* Enable o
2440: 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 6d 61  r disable the ma
2450: 6c 6c 6f 63 20 73 74 61 74 75 73 20 63 6f 6c 6c  lloc status coll
2460: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ection */.      
2470: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62 4d  sqlite3Config.bM
2480: 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28  emstat = va_arg(
2490: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
24a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
24b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
24c0: 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20  FIG_SCRATCH: {. 
24d0: 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74       /* Designat
24e0: 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 73  e a buffer for s
24f0: 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70  cratch memory sp
2500: 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ace */.      sql
2510: 69 74 65 33 43 6f 6e 66 69 67 2e 70 53 63 72 61  ite3Config.pScra
2520: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
2530: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
2540: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 73 7a 53  qlite3Config.szS
2550: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
2560: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
2570: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53  sqlite3Config.nS
2580: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
2590: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
25a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
25b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
25c0: 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b  FIG_PAGECACHE: {
25d0: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
25e0: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
25f0: 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
2600: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73  space */.      s
2610: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 70 50 61  qlite3Config.pPa
2620: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
2630: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
2640: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 73 7a 50 61  lite3Config.szPa
2650: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
2660: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
2670: 74 65 33 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20  te3Config.nPage 
2680: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
2690: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
26a0: 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e      }..#if defin
26b0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
26c0: 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66  _MEMSYS3) || def
26d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
26e0: 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20  LE_MEMSYS5).    
26f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2700: 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20  IG_HEAP: {.     
2710: 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20   /* Designate a 
2720: 62 75 66 66 65 72 20 66 6f 72 20 68 65 61 70 20  buffer for heap 
2730: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a  memory space */.
2740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
2750: 66 69 67 2e 70 48 65 61 70 20 3d 20 76 61 5f 61  fig.pHeap = va_a
2760: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
2770: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66       sqlite3Conf
2780: 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72  ig.nHeap = va_ar
2790: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
27a0: 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e    sqlite3Config.
27b0: 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61  mnReq = va_arg(a
27c0: 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20  p, int);..      
27d0: 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69  if( sqlite3Confi
27e0: 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20  g.pHeap==0 ){.  
27f0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2800: 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20  heap pointer is 
2810: 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f  NULL, then resto
2820: 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d  re the malloc im
2830: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20  plementation.   
2840: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20       ** back to 
2850: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f  NULL pointers to
2860: 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  o.  This will ca
2870: 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74  use the malloc t
2880: 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  o go.        ** 
2890: 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61  back to its defa
28a0: 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ult implementati
28b0: 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f  on when sqlite3_
28c0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a  initialize() is.
28d0: 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a          ** run..
28e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28f0: 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74     memset(&sqlit
2900: 65 33 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  e3Config.m, 0, s
2910: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 43 6f 6e  izeof(sqlite3Con
2920: 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d  fig.m));.      }
2930: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2940: 20 54 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65   The heap pointe
2950: 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  r is not NULL, t
2960: 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20  hen install one 
2970: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
2980: 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20  * mem5.c/mem3.c 
2990: 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74  methods. If neit
29a0: 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  her ENABLE_MEMSY
29b0: 53 33 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a  S3 nor.        *
29c0: 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  * ENABLE_MEMSYS5
29d0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74   is defined, ret
29e0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
29f0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 65 66        ** the def
2a00: 61 75 6c 74 20 63 61 73 65 20 61 6e 64 20 72 65  ault case and re
2a10: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20  turn an error.. 
2a20: 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66         */.#ifdef
2a30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
2a40: 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73  EMSYS3.        s
2a50: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d 20 3d  qlite3Config.m =
2a60: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
2a70: 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64 69 66  emsys3();.#endif
2a80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2a90: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20  NABLE_MEMSYS5.  
2aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
2ab0: 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33  fig.m = *sqlite3
2ac0: 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b  MemGetMemsys5();
2ad0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
2ae0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2af0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64   }.#endif..#if d
2b00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
2b10: 41 42 4c 45 5f 4d 45 4d 53 59 53 36 29 0a 20 20  ABLE_MEMSYS6).  
2b20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2b30: 4e 46 49 47 5f 43 48 55 4e 4b 41 4c 4c 4f 43 3a  NFIG_CHUNKALLOC:
2b40: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
2b50: 43 6f 6e 66 69 67 2e 6e 53 6d 61 6c 6c 20 3d 20  Config.nSmall = 
2b60: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
2b70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
2b80: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
2b90: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 36 28 29  3MemGetMemsys6()
2ba0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2bb0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
2bc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2bd0: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
2be0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
2bf0: 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65  nfig.szLookaside
2c00: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
2c10: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2c20: 33 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69  3Config.nLookasi
2c30: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
2c40: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
2c50: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65  k;.    }..    de
2c60: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
2c70: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2c80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2c90: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
2ca0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
2cb0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
2cc0: 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64   up the lookasid
2cd0: 65 20 62 75 66 66 65 72 73 20 66 6f 72 20 61 20  e buffers for a 
2ce0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2cf0: 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ion..** Return S
2d00: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
2d10: 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f  ess.  .** If loo
2d20: 6b 61 73 69 64 65 20 69 73 20 61 6c 72 65 61 64  kaside is alread
2d30: 79 20 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e  y active, return
2d40: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a   SQLITE_BUSY..**
2d50: 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d  .** The sz param
2d60: 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62  eter is the numb
2d70: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65  er of bytes in e
2d80: 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c  ach lookaside sl
2d90: 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70  ot..** The cnt p
2da0: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
2db0: 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e  number of slots.
2dc0: 20 20 49 66 20 70 53 74 61 72 74 20 69 73 20 4e    If pStart is N
2dd0: 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65  ULL the.** space
2de0: 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69   for the lookasi
2df0: 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74  de memory is obt
2e00: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2e10: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
2e20: 49 66 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74  If pStart is not
2e30: 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73   NULL then it is
2e40: 20 73 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66   sz*cnt bytes of
2e50: 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66   memory to use f
2e60: 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73  or.** the lookas
2e70: 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ide memory..*/.s
2e80: 74 61 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c  tatic int setupL
2e90: 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33  ookaside(sqlite3
2ea0: 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66   *db, void *pBuf
2eb0: 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e  , int sz, int cn
2ec0: 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70 53 74 61  t){.  void *pSta
2ed0: 72 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f  rt;.  if( db->lo
2ee0: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a  okaside.nOut ){.
2ef0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f00: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 69 66  E_BUSY;.  }.  if
2f10: 28 20 73 7a 3c 30 20 29 20 73 7a 20 3d 20 30 3b  ( sz<0 ) sz = 0;
2f20: 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63  .  if( cnt<0 ) c
2f30: 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 42  nt = 0;.  if( pB
2f40: 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20  uf==0 ){.    sz 
2f50: 3d 20 28 73 7a 20 2b 20 37 29 26 7e 37 3b 0a 20  = (sz + 7)&~7;. 
2f60: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
2f70: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
2f80: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
2f90: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
2fa0: 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
2fb0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
2fc0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2fd0: 73 7a 20 3d 20 73 7a 26 7e 37 3b 0a 20 20 20 20  sz = sz&~7;.    
2fe0: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
2ff0: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f   }.  if( db->loo
3000: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
3010: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
3020: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
3030: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
3040: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
3050: 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b  pStart = pStart;
3060: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
3070: 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62  .pFree = 0;.  db
3080: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d  ->lookaside.sz =
3090: 20 73 7a 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61   sz;.  db->looka
30a0: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d  side.bMalloced =
30b0: 20 70 42 75 66 3d 3d 30 3b 0a 20 20 69 66 28 20   pBuf==0;.  if( 
30c0: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e  pStart ){.    in
30d0: 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69  t i;.    Lookasi
30e0: 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 70  deSlot *p;.    p
30f0: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
3100: 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66  t*)pStart;.    f
3110: 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30  or(i=cnt-1; i>=0
3120: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
3130: 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f  >pNext = db->loo
3140: 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20  kaside.pFree;.  
3150: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
3160: 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20  e.pFree = p;.   
3170: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
3180: 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29  eSlot*)&((u8*)p)
3190: 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [sz];.    }.    
31a0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
31b0: 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e  nd = p;.    db->
31c0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
31d0: 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
31e0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
31f0: 64 65 2e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20  de.pEnd = 0;.   
3200: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
3210: 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 7d  Enabled = 0;.  }
3220: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3230: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
3240: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74  nfiguration sett
3250: 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69  ings for an indi
3260: 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65 20  vidual database 
3270: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e  connection.*/.in
3280: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t sqlite3_db_con
3290: 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fig(sqlite3 *db,
32a0: 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20   int op, ...){. 
32b0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
32c0: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
32d0: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
32e0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
32f0: 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ase SQLITE_DBCON
3300: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
3310: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75  .      void *pBu
3320: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  f = va_arg(ap, v
3330: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  oid*);.      int
3340: 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
3350: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74   int);.      int
3360: 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70   cnt = va_arg(ap
3370: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  , int);.      rc
3380: 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64   = setupLookasid
3390: 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20  e(db, pBuf, sz, 
33a0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  cnt);.      brea
33b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
33c0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
33d0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
33e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
33f0: 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64    }.  }.  va_end
3400: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (ap);.  return r
3410: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  c;.}../*.** Rout
3420: 69 6e 65 20 6e 65 65 64 65 64 20 74 6f 20 73 75  ine needed to su
3430: 70 70 6f 72 74 20 74 68 65 20 74 65 73 74 63 61  pport the testca
3440: 73 65 28 29 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  se() macro..*/.#
3450: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 56  ifdef SQLITE_COV
3460: 45 52 41 47 45 5f 54 45 53 54 0a 76 6f 69 64 20  ERAGE_TEST.void 
3470: 73 71 6c 69 74 65 33 43 6f 76 65 72 61 67 65 28  sqlite3Coverage(
3480: 69 6e 74 20 78 29 7b 0a 20 20 73 74 61 74 69 63  int x){.  static
3490: 20 69 6e 74 20 64 75 6d 6d 79 20 3d 20 30 3b 0a   int dummy = 0;.
34a0: 20 20 64 75 6d 6d 79 20 2b 3d 20 78 3b 0a 7d 0a    dummy += x;.}.
34b0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 52  #endif.../*.** R
34c0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
34d0: 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d  e buffer z[0..n-
34e0: 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  1] contains all 
34f0: 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  spaces..*/.stati
3500: 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28  c int allSpaces(
3510: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
3520: 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt n){.  while( 
3530: 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>0 && z[n-1]=='
3540: 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72   ' ){ n--; }.  r
3550: 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f  eturn n==0;.}../
3560: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
3570: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
3580: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ng function name
3590: 64 20 22 42 49 4e 41 52 59 22 20 77 68 69 63 68  d "BINARY" which
35a0: 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76   is always.** av
35b0: 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  ailable..**.** I
35c0: 66 20 74 68 65 20 70 61 64 46 6c 61 67 20 61 72  f the padFlag ar
35d0: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
35e0: 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70 61  LL then space pa
35f0: 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64  dding at the end
3600: 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69  .** of strings i
3610: 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  s ignored.  This
3620: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
3630: 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e  RTRIM collation.
3640: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
3650: 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f  inCollFunc(.  vo
3660: 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69  id *padFlag,.  i
3670: 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
3680: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
3690: 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
36a0: 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
36b0: 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20   int rc, n;.  n 
36c0: 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20  = nKey1<nKey2 ? 
36d0: 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20  nKey1 : nKey2;. 
36e0: 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65   rc = memcmp(pKe
36f0: 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20  y1, pKey2, n);. 
3700: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
3710: 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20    if( padFlag.  
3720: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
3730: 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e  ((char*)pKey1)+n
3740: 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20  , nKey1-n).     
3750: 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63  && allSpaces(((c
3760: 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e  har*)pKey2)+n, n
3770: 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20  Key2-n).    ){. 
3780: 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63       /* Leave rc
3790: 20 75 6e 63 68 61 6e 67 65 64 20 61 74 20 30 20   unchanged at 0 
37a0: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
37b0: 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
37c0: 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20   nKey2;.    }.  
37d0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
37e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20  ../*.** Another 
37f0: 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
3800: 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43  ng sequence: NOC
3810: 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ASE. .**.** This
3820: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
3830: 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  nce is intended 
3840: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22  to be used for "
3850: 63 61 73 65 20 69 6e 64 65 70 65 6e 64 61 6e 74  case independant
3860: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e  .** comparison".
3870: 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65   SQLite's knowle
3880: 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64  dge of upper and
3890: 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69   lower case equi
38a0: 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e  valents.** exten
38b0: 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32  ds only to the 2
38c0: 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65  6 characters use
38d0: 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68  d in the English
38e0: 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a   language..**.**
38f0: 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74   At the moment t
3900: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55  here is only a U
3910: 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74  TF-8 implementat
3920: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
3930: 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  nt nocaseCollati
3940: 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  ngFunc(.  void *
3950: 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e  NotUsed,.  int n
3960: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
3970: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
3980: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
3990: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
39a0: 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e   r = sqlite3StrN
39b0: 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e  ICmp(.      (con
39c0: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c  st char *)pKey1,
39d0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
39e0: 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65  Key2, (nKey1<nKe
39f0: 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29  y2)?nKey1:nKey2)
3a00: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
3a10: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
3a20: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
3a30: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
3a40: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
3a50: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
3a60: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
3a70: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
3a80: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
3a90: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
3aa0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61  .  return db->la
3ab0: 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  stRowid;.}../*.*
3ac0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
3ad0: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69  ber of changes i
3ae0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
3af0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
3b00: 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74  3_exec()..*/.int
3b10: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
3b20: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3b30: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61   return db->nCha
3b40: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nge;.}../*.** Re
3b50: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
3b60: 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65  of changes since
3b70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
3b80: 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e  ndle was opened.
3b90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
3ba0: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71  total_changes(sq
3bb0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
3bc0: 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  turn db->nTotalC
3bd0: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
3be0: 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Close an existin
3bf0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
3c00: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
3c10: 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  _close(sqlite3 *
3c20: 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  db){.  HashElem 
3c30: 2a 69 3b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20  *i;.  int j;..  
3c40: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
3c50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3c60: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
3c70: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
3c80: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
3c90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3ca0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71  MISUSE;.  }.  sq
3cb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
3cc0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 23  r(db->mutex);..#
3cd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45  ifdef SQLITE_SSE
3ce0: 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  .  {.    extern 
3cf0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 73 65 43  void sqlite3SseC
3d00: 6c 65 61 6e 75 70 28 73 71 6c 69 74 65 33 2a 29  leanup(sqlite3*)
3d10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 73 65  ;.    sqlite3Sse
3d20: 43 6c 65 61 6e 75 70 28 64 62 29 3b 0a 20 20 7d  Cleanup(db);.  }
3d30: 0a 23 65 6e 64 69 66 20 0a 0a 20 20 73 71 6c 69  .#endif ..  sqli
3d40: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
3d50: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a  Schema(db, 0);..
3d60: 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61    /* If a transa
3d70: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74  ction is open, t
3d80: 68 65 20 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  he ResetInternal
3d90: 53 63 68 65 6d 61 28 29 20 63 61 6c 6c 20 61 62  Schema() call ab
3da0: 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ove.  ** will no
3db0: 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68  t have called th
3dc0: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20  e xDisconnect() 
3dd0: 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69  method on any vi
3de0: 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65  rtual.  ** table
3df0: 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54  s in the db->aVT
3e00: 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68  rans[] array. Th
3e10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
3e20: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
3e30: 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c  ).  ** call will
3e40: 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20   do so. We need 
3e50: 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72  to do this befor
3e60: 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20  e the check for 
3e70: 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20  active.  ** SQL 
3e80: 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77  statements below
3e90: 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65  , as the v-table
3ea0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
3eb0: 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20  may be storing. 
3ec0: 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65   ** some prepare
3ed0: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  d statements int
3ee0: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
3ef0: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
3f00: 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49  ack(db);..  /* I
3f10: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
3f20: 6f 75 74 73 74 61 6e 64 69 6e 67 20 56 4d 73 2c  outstanding VMs,
3f30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
3f40: 55 53 59 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62  USY. */.  if( db
3f50: 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73  ->pVdbe ){.    s
3f60: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
3f70: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
3f80: 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f        "Unable to
3f90: 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e   close due to un
3fa0: 66 69 6e 61 6c 69 73 65 64 20 73 74 61 74 65 6d  finalised statem
3fb0: 65 6e 74 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  ents");.    sqli
3fc0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
3fd0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
3fe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
3ff0: 53 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  SY;.  }.  assert
4000: 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43  ( sqlite3SafetyC
4010: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
4020: 20 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20   );..  for(j=0; 
4030: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
4040: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
4050: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a  pDb = &db->aDb[j
4060: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
4070: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pBt ){.      sql
4080: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
4090: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
40a0: 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20  pDb->pBt = 0;.  
40b0: 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a      if( j!=1 ){.
40c0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63          pDb->pSc
40d0: 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  hema = 0;.      
40e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
40f0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
4100: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
4110: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
4120: 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72  Db<=2 );.  asser
4130: 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e  t( db->aDb==db->
4140: 61 44 62 53 74 61 74 69 63 20 29 3b 0a 20 20 66  aDbStatic );.  f
4150: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
4160: 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e 63 29  irst(&db->aFunc)
4170: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
4180: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 46  hNext(i)){.    F
4190: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 2c 20 2a  uncDef *pFunc, *
41a0: 70 4e 65 78 74 3b 0a 20 20 20 20 66 6f 72 28 70  pNext;.    for(p
41b0: 46 75 6e 63 20 3d 20 28 46 75 6e 63 44 65 66 2a  Func = (FuncDef*
41c0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
41d0: 69 29 3b 20 70 46 75 6e 63 3b 20 70 46 75 6e 63  i); pFunc; pFunc
41e0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70  =pNext){.      p
41f0: 4e 65 78 74 20 3d 20 70 46 75 6e 63 2d 3e 70 4e  Next = pFunc->pN
4200: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
4210: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 75  e3DbFree(db, pFu
4220: 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nc);.    }.  }..
4230: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
4240: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f  shFirst(&db->aCo
4250: 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c  llSeq); i; i=sql
4260: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
4270: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
4280: 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a  oll = (CollSeq *
4290: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
42a0: 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  i);.    /* Invok
42b0: 65 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72  e any destructor
42c0: 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
42d0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
42e0: 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a  nce user data. *
42f0: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
4300: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
4310: 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65  if( pColl[j].xDe
4320: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
4330: 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c  ll[j].xDel(pColl
4340: 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20  [j].pUser);.    
4350: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
4360: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4370: 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  pColl);.  }.  sq
4380: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
4390: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
43a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
43b0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
43c0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
43d0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
43e0: 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69  dule); i; i=sqli
43f0: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
4400: 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64      Module *pMod
4410: 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c   = (Module *)sql
4420: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
4430: 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44      if( pMod->xD
4440: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
4450: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70  pMod->xDestroy(p
4460: 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Mod->pAux);.    
4470: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
4480: 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20  ree(db, pMod);. 
4490: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
44a0: 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75  Clear(&db->aModu
44b0: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  le);.#endif..  s
44c0: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
44d0: 26 64 62 2d 3e 61 46 75 6e 63 29 3b 0a 20 20 73  &db->aFunc);.  s
44e0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
44f0: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f  SQLITE_OK, 0); /
4500: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
4510: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
4520: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 69 66 28  trings. */.  if(
4530: 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20   db->pErr ){.   
4540: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
4550: 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 7d  e(db->pErr);.  }
4560: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45  .  sqlite3CloseE
4570: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a  xtensions(db);..
4580: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
4590: 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52  LITE_MAGIC_ERROR
45a0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70  ;..  /* The temp
45b0: 2d 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  -database schema
45c0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69   is allocated di
45d0: 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74  fferently from t
45e0: 68 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a  he other schema.
45f0: 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73    ** objects (us
4600: 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ing sqliteMalloc
4610: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  () directly, ins
4620: 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42  tead of sqlite3B
4630: 74 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20  treeSchema()).. 
4640: 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20   ** So it needs 
4650: 74 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65  to be freed here
4660: 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20  . Todo: Why not 
4670: 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63  roll the temp sc
4680: 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  hema into.  ** t
4690: 68 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61  he same sqliteMa
46a0: 6c 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e  lloc() as the on
46b0: 65 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73  e that allocates
46c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
46d0: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20   ** structure?. 
46e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
46f0: 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  ree(db, db->aDb[
4700: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  1].pSchema);.  s
4710: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
4720: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
4730: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
4740: 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
4750: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
4760: 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78  x_free(db->mutex
4770: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  );.  if( db->loo
4780: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
4790: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
47a0: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
47b0: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
47c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
47d0: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
47e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
47f0: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61   Rollback all da
4800: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f  tabase files..*/
4810: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
4820: 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33  lbackAll(sqlite3
4830: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
4840: 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20    int inTrans = 
4850: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
4860: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
4870: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
4880: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
4890: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f  gnMalloc();.  fo
48a0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
48b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
48c0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29  db->aDb[i].pBt )
48d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
48e0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
48f0: 73 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  s(db->aDb[i].pBt
4900: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54  ) ){.        inT
4910: 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  rans = 1;.      
4920: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
4930: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 64 62 2d  treeRollback(db-
4940: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[i].pBt);.  
4950: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69      db->aDb[i].i
4960: 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20  nTrans = 0;.    
4970: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
4980: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b  tabRollback(db);
4990: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
49a0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
49b0: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51  if( db->flags&SQ
49c0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
49d0: 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
49e0: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
49f0: 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
4a00: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
4a10: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
4a20: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
4a30: 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20  If one has been 
4a40: 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f  configured, invo
4a50: 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d  ke the rollback-
4a60: 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  hook callback */
4a70: 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c  .  if( db->xRoll
4a80: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20  backCallback && 
4a90: 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d  (inTrans || !db-
4aa0: 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a  >autoCommit) ){.
4ab0: 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63      db->xRollbac
4ac0: 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52  kCallback(db->pR
4ad0: 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d  ollbackArg);.  }
4ae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4af0: 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
4b00: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
4b10: 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  the kind of erro
4b20: 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
4b30: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  he.** argument..
4b40: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
4b50: 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74  qlite3ErrStr(int
4b60: 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   rc){.  const ch
4b70: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
4b80: 20 72 63 20 26 20 30 78 66 66 20 29 7b 0a 20 20   rc & 0xff ){.  
4b90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
4ba0: 57 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  W:.    case SQLI
4bb0: 54 45 5f 44 4f 4e 45 3a 0a 20 20 20 20 63 61 73  TE_DONE:.    cas
4bc0: 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20  e SQLITE_OK:    
4bd0: 20 20 20 20 20 7a 20 3d 20 22 6e 6f 74 20 61 6e       z = "not an
4be0: 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20 20 20   error";        
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
4c10: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
4c20: 20 20 20 20 20 7a 20 3d 20 22 53 51 4c 20 6c 6f       z = "SQL lo
4c30: 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73  gic error or mis
4c40: 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 3b 20  sing database"; 
4c50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
4c60: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
4c70: 20 20 20 20 20 7a 20 3d 20 22 61 63 63 65 73 73       z = "access
4c80: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
4c90: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ed";            
4ca0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
4cb0: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20  e SQLITE_ABORT: 
4cc0: 20 20 20 20 20 7a 20 3d 20 22 63 61 6c 6c 62 61       z = "callba
4cd0: 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65  ck requested que
4ce0: 72 79 20 61 62 6f 72 74 22 3b 20 20 20 20 20 20  ry abort";      
4cf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
4d00: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
4d10: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
4d20: 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 3b 20 20  se is locked";  
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
4d50: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a  e SQLITE_LOCKED:
4d60: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
4d70: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
4d80: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ed";            
4d90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
4da0: 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20  e SQLITE_NOMEM: 
4db0: 20 20 20 20 20 7a 20 3d 20 22 6f 75 74 20 6f 66       z = "out of
4dc0: 20 6d 65 6d 6f 72 79 22 3b 20 20 20 20 20 20 20   memory";       
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
4df0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
4e00: 59 3a 20 20 20 7a 20 3d 20 22 61 74 74 65 6d 70  Y:   z = "attemp
4e10: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
4e20: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 3b  donly database";
4e30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
4e40: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  e SQLITE_INTERRU
4e50: 50 54 3a 20 20 7a 20 3d 20 22 69 6e 74 65 72 72  PT:  z = "interr
4e60: 75 70 74 65 64 22 3b 20 20 20 20 20 20 20 20 20  upted";         
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
4e90: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20  e SQLITE_IOERR: 
4ea0: 20 20 20 20 20 7a 20 3d 20 22 64 69 73 6b 20 49       z = "disk I
4eb0: 2f 4f 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20  /O error";      
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
4ee0: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
4ef0: 3a 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61  :    z = "databa
4f00: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
4f10: 20 6d 61 6c 66 6f 72 6d 65 64 22 3b 20 20 20 20   malformed";    
4f20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
4f30: 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20  e SQLITE_FULL:  
4f40: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
4f50: 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75  se or disk is fu
4f60: 6c 6c 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ll";            
4f70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
4f80: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
4f90: 4e 3a 20 20 20 7a 20 3d 20 22 75 6e 61 62 6c 65  N:   z = "unable
4fa0: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
4fb0: 65 20 66 69 6c 65 22 3b 20 20 20 20 20 20 20 20  e file";        
4fc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
4fd0: 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20  e SQLITE_EMPTY: 
4fe0: 20 20 20 20 20 7a 20 3d 20 22 74 61 62 6c 65 20       z = "table 
4ff0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
5000: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
5010: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5020: 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a  e SQLITE_SCHEMA:
5030: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
5040: 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68  se schema has ch
5050: 61 6e 67 65 64 22 3b 20 20 20 20 20 20 20 20 20  anged";         
5060: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5070: 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a  e SQLITE_TOOBIG:
5080: 20 20 20 20 20 7a 20 3d 20 22 53 74 72 69 6e 67       z = "String
5090: 20 6f 72 20 42 4c 4f 42 20 65 78 63 65 65 64 65   or BLOB exceede
50a0: 64 20 73 69 7a 65 20 6c 69 6d 69 74 22 3b 20 20  d size limit";  
50b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
50c0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
50d0: 49 4e 54 3a 20 7a 20 3d 20 22 63 6f 6e 73 74 72  INT: z = "constr
50e0: 61 69 6e 74 20 66 61 69 6c 65 64 22 3b 20 20 20  aint failed";   
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5110: 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  e SQLITE_MISMATC
5120: 48 3a 20 20 20 7a 20 3d 20 22 64 61 74 61 74 79  H:   z = "dataty
5130: 70 65 20 6d 69 73 6d 61 74 63 68 22 3b 20 20 20  pe mismatch";   
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5160: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a  e SQLITE_MISUSE:
5170: 20 20 20 20 20 7a 20 3d 20 22 6c 69 62 72 61 72       z = "librar
5180: 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64  y routine called
5190: 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65   out of sequence
51a0: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ";break;.    cas
51b0: 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20  e SQLITE_NOLFS: 
51c0: 20 20 20 20 20 7a 20 3d 20 22 6c 61 72 67 65 20       z = "large 
51d0: 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20  file support is 
51e0: 64 69 73 61 62 6c 65 64 22 3b 20 20 20 20 20 20  disabled";      
51f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5200: 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20  e SQLITE_AUTH:  
5210: 20 20 20 20 20 7a 20 3d 20 22 61 75 74 68 6f 72       z = "author
5220: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 3b  ization denied";
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5250: 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a  e SQLITE_FORMAT:
5260: 20 20 20 20 20 7a 20 3d 20 22 61 75 78 69 6c 69       z = "auxili
5270: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 6f 72  ary database for
5280: 6d 61 74 20 65 72 72 6f 72 22 3b 20 20 20 20 20  mat error";     
5290: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
52a0: 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20  e SQLITE_RANGE: 
52b0: 20 20 20 20 20 7a 20 3d 20 22 62 69 6e 64 20 6f       z = "bind o
52c0: 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  r column index o
52d0: 75 74 20 6f 66 20 72 61 6e 67 65 22 3b 20 20 20  ut of range";   
52e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
52f0: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a  e SQLITE_NOTADB:
5300: 20 20 20 20 20 7a 20 3d 20 22 66 69 6c 65 20 69       z = "file i
5310: 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69  s encrypted or i
5320: 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  s not a database
5330: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66  ";break;.    def
5340: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
5350: 20 20 20 20 20 7a 20 3d 20 22 75 6e 6b 6e 6f 77       z = "unknow
5360: 6e 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20 20  n error";       
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
5390: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
53a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
53b0: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79  mplements a busy
53c0: 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73   callback that s
53d0: 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a  leeps and tries.
53e0: 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61  ** again until a
53f0: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
5400: 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20  s reached.  The 
5410: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
5420: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e  .** an integer n
5430: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
5440: 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20  conds passed in 
5450: 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
5460: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
5470: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65  tic int sqliteDe
5480: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
5490: 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20  k(. void *ptr,  
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54b0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
54c0: 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e  ion */. int coun
54d0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
54e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
54f0: 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65  mes table has be
5500: 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69  en busy */.){.#i
5510: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20  f SQLITE_OS_WIN 
5520: 7c 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56 45  || (defined(HAVE
5530: 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
5540: 5f 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69  _USLEEP).  stati
5550: 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79  c const u8 delay
5560: 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20  s[] =.     { 1, 
5570: 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30  2, 5, 10, 15, 20
5580: 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20  , 25, 25,  25,  
5590: 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a  50,  50, 100 };.
55a0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
55b0: 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20  8 totals[] =.   
55c0: 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c    { 0, 1, 3,  8,
55d0: 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c   18, 33, 53, 78,
55e0: 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20   103, 128, 178, 
55f0: 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20  228 };.# define 
5600: 4e 44 45 4c 41 59 20 28 73 69 7a 65 6f 66 28 64  NDELAY (sizeof(d
5610: 65 6c 61 79 73 29 2f 73 69 7a 65 6f 66 28 64 65  elays)/sizeof(de
5620: 6c 61 79 73 5b 30 5d 29 29 0a 20 20 73 71 6c 69  lays[0])).  sqli
5630: 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74  te3 *db = (sqlit
5640: 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20  e3 *)ptr;.  int 
5650: 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75  timeout = db->bu
5660: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74  syTimeout;.  int
5670: 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a   delay, prior;..
5680: 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e    assert( count>
5690: 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e  =0 );.  if( coun
56a0: 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20  t < NDELAY ){.  
56b0: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
56c0: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69  [count];.    pri
56d0: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e  or = totals[coun
56e0: 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
56f0: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
5700: 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70  NDELAY-1];.    p
5710: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44  rior = totals[ND
5720: 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a  ELAY-1] + delay*
5730: 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31  (count-(NDELAY-1
5740: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  ));.  }.  if( pr
5750: 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69  ior + delay > ti
5760: 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c  meout ){.    del
5770: 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70  ay = timeout - p
5780: 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65  rior;.    if( de
5790: 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20  lay<=0 ) return 
57a0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
57b0: 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73  OsSleep(db->pVfs
57c0: 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20  , delay*1000);. 
57d0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65   return 1;.#else
57e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
57f0: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
5800: 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d  .  int timeout =
5810: 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72   ((sqlite3 *)ptr
5820: 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  )->busyTimeout;.
5830: 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a    if( (count+1)*
5840: 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29  1000 > timeout )
5850: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5860: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
5870: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31  leep(db->pVfs, 1
5880: 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72  000000);.  retur
5890: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
58a0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
58b0: 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c  given busy handl
58c0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
58d0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
58e0: 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69   when an operati
58f0: 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  on failed with a
5900: 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69   lock..** If thi
5910: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
5920: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
5930: 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e  lock is retried.
5940: 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72    If it.** retur
5950: 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74  ns 0, the operat
5960: 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20  ion aborts with 
5970: 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  an SQLITE_BUSY e
5980: 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rror..*/.int sql
5990: 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
59a0: 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65  ndler(BusyHandle
59b0: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  r *p){.  int rc;
59c0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
59d0: 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d  0) || p->xFunc==
59e0: 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20  0 || p->nBusy<0 
59f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63  ) return 0;.  rc
5a00: 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70   = p->xFunc(p->p
5a10: 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a  Arg, p->nBusy);.
5a20: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
5a30: 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31     p->nBusy = -1
5a40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
5a50: 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20  ->nBusy++;.  }. 
5a60: 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a   return rc; .}..
5a70: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5a80: 6e 65 20 73 65 74 73 20 74 68 65 20 62 75 73 79  ne sets the busy
5a90: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
5aa0: 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   Sqlite database
5ab0: 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e   to the.** given
5ac0: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
5ad0: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
5ae0: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  n argument..*/.i
5af0: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
5b00: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
5b10: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a  e3 *db,.  int (*
5b20: 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74  xBusy)(void*,int
5b30: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
5b40: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
5b50: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
5b60: 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  ex);.  db->busyH
5b70: 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78  andler.xFunc = x
5b80: 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79  Busy;.  db->busy
5b90: 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70  Handler.pArg = p
5ba0: 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  Arg;.  db->busyH
5bb0: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
5bc0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
5bd0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
5be0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
5bf0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
5c00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
5c10: 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
5c20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5c30: 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f  ine sets the pro
5c40: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66  gress callback f
5c50: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
5c60: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
5c70: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
5c80: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
5c90: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
5ca0: 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   The progress ca
5cb0: 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62  llback will.** b
5cc0: 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20  e invoked every 
5cd0: 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f  nOps opcodes..*/
5ce0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72  .void sqlite3_pr
5cf0: 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a  ogress_handler(.
5d00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
5d10: 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e    int nOps,.  in
5d20: 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76  t (*xProgress)(v
5d30: 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a  oid*), .  void *
5d40: 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pArg.){.  sqlite
5d50: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
5d60: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
5d70: 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62  nOps>0 ){.    db
5d80: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50  ->xProgress = xP
5d90: 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d  rogress;.    db-
5da0: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
5db0: 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50  nOps;.    db->pP
5dc0: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72  rogressArg = pAr
5dd0: 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
5de0: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
5df0: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  0;.    db->nProg
5e00: 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20  ressOps = 0;.   
5e10: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
5e20: 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  g = 0;.  }.  sql
5e30: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
5e40: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  (db->mutex);.}.#
5e50: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
5e60: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61  is routine insta
5e70: 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75  lls a default bu
5e80: 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20  sy handler that 
5e90: 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a  waits for the.**
5ea0: 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65   specified numbe
5eb0: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
5ec0: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
5ed0: 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ng 0..*/.int sql
5ee0: 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
5ef0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
5f00: 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73  nt ms){.  if( ms
5f10: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 75  >0 ){.    db->bu
5f20: 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a  syTimeout = ms;.
5f30: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
5f40: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c  _handler(db, sql
5f50: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
5f60: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64  llback, (void*)d
5f70: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
5f80: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
5f90: 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b  ndler(db, 0, 0);
5fa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
5fb0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5fc0: 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64  * Cause any pend
5fd0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  ing operation to
5fe0: 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72   stop at its ear
5ff0: 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74  liest opportunit
6000: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
6010: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c  e3_interrupt(sql
6020: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
6030: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
6040: 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  d = 1;.}.../*.**
6050: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6060: 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  s exactly the sa
6070: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72  me as sqlite3_cr
6080: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  eate_function(),
6090: 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20   except.** that 
60a0: 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  it is designed t
60b0: 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69  o be called by i
60c0: 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68  nternal code. Th
60d0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a  e difference is.
60e0: 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c  ** that if a mal
60f0: 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73  loc() fails in s
6100: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6110: 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72  nction(), an err
6120: 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65  or code.** is re
6130: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d  turned and the m
6140: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
6150: 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e   cleared. .*/.in
6160: 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  t sqlite3CreateF
6170: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  unc(.  sqlite3 *
6180: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
6190: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
61a0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
61b0: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
61c0: 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69  pUserData,.  voi
61d0: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
61e0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
61f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6200: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
6210: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
6220: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
6230: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
6240: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
6250: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
6260: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20  .  FuncDef *p;. 
6270: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61   int nName;..  a
6280: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6290: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
62a0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46  tex) );.  if( zF
62b0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c  unctionName==0 |
62c0: 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26  |.      (xFunc &
62d0: 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74  & (xFinal || xSt
62e0: 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28  ep)) || .      (
62f0: 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  !xFunc && (xFina
6300: 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c  l && !xStep)) ||
6310: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
6320: 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53  & (!xFinal && xS
6330: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
6340: 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e  nArg<-1 || nArg>
6350: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
6360: 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20  ION_ARG) ||.    
6370: 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20    (255<(nName = 
6380: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62  sqlite3Strlen(db
6390: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29  , zFunctionName)
63a0: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
63b0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
63c0: 45 5f 45 52 52 4f 52 2c 20 22 62 61 64 20 70 61  E_ERROR, "bad pa
63d0: 72 61 6d 65 74 65 72 73 22 29 3b 0a 20 20 20 20  rameters");.    
63e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
63f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 6e  ROR;.  }.  .#ifn
6400: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6410: 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51  UTF16.  /* If SQ
6420: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
6430: 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
6440: 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
6450: 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
6460: 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
6470: 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
6480: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
6490: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
64a0: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
64b0: 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
64c0: 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
64d0: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a  nternally..  **.
64e0: 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41    ** If SQLITE_A
64f0: 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  NY is specified,
6500: 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69   add three versi
6510: 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ons of the funct
6520: 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ion.  ** to the 
6530: 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  hash table..  */
6540: 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  .  if( enc==SQLI
6550: 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20  TE_UTF16 ){.    
6560: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
6570: 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73  16NATIVE;.  }els
6580: 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54  e if( enc==SQLIT
6590: 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74  E_ANY ){.    int
65a0: 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
65b0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
65c0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
65d0: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
65e0: 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 70  UTF8,.         p
65f0: 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c  UserData, xFunc,
6600: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b   xStep, xFinal);
6610: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
6620: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6630: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
6640: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
6650: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
6660: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a  SQLITE_UTF16LE,.
6670: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
6680: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
6690: 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 20 20  p, xFinal);.    
66a0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
66b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
66c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
66d0: 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  }.    enc = SQLI
66e0: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a  TE_UTF16BE;.  }.
66f0: 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51  #else.  enc = SQ
6700: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69  LITE_UTF8;.#endi
6710: 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  f.  .  /* Check 
6720: 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66  if an existing f
6730: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
6740: 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64   overridden or d
6750: 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20  eleted. If so,. 
6760: 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
6770: 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68  e active VMs, th
6780: 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
6790: 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63  _BUSY. If a func
67a0: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69  tion.  ** is bei
67b0: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65  ng overridden/de
67c0: 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20  leted but there 
67d0: 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
67e0: 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a  s, allow the.  *
67f0: 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63  * operation to c
6800: 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61  ontinue but inva
6810: 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f  lidate all preco
6820: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
6830: 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  s..  */.  p = sq
6840: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
6850: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
6860: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67  ame, nName, nArg
6870: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  , enc, 0);.  if(
6880: 20 70 20 26 26 20 70 2d 3e 69 50 72 65 66 45 6e   p && p->iPrefEn
6890: 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72  c==enc && p->nAr
68a0: 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69  g==nArg ){.    i
68b0: 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  f( db->activeVdb
68c0: 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  eCnt ){.      sq
68d0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
68e0: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
68f0: 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20       "Unable to 
6900: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73  delete/modify us
6910: 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20  er-function due 
6920: 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
6930: 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73  ents");.      as
6940: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
6950: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
6960: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
6970: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
6980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6990: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
69a0: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d  ments(db);.    }
69b0: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
69c0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
69d0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
69e0: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
69f0: 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  enc, 1);.  asser
6a00: 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  t(p || db->mallo
6a10: 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20  cFailed);.  if( 
6a20: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
6a30: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6a40: 20 7d 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20   }.  p->flags = 
6a50: 30 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20  0;.  p->xFunc = 
6a60: 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65  xFunc;.  p->xSte
6a70: 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e  p = xStep;.  p->
6a80: 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e  xFinalize = xFin
6a90: 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61  al;.  p->pUserDa
6aa0: 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a  ta = pUserData;.
6ab0: 20 20 70 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67    p->nArg = nArg
6ac0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6ad0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
6ae0: 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 20 66  reate new user f
6af0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  unctions..*/.int
6b00: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
6b10: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
6b20: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
6b30: 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e   char *zFunction
6b40: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
6b50: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
6b60: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
6b70: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
6b80: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
6b90: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
6ba0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
6bb0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
6bc0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
6bd0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
6be0: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
6bf0: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
6c00: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
6c10: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
6c20: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 63 20 3d  ->mutex);.  rc =
6c30: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
6c40: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
6c50: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Name, nArg, enc,
6c60: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
6c70: 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 72 63 20  , xFinal);.  rc 
6c80: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
6c90: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
6ca0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6cb0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
6cc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
6cd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6ce0: 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65  UTF16.int sqlite
6cf0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
6d00: 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  n16(.  sqlite3 *
6d10: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db,.  const void
6d20: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
6d30: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
6d40: 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76  nt eTextRep,.  v
6d50: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
6d60: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
6d70: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
6d80: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
6d90: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
6da0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
6db0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
6dc0: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
6dd0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
6de0: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e  ontext*).){.  in
6df0: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46  t rc;.  char *zF
6e00: 75 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f  unc8;.  sqlite3_
6e10: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
6e20: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
6e30: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
6e40: 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20  led );.  zFunc8 
6e50: 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
6e60: 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  8(db, zFunctionN
6e70: 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 72 63 20 3d  ame, -1);.  rc =
6e80: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
6e90: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e  nc(db, zFunc8, n
6ea0: 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70  Arg, eTextRep, p
6eb0: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
6ec0: 78 46 69 6e 61 6c 29 3b 0a 20 20 73 71 6c 69 74  xFinal);.  sqlit
6ed0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75  e3DbFree(db, zFu
6ee0: 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  nc8);.  rc = sql
6ef0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
6f00: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
6f10: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
6f20: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
6f30: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  rc;.}.#endif.../
6f40: 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61  *.** Declare tha
6f50: 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  t a function has
6f60: 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64   been overloaded
6f70: 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74 61   by a virtual ta
6f80: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
6f90: 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61  e function alrea
6fa0: 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20 72  dy exists as a r
6fb0: 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75  egular global fu
6fc0: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20  nction, then.** 
6fd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6fe0: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65  a no-op.  If the
6ff0: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
7000: 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63  ot exist, then c
7010: 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f  reate.** a new o
7020: 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20 74  ne that always t
7030: 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65  hrows a run-time
7040: 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20   error.  .**.** 
7050: 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62  When virtual tab
7060: 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72  les intend to pr
7070: 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61  ovide an overloa
7080: 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  ded function, th
7090: 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c  ey.** should cal
70a0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  l this routine t
70b0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
70c0: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
70d0: 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f  exists..** A glo
70e0: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  bal function mus
70f0: 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72  t exist in order
7100: 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75   for name resolu
7110: 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20  tion to work.** 
7120: 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74  properly..*/.int
7130: 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
7140: 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  d_function(.  sq
7150: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
7160: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
7170: 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20    int nArg.){.  
7180: 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  int nName = sqli
7190: 74 65 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a 4e  te3Strlen(db, zN
71a0: 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ame);.  int rc;.
71b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
71c0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
71d0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
71e0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
71f0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  zName, nName, nA
7200: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
7210: 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71   0)==0 ){.    sq
7220: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
7230: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
7240: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
7270: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
7280: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  , 0);.  }.  rc =
7290: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
72a0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
72b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
72c0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
72d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
72e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
72f0: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
7300: 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61  * Register a tra
7310: 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ce function.  Th
7320: 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
7330: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
7340: 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69  tered trace.** i
7350: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
7360: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65  .** A NULL trace
7370: 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
7380: 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20  that no tracing 
7390: 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
73a0: 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63  non-NULL.** trac
73b0: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
73c0: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
73d0: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
73e0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
73f0: 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65  h.** SQL stateme
7400: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  nt..*/.void *sql
7410: 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74  ite3_trace(sqlit
7420: 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78  e3 *db, void (*x
7430: 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  Trace)(void*,con
7440: 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20  st char*), void 
7450: 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a  *pArg){.  void *
7460: 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pOld;.  sqlite3_
7470: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
7480: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
7490: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a   db->pTraceArg;.
74a0: 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78    db->xTrace = x
74b0: 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72  Trace;.  db->pTr
74c0: 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  aceArg = pArg;. 
74d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
74e0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
74f0: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
7500: 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  }./*.** Register
7510: 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74   a profile funct
7520: 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66  ion.  The pArg f
7530: 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
7540: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a  ly registered .*
7550: 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  * profile functi
7560: 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  on is returned. 
7570: 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70   .**.** A NULL p
7580: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  rofile function 
7590: 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72  means that no pr
75a0: 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75  ofiling is execu
75b0: 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c  tes.  A non-NULL
75c0: 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61  .** profile is a
75d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
75e0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69  nction that is i
75f0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
7600: 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65  nclusion of.** e
7610: 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
7620: 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a  t that is run..*
7630: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
7640: 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74  profile(.  sqlit
7650: 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28  e3 *db,.  void (
7660: 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a  *xProfile)(void*
7670: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c  ,const char*,sql
7680: 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76  ite_uint64),.  v
7690: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76  oid *pArg.){.  v
76a0: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
76b0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
76c0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
76d0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69  Old = db->pProfi
76e0: 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  leArg;.  db->xPr
76f0: 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65  ofile = xProfile
7700: 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  ;.  db->pProfile
7710: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
7720: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7730: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
7740: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23  return pOld;.}.#
7750: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7760: 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  OMIT_TRACE */../
7770: 2a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c  *** EXPERIMENTAL
7780: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73   ***.**.** Regis
7790: 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74  ter a function t
77a0: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65  o be invoked whe
77b0: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
77c0: 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20  comments..** If 
77d0: 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63  the invoked func
77e0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tion returns non
77f0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
7800: 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61  commit becomes a
7810: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f  .** rollback..*/
7820: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63  .void *sqlite3_c
7830: 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71  ommit_hook(.  sq
7840: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
7850: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
7860: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
7870: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
7880: 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b   int (*xCallback
7890: 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75  )(void*),  /* Fu
78a0: 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65  nction to invoke
78b0: 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20   on each commit 
78c0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
78e0: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
78f0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
7900: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20  .  void *pOld;. 
7910: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
7920: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
7930: 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43  .  pOld = db->pC
7940: 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e  ommitArg;.  db->
7950: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
7960: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
7970: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20  b->pCommitArg = 
7980: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
7990: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
79a0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
79b0: 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pOld;.}../*.** 
79c0: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
79d0: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
79e0: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f  d each time a ro
79f0: 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  w is updated,.**
7a00: 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c   inserted or del
7a10: 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  eted using this 
7a20: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
7a30: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
7a40: 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
7a50: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
7a60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7a70: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
7a80: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
7a90: 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  se */.  void (*x
7aa0: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c  Callback)(void*,
7ab0: 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  int,char const *
7ac0: 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71  ,char const *,sq
7ad0: 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76  lite_int64),.  v
7ae0: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
7af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
7b00: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
7b10: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
7b20: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
7b30: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
7b40: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
7b50: 74 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41  t = db->pUpdateA
7b60: 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74  rg;.  db->xUpdat
7b70: 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  eCallback = xCal
7b80: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70  lback;.  db->pUp
7b90: 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  dateArg = pArg;.
7ba0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7bb0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
7bc0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
7bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
7be0: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
7bf0: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
7c00: 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
7c10: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a  ion is rolled.**
7c20: 20 62 61 63 6b 20 62 79 20 74 68 69 73 20 64 61   back by this da
7c30: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
7c40: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
7c50: 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  te3_rollback_hoo
7c60: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
7c70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7c80: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
7c90: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
7ca0: 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  se */.  void (*x
7cb0: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29  Callback)(void*)
7cc0: 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75  , /* Callback fu
7cd0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
7ce0: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
7cf0: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
7d00: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
7d10: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
7d20: 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRet;.  sqlite3_
7d30: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
7d40: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
7d50: 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
7d60: 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61  g;.  db->xRollba
7d70: 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  ckCallback = xCa
7d80: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52  llback;.  db->pR
7d90: 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72  ollbackArg = pAr
7da0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
7db0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
7dc0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
7dd0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  et;.}../*.** Thi
7de0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7df0: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
7e00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20  connection to a 
7e10: 64 61 74 61 62 61 73 65 20 42 54 72 65 65 0a 2a  database BTree.*
7e20: 2a 20 64 72 69 76 65 72 2e 20 20 49 66 20 7a 46  * driver.  If zF
7e30: 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
7e40: 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 2c 20 74  ame of a file, t
7e50: 68 65 6e 20 74 68 61 74 20 66 69 6c 65 20 69 73  hen that file is
7e60: 0a 2a 2a 20 6f 70 65 6e 65 64 20 61 6e 64 20 75  .** opened and u
7e70: 73 65 64 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  sed.  If zFilena
7e80: 6d 65 20 69 73 20 74 68 65 20 6d 61 67 69 63 20  me is the magic 
7e90: 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
7ea0: 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  then.** the data
7eb0: 62 61 73 65 20 69 73 20 73 74 6f 72 65 64 20 69  base is stored i
7ec0: 6e 20 6d 65 6d 6f 72 79 20 28 61 6e 64 20 69 73  n memory (and is
7ed0: 20 74 68 75 73 20 66 6f 72 67 6f 74 74 65 6e 20   thus forgotten 
7ee0: 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 74 68  as soon as.** th
7ef0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
7f00: 63 6c 6f 73 65 64 2e 29 20 20 49 66 20 7a 46 69  closed.)  If zFi
7f10: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
7f20: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
7f30: 0a 2a 2a 20 69 73 20 61 20 22 76 69 72 74 75 61  .** is a "virtua
7f40: 6c 22 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  l" database for 
7f50: 74 72 61 6e 73 69 65 6e 74 20 75 73 65 20 6f 6e  transient use on
7f60: 6c 79 20 61 6e 64 20 69 73 20 64 65 6c 65 74 65  ly and is delete
7f70: 64 20 61 73 0a 2a 2a 20 73 6f 6f 6e 20 61 73 20  d as.** soon as 
7f80: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
7f90: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
7fa0: 41 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  A virtual databa
7fb0: 73 65 20 63 61 6e 20 62 65 20 65 69 74 68 65 72  se can be either
7fc0: 20 61 20 64 69 73 6b 20 66 69 6c 65 20 28 74 68   a disk file (th
7fd0: 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
7fe0: 6c 6c 79 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77  lly.** deleted w
7ff0: 68 65 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20  hen the file is 
8000: 63 6c 6f 73 65 64 29 20 6f 72 20 69 74 20 61 6e  closed) or it an
8010: 20 62 65 20 68 65 6c 64 20 65 6e 74 69 72 65 6c   be held entirel
8020: 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20  y in memory,.** 
8030: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
8040: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 53   values of the S
8050: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
8060: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61   compile-time ma
8070: 63 72 6f 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  cro and the.** d
8080: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 76 61  b->temp_store va
8090: 72 69 61 62 6c 65 2c 20 61 63 63 6f 72 64 69 6e  riable, accordin
80a0: 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  g to the followi
80b0: 6e 67 20 63 68 61 72 74 3a 0a 2a 2a 0a 2a 2a 20  ng chart:.**.** 
80c0: 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54    SQLITE_TEMP_ST
80d0: 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70  ORE     db->temp
80e0: 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74  _store     Locat
80f0: 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  ion of temporary
8100: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d   database.**   -
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8120: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
8130: 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8150: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20  ------.**   0   
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
8180: 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20 31       file.**   1
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
81b0: 20 20 20 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20          file.** 
81c0: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
81d0: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
81e0: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
81f0: 79 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  y.**   1        
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 66 69 6c 65 0a 2a 2a 20 20 20 32 20 20 20 20 20  file.**   2     
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
8250: 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20 32 20 20     file.**   2  
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8270: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
8280: 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a 20        memory.** 
8290: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
82a0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
82b0: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
82c0: 79 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20  y.**   3        
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 6d 65 6d 6f 72 79 0a 2a 2f 0a 69 6e 74 20 73 71  memory.*/.int sq
8300: 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72  lite3BtreeFactor
8310: 79 28 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  y(.  const sqlit
8320: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
8330: 2a 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65 20  * Main database 
8340: 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 75 78  when opening aux
8350: 20 6f 74 68 65 72 77 69 73 65 20 30 20 2a 2f 0a   otherwise 0 */.
8360: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
8370: 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e  ilename,    /* N
8380: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
8390: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
83a0: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
83b0: 0a 20 20 69 6e 74 20 6f 6d 69 74 4a 6f 75 72 6e  .  int omitJourn
83c0: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al,          /* 
83d0: 69 66 20 54 52 55 45 20 74 68 65 6e 20 64 6f 20  if TRUE then do 
83e0: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73  not journal this
83f0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
8400: 43 61 63 68 65 2c 20 20 20 20 20 20 20 20 20 20  Cache,          
8410: 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79       /* How many
8420: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
8430: 67 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e  ge cache */.  in
8440: 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20  t vfsFlags,     
8450: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
8460: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
8470: 74 6f 20 76 66 73 4f 70 65 6e 20 2a 2f 0a 20 20  to vfsOpen */.  
8480: 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 20  Btree **ppBtree 
8490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
84a0: 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65  nter to new Btre
84b0: 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e  e object written
84c0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
84d0: 74 20 62 74 46 6c 61 67 73 20 3d 20 30 3b 0a 20  t btFlags = 0;. 
84e0: 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 61 73   int rc;.  .  as
84f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8500: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
8510: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
8520: 20 70 70 42 74 72 65 65 20 21 3d 20 30 29 3b 0a   ppBtree != 0);.
8530: 20 20 69 66 28 20 6f 6d 69 74 4a 6f 75 72 6e 61    if( omitJourna
8540: 6c 20 29 7b 0a 20 20 20 20 62 74 46 6c 61 67 73  l ){.    btFlags
8550: 20 7c 3d 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a   |= BTREE_OMIT_J
8560: 4f 55 52 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69 66  OURNAL;.  }.  if
8570: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
8580: 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20  LITE_NoReadlock 
8590: 29 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20 7c  ){.    btFlags |
85a0: 3d 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c  = BTREE_NO_READL
85b0: 4f 43 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  OCK;.  }.  if( z
85c0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 23  Filename==0 ){.#
85d0: 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
85e0: 54 4f 52 45 3d 3d 30 0a 20 20 20 20 2f 2a 20 44  TORE==0.    /* D
85f0: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 23 65 6e  o nothing */.#en
8600: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
8610: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
8620: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
8630: 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 20 20 69 66  _STORE==1.    if
8640: 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  ( db->temp_store
8650: 3d 3d 32 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20  ==2 ) zFilename 
8660: 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65  = ":memory:";.#e
8670: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
8680: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20  TEMP_STORE==2.  
8690: 20 20 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73    if( db->temp_s
86a0: 74 6f 72 65 21 3d 31 20 29 20 7a 46 69 6c 65 6e  tore!=1 ) zFilen
86b0: 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22  ame = ":memory:"
86c0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
86d0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
86e0: 33 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  3.    zFilename 
86f0: 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65  = ":memory:";.#e
8700: 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ndif.#endif /* S
8710: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8720: 59 44 42 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66  YDB */.  }..  if
8730: 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
8740: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
8750: 42 29 21 3d 30 20 26 26 20 28 7a 46 69 6c 65 6e  B)!=0 && (zFilen
8760: 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 6c 65  ame==0 || *zFile
8770: 6e 61 6d 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  name==0) ){.    
8780: 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46  vfsFlags = (vfsF
8790: 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
87a0: 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53  PEN_MAIN_DB) | S
87b0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
87c0: 44 42 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  DB;.  }.  rc = s
87d0: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
87e0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 73 71 6c 69  zFilename, (sqli
87f0: 74 65 33 20 2a 29 64 62 2c 20 70 70 42 74 72 65  te3 *)db, ppBtre
8800: 65 2c 20 62 74 46 6c 61 67 73 2c 20 76 66 73 46  e, btFlags, vfsF
8810: 6c 61 67 73 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lags);..  /* If 
8820: 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
8830: 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
8840: 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
8850: 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
8860: 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74  the.  ** default
8870: 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20   value. Except, 
8880: 69 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 42  if the call to B
8890: 74 72 65 65 4f 70 65 6e 28 29 20 72 65 74 75 72  treeOpen() retur
88a0: 6e 65 64 20 61 20 68 61 6e 64 6c 65 0a 20 20 2a  ned a handle.  *
88b0: 2a 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 65 78 69  * open on an exi
88c0: 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
88d0: 65 72 2d 63 61 63 68 65 2c 20 64 6f 20 6e 6f 74  er-cache, do not
88e0: 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
88f0: 72 2d 63 61 63 68 65 20 0a 20 20 2a 2a 20 73 69  r-cache .  ** si
8900: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ze..  */.  if( r
8910: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8920: 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  0==sqlite3BtreeS
8930: 63 68 65 6d 61 28 2a 70 70 42 74 72 65 65 2c 20  chema(*ppBtree, 
8940: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 73 71 6c  0, 0) ){.    sql
8950: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
8960: 65 53 69 7a 65 28 2a 70 70 42 74 72 65 65 2c 20  eSize(*ppBtree, 
8970: 6e 43 61 63 68 65 29 3b 0a 20 20 7d 0a 20 20 72  nCache);.  }.  r
8980: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8990: 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20  ** Return UTF-8 
89a0: 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
89b0: 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
89c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
89d0: 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
89e0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
89f0: 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  *sqlite3_errmsg(
8a00: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
8a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
8a20: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
8a30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
8a40: 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
8a50: 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  M);.  }.  if( !s
8a60: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
8a70: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
8a80: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
8a90: 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
8aa0: 5f 4d 49 53 55 53 45 29 3b 0a 20 20 7d 0a 20 20  _MISUSE);.  }.  
8ab0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
8ac0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
8ad0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
8ae0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
8af0: 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69   z = (char*)sqli
8b00: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64  te3_value_text(d
8b10: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 61 73 73 65  b->pErr);.  asse
8b20: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
8b30: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a  ailed );.  if( z
8b40: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73  ==0 ){.    z = s
8b50: 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
8b60: 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 7d 0a 20  >errCode);.  }. 
8b70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
8b80: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
8b90: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
8ba0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8bb0: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
8bc0: 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e  Return UTF-16 en
8bd0: 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
8be0: 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
8bf0: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
8c00: 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
8c10: 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
8c20: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
8c30: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
8c40: 2f 2a 20 42 65 63 61 75 73 65 20 61 6c 6c 20 74  /* Because all t
8c50: 68 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  he characters in
8c60: 20 74 68 65 20 73 74 72 69 6e 67 20 61 72 65 20   the string are 
8c70: 69 6e 20 74 68 65 20 75 6e 69 63 6f 64 65 0a 20  in the unicode. 
8c80: 20 2a 2a 20 72 61 6e 67 65 20 30 78 30 30 2d 30   ** range 0x00-0
8c90: 78 46 46 2c 20 69 66 20 77 65 20 70 61 64 20 74  xFF, if we pad t
8ca0: 68 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 73 74  he big-endian st
8cb0: 72 69 6e 67 20 77 69 74 68 20 61 20 0a 20 20 2a  ring with a .  *
8cc0: 2a 20 7a 65 72 6f 20 62 79 74 65 2c 20 77 65 20  * zero byte, we 
8cd0: 63 61 6e 20 6f 62 74 61 69 6e 20 74 68 65 20 6c  can obtain the l
8ce0: 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 73 74 72  ittle-endian str
8cf0: 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 26 62  ing with.  ** &b
8d00: 69 67 5f 65 6e 64 69 61 6e 5b 31 5d 2e 0a 20 20  ig_endian[1]..  
8d10: 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
8d20: 74 20 63 68 61 72 20 6f 75 74 4f 66 4d 65 6d 42  t char outOfMemB
8d30: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20 27  e[] = {.    0, '
8d40: 6f 27 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20 27  o', 0, 'u', 0, '
8d50: 74 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20 20  t', 0, ' ', .   
8d60: 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27 66 27 2c   0, 'o', 0, 'f',
8d70: 20 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c   0, ' ', .    0,
8d80: 20 27 6d 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c   'm', 0, 'e', 0,
8d90: 20 27 6d 27 2c 20 30 2c 20 27 6f 27 2c 20 30 2c   'm', 0, 'o', 0,
8da0: 20 27 72 27 2c 20 30 2c 20 27 79 27 2c 20 30 2c   'r', 0, 'y', 0,
8db0: 20 30 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61   0, 0.  };.  sta
8dc0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6d  tic const char m
8dd0: 69 73 75 73 65 42 65 20 5b 5d 20 3d 20 7b 0a 20  isuseBe [] = {. 
8de0: 20 20 20 30 2c 20 27 6c 27 2c 20 30 2c 20 27 69     0, 'l', 0, 'i
8df0: 27 2c 20 30 2c 20 27 62 27 2c 20 30 2c 20 27 72  ', 0, 'b', 0, 'r
8e00: 27 2c 20 30 2c 20 27 61 27 2c 20 30 2c 20 27 72  ', 0, 'a', 0, 'r
8e10: 27 2c 20 30 2c 20 27 79 27 2c 20 30 2c 20 27 20  ', 0, 'y', 0, ' 
8e20: 27 2c 20 0a 20 20 20 20 30 2c 20 27 72 27 2c 20  ', .    0, 'r', 
8e30: 30 2c 20 27 6f 27 2c 20 30 2c 20 27 75 27 2c 20  0, 'o', 0, 'u', 
8e40: 30 2c 20 27 74 27 2c 20 30 2c 20 27 69 27 2c 20  0, 't', 0, 'i', 
8e50: 30 2c 20 27 6e 27 2c 20 30 2c 20 27 65 27 2c 20  0, 'n', 0, 'e', 
8e60: 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20  0, ' ', .    0, 
8e70: 27 63 27 2c 20 30 2c 20 27 61 27 2c 20 30 2c 20  'c', 0, 'a', 0, 
8e80: 27 6c 27 2c 20 30 2c 20 27 6c 27 2c 20 30 2c 20  'l', 0, 'l', 0, 
8e90: 27 65 27 2c 20 30 2c 20 27 64 27 2c 20 30 2c 20  'e', 0, 'd', 0, 
8ea0: 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 6f 27  ' ', .    0, 'o'
8eb0: 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20 27 74 27  , 0, 'u', 0, 't'
8ec0: 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30  , 0, ' ', .    0
8ed0: 2c 20 27 6f 27 2c 20 30 2c 20 27 66 27 2c 20 30  , 'o', 0, 'f', 0
8ee0: 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27  , ' ', .    0, '
8ef0: 73 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 27  s', 0, 'e', 0, '
8f00: 71 27 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20 27  q', 0, 'u', 0, '
8f10: 65 27 2c 20 30 2c 20 27 6e 27 2c 20 30 2c 20 27  e', 0, 'n', 0, '
8f20: 63 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 30  c', 0, 'e', 0, 0
8f30: 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73  , 0.  };..  cons
8f40: 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28  t void *z;.  if(
8f50: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
8f60: 72 6e 20 28 76 6f 69 64 20 2a 29 28 26 6f 75 74  rn (void *)(&out
8f70: 4f 66 4d 65 6d 42 65 5b 53 51 4c 49 54 45 5f 55  OfMemBe[SQLITE_U
8f80: 54 46 31 36 4e 41 54 49 56 45 3d 3d 53 51 4c 49  TF16NATIVE==SQLI
8f90: 54 45 5f 55 54 46 31 36 4c 45 3f 31 3a 30 5d 29  TE_UTF16LE?1:0])
8fa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
8fb0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
8fc0: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
8fd0: 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
8fe0: 2a 29 28 26 6d 69 73 75 73 65 42 65 5b 53 51 4c  *)(&misuseBe[SQL
8ff0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3d  ITE_UTF16NATIVE=
9000: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3f  =SQLITE_UTF16LE?
9010: 31 3a 30 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  1:0]);.  }.  sql
9020: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
9030: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
9040: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
9050: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 20  ocFailed );.  z 
9060: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
9070: 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
9080: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a  ;.  if( z==0 ){.
9090: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
90a0: 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
90b0: 20 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72 53   -1, sqlite3ErrS
90c0: 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c  tr(db->errCode),
90d0: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
90e0: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
90f0: 41 54 49 43 29 3b 0a 20 20 20 20 7a 20 3d 20 73  ATIC);.    z = s
9100: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
9110: 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  t16(db->pErr);. 
9120: 20 7d 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63   }.  /* A malloc
9130: 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c  () may have fail
9140: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
9150: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61  ll to sqlite3_va
9160: 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 2a  lue_text16().  *
9170: 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73  * above. If this
9180: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
9190: 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  en the db->mallo
91a0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65  cFailed flag nee
91b0: 64 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 6c  ds to.  ** be cl
91c0: 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74  eared before ret
91d0: 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20  urning. Do this 
91e0: 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
91f0: 64 20 6f 66 20 76 69 61 0a 20 20 2a 2a 20 73 71  d of via.  ** sq
9200: 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20  lite3ApiExit(), 
9210: 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67  to avoid setting
9220: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
9230: 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  ndle error messa
9240: 67 65 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d  ge..  */.  db->m
9250: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b  allocFailed = 0;
9260: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9270: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9280: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
9290: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
92a0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
92b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
92c0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72  e most recent er
92d0: 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ror code generat
92e0: 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20  ed by an SQLite 
92f0: 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c  routine. If NULL
9300: 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f   is.** passed to
9310: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
9320: 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c  we assume a mall
9330: 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69  oc() failed duri
9340: 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ng sqlite3_open(
9350: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
9360: 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  3_errcode(sqlite
9370: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
9380: 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
9390: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
93a0: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
93b0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
93c0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
93d0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
93e0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
93f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9400: 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
9410: 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72  errCode & db->er
9420: 72 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rMask;.}../*.** 
9430: 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c  Create a new col
9440: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
9450: 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62  for database "db
9460: 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20  ".  The name is 
9470: 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65  zName.** and the
9480: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63   encoding is enc
9490: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
94a0: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
94b0: 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
94c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
94d0: 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
94e0: 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
94f0: 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
9500: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
9510: 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
9520: 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
9530: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
9540: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
9550: 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a  ll;.  int enc2;.
9560: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 0a    int nName;.  .
9570: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9580: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
9590: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
95a0: 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   If SQLITE_UTF16
95b0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
95c0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79   the encoding ty
95d0: 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  pe, transform th
95e0: 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f  is.  ** to one o
95f0: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  f SQLITE_UTF16LE
9600: 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36   or SQLITE_UTF16
9610: 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  BE using the.  *
9620: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
9630: 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49  TIVE macro. SQLI
9640: 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20  TE_UTF16 is not 
9650: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  used internally.
9660: 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65  .  */.  enc2 = e
9670: 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
9680: 31 36 5f 41 4c 49 47 4e 45 44 3b 0a 20 20 69 66  16_ALIGNED;.  if
9690: 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
96a0: 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 32  TF16 ){.    enc2
96b0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
96c0: 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28  ATIVE;.  }.  if(
96d0: 20 28 65 6e 63 32 26 7e 33 29 21 3d 30 20 29 7b   (enc2&~3)!=0 ){
96e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
96f0: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a  TE_MISUSE;.  }..
9700: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
9710: 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76  is call is remov
9720: 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67  ing or replacing
9730: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c   an existing col
9740: 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71  lation .  ** seq
9750: 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e  uence. If so, an
9760: 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
9770: 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62  ve VMs, return b
9780: 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20  usy. If there.  
9790: 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
97a0: 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65   VMs, invalidate
97b0: 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65   any pre-compile
97c0: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
97d0: 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  */.  nName = sql
97e0: 69 74 65 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a  ite3Strlen(db, z
97f0: 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d  Name);.  pColl =
9800: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
9810: 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32  Seq(db, (u8)enc2
9820: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
9830: 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20  0);.  if( pColl 
9840: 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  && pColl->xCmp )
9850: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 63  {.    if( db->ac
9860: 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a 20  tiveVdbeCnt ){. 
9870: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9880: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  r(db, SQLITE_BUS
9890: 59 2c 20 0a 20 20 20 20 20 20 20 20 22 55 6e 61  Y, .        "Una
98a0: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
98b0: 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  dify collation s
98c0: 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61  equence due to a
98d0: 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
98e0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
98f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
9900: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
9910: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
9920: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20  tements(db);..  
9930: 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f    /* If collatio
9940: 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
9950: 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69 72   was created dir
9960: 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20  ectly by a call 
9970: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
9980: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
9990: 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65  on, and not gene
99a0: 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f  rated by synthCo
99b0: 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20  llSeq(),.    ** 
99c0: 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20  then any copies 
99d0: 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c  made by synthCol
99e0: 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62  lSeq() need to b
99f0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20  e invalidated.. 
9a00: 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c     ** Also, coll
9a10: 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72  ation destructor
9a20: 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28   - CollSeq.xDel(
9a30: 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  ) - function may
9a40: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
9a50: 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  be called..    *
9a60: 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c  / .    if( (pCol
9a70: 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45  l->enc & ~SQLITE
9a80: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d  _UTF16_ALIGNED)=
9a90: 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43  =enc2 ){.      C
9aa0: 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20  ollSeq *aColl = 
9ab0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
9ac0: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a  &db->aCollSeq, z
9ad0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
9ae0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
9af0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a   for(j=0; j<3; j
9b00: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
9b10: 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c  lSeq *p = &aColl
9b20: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
9b30: 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e   p->enc==pColl->
9b40: 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  enc ){.         
9b50: 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a   if( p->xDel ){.
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78              p->x
9b70: 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20  Del(p->pUser);. 
9b80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9b90: 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30       p->xCmp = 0
9ba0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9bb0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
9bc0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
9bd0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
9be0: 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
9bf0: 20 6e 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66   nName, 1);.  if
9c00: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70  ( pColl ){.    p
9c10: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f  Coll->xCmp = xCo
9c20: 6d 70 61 72 65 3b 0a 20 20 20 20 70 43 6f 6c 6c  mpare;.    pColl
9c30: 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a  ->pUser = pCtx;.
9c40: 20 20 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20      pColl->xDel 
9c50: 3d 20 78 44 65 6c 3b 0a 20 20 20 20 70 43 6f 6c  = xDel;.    pCol
9c60: 6c 2d 3e 65 6e 63 20 3d 20 65 6e 63 32 20 7c 20  l->enc = enc2 | 
9c70: 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54  (enc & SQLITE_UT
9c80: 46 31 36 5f 41 4c 49 47 4e 45 44 29 3b 0a 20 20  F16_ALIGNED);.  
9c90: 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
9ca0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
9cb0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
9cc0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
9cd0: 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66  * This array def
9ce0: 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20  ines hard upper 
9cf0: 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20  bounds on limit 
9d00: 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20  values.  The.** 
9d10: 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74  initializer must
9d20: 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63   be kept in sync
9d30: 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
9d40: 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66  _LIMIT_*.** #def
9d50: 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e  ines in sqlite3.
9d60: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  h..*/.static con
9d70: 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69  st int aHardLimi
9d80: 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45  t[] = {.  SQLITE
9d90: 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _MAX_LENGTH,.  S
9da0: 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
9db0: 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
9dc0: 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c  AX_COLUMN,.  SQL
9dd0: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
9de0: 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
9df0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
9e00: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
9e10: 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45  DBE_OP,.  SQLITE
9e20: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
9e30: 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  G,.  SQLITE_MAX_
9e40: 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49  ATTACHED,.  SQLI
9e50: 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
9e60: 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  ERN_LENGTH,.  SQ
9e70: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
9e80: 45 5f 4e 55 4d 42 45 52 2c 0a 7d 3b 0a 0a 2f 2a  E_NUMBER,.};../*
9e90: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
9ea0: 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72  e hard limits ar
9eb0: 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61  e set to reasona
9ec0: 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69  ble values.*/.#i
9ed0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  f SQLITE_MAX_LEN
9ee0: 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
9ef0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
9f00: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
9f10: 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
9f20: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
9f30: 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
9f40: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
9f50: 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  QL_LENGTH must b
9f60: 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
9f70: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
9f80: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e  _MAX_SQL_LENGTH>
9f90: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
9fa0: 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  H.# error SQLITE
9fb0: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
9fc0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61  must not be grea
9fd0: 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ter than SQLITE_
9fe0: 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69  MAX_LENGTH.#endi
9ff0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
a000: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
a010: 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <2.# error SQLIT
a020: 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
a030: 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74  ELECT must be at
a040: 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a   least 2.#endif.
a050: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  #if SQLITE_MAX_V
a060: 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f  DBE_OP<40.# erro
a070: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  r SQLITE_MAX_VDB
a080: 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20  E_OP must be at 
a090: 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a  least 40.#endif.
a0a0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  #if SQLITE_MAX_F
a0b0: 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c  UNCTION_ARG<0 ||
a0c0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
a0d0: 54 49 4f 4e 5f 41 52 47 3e 31 32 37 0a 23 20 65  TION_ARG>127.# e
a0e0: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
a0f0: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73  FUNCTION_ARG mus
a100: 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
a110: 6e 64 20 31 32 37 0a 23 65 6e 64 69 66 0a 23 69  nd 127.#endif.#i
a120: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  f SQLITE_MAX_ATT
a130: 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54  ACHED<0 || SQLIT
a140: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 33  E_MAX_ATTACHED>3
a150: 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
a160: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75  _MAX_ATTACHED mu
a170: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
a180: 61 6e 64 20 33 30 0a 23 65 6e 64 69 66 0a 23 69  and 30.#endif.#i
a190: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  f SQLITE_MAX_LIK
a1a0: 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
a1b0: 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <1.# error SQLIT
a1c0: 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
a1d0: 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  RN_LENGTH must b
a1e0: 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e  e at least 1.#en
a1f0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
a200: 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
a210: 45 52 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  ER<1.# error SQL
a220: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
a230: 5f 4e 55 4d 42 45 52 20 6d 75 73 74 20 62 65 20  _NUMBER must be 
a240: 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
a250: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
a260: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
a270: 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74  limit.  Report t
a280: 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a  he old value..**
a290: 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c   If an invalid l
a2a0: 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75  imit index is su
a2b0: 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d  pplied, report -
a2c0: 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  1..** Make no ch
a2d0: 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20  anges but still 
a2e0: 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  report the old v
a2f0: 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e  alue if the.** n
a300: 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  ew limit is nega
a310: 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  tive..**.** A ne
a320: 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f  w lower limit do
a330: 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78  es not shrink ex
a340: 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74  isting construct
a350: 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20  s..** It merely 
a360: 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e  prevents new con
a370: 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63  structs that exc
a380: 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a  eed the limit.**
a390: 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a   from forming..*
a3a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  /.int sqlite3_li
a3b0: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
a3c0: 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e   int limitId, in
a3d0: 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69  t newLimit){.  i
a3e0: 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 20 20 69  nt oldLimit;.  i
a3f0: 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20  f( limitId<0 || 
a400: 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f  limitId>=SQLITE_
a410: 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72  N_LIMIT ){.    r
a420: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
a430: 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61  oldLimit = db->a
a440: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a  Limit[limitId];.
a450: 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
a460: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77  0 ){.    if( new
a470: 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74  Limit>aHardLimit
a480: 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20  [limitId] ){.   
a490: 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48     newLimit = aH
a4a0: 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ardLimit[limitId
a4b0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  ];.    }.    db-
a4c0: 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
a4d0: 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d   = newLimit;.  }
a4e0: 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d  .  return oldLim
a4f0: 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  it;.}../*.** Thi
a500: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
a510: 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69  he work of openi
a520: 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e  ng a database on
a530: 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71   behalf of.** sq
a540: 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64  lite3_open() and
a550: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
a560: 29 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ). The database 
a570: 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e  filename "zFilen
a580: 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46  ame"  .** is UTF
a590: 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73  -8 encoded..*/.s
a5a0: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61  tatic int openDa
a5b0: 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20  tabase(.  const 
a5c0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
a5d0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
a5e0: 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f  ename UTF-8 enco
a5f0: 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
a600: 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
a610: 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64  /* OUT: Returned
a620: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
a630: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 66   */.  unsigned f
a640: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  lags,        /* 
a650: 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67  Operational flag
a660: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
a670: 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a  r *zVfs       /*
a680: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   Name of the VFS
a690: 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
a6a0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
a6b0: 6e 74 20 72 63 3b 0a 20 20 43 6f 6c 6c 53 65 71  nt rc;.  CollSeq
a6c0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
a6d0: 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b  sThreadsafe = 1;
a6e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a6f0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
a700: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
a710: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
a720: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a730: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
a740: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  flags&SQLITE_OPE
a750: 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20  N_NOMUTEX ){.   
a760: 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
a770: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  0;.  }..  /* Rem
a780: 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73  ove harmful bits
a790: 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20   from the flags 
a7a0: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 66  parameter */.  f
a7b0: 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49  lags &=  ~( SQLI
a7c0: 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
a7d0: 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
a7e0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
a7f0: 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20  EN_MAIN_DB |.   
a800: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
a810: 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
a820: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
a830: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52    SQLITE_OPEN_TR
a840: 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20  ANSIENT_DB | .  
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
a860: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
a870: 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
a880: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
a890: 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
a8a0: 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
a8b0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53     SQLITE_OPEN_S
a8c0: 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  UBJOURNAL | .   
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
a8e0: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
a8f0: 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20  OURNAL |.       
a900: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
a910: 50 45 4e 5f 4e 4f 4d 55 54 45 58 0a 20 20 20 20  PEN_NOMUTEX.    
a920: 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f           );..  /
a930: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
a940: 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63  qlite data struc
a950: 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73  ture */.  db = s
a960: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
a970: 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  ( sizeof(sqlite3
a980: 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30  ) );.  if( db==0
a990: 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f   ) goto opendb_o
a9a0: 75 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ut;.  if( sqlite
a9b0: 33 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  3Config.bFullMut
a9c0: 65 78 20 26 26 20 69 73 54 68 72 65 61 64 73 61  ex && isThreadsa
a9d0: 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75  fe ){.    db->mu
a9e0: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
a9f0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
aa00: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
aa10: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74  .    if( db->mut
aa20: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex==0 ){.      s
aa30: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
aa40: 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  .      db = 0;. 
aa50: 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
aa60: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
aa70: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
aa80: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
aa90: 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
aaa0: 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 70 72  = 0xff;.  db->pr
aab0: 69 6f 72 4e 65 77 52 6f 77 69 64 20 3d 20 30 3b  iorNewRowid = 0;
aac0: 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a  .  db->nDb = 2;.
aad0: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
aae0: 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b  LITE_MAGIC_BUSY;
aaf0: 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d  .  db->aDb = db-
ab00: 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61  >aDbStatic;..  a
ab10: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62  ssert( sizeof(db
ab20: 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f  ->aLimit)==sizeo
ab30: 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b  f(aHardLimit) );
ab40: 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c  .  memcpy(db->aL
ab50: 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74  imit, aHardLimit
ab60: 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  , sizeof(db->aLi
ab70: 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74  mit));.  db->aut
ab80: 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64  oCommit = 1;.  d
ab90: 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d  b->nextAutovac =
aba0: 20 2d 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50   -1;.  db->nextP
abb0: 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64  agesize = 0;.  d
abc0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
abd0: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
abe0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
abf0: 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c  ULT_FILE_FORMAT<
ac00: 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4.              
ac10: 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61     | SQLITE_Lega
ac20: 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66  cyFileFmt.#endif
ac30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
ac40: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
ac50: 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20  SION.           
ac60: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c        | SQLITE_L
ac70: 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e  oadExtension.#en
ac80: 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71  dif.      ;.  sq
ac90: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
aca0: 62 2d 3e 61 46 75 6e 63 2c 20 53 51 4c 49 54 45  b->aFunc, SQLITE
acb0: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
acc0: 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  ;.  sqlite3HashI
acd0: 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  nit(&db->aCollSe
ace0: 71 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  q, SQLITE_HASH_S
acf0: 54 52 49 4e 47 2c 20 30 29 3b 0a 23 69 66 6e 64  TRING, 0);.#ifnd
ad00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
ad10: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
ad20: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
ad30: 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 53 51 4c 49  b->aModule, SQLI
ad40: 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  TE_HASH_STRING, 
ad50: 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  0);.#endif..  db
ad60: 2d 3e 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33  ->pVfs = sqlite3
ad70: 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
ad80: 0a 20 20 69 66 28 20 21 64 62 2d 3e 70 56 66 73  .  if( !db->pVfs
ad90: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
ada0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 64  ITE_ERROR;.    d
adb0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
adc0: 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20  E_MAGIC_SICK;.  
add0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
ade0: 62 2c 20 72 63 2c 20 22 6e 6f 20 73 75 63 68 20  b, rc, "no such 
adf0: 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b  vfs: %s", zVfs);
ae00: 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
ae10: 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
ae20: 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20  Add the default 
ae30: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
ae40: 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52  ce BINARY. BINAR
ae50: 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68  Y works for both
ae60: 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20   UTF-8.  ** and 
ae70: 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61  UTF-16, so add a
ae80: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63   version for eac
ae90: 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75  h to avoid any u
aea0: 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20  nnecessary.  ** 
aeb0: 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65  conversions. The
aec0: 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74   only error that
aed0: 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20   can occur here 
aee0: 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  is a malloc() fa
aef0: 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72  ilure..  */.  cr
af00: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
af10: 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
af20: 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43  TE_UTF8, 0, binC
af30: 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
af40: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
af50: 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
af60: 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20  ITE_UTF16BE, 0, 
af70: 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
af80: 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
af90: 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
afa0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
afb0: 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
afc0: 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
afd0: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49  lation(db, "RTRI
afe0: 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  M", SQLITE_UTF8,
aff0: 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f   (void*)1, binCo
b000: 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66  llFunc, 0);.  if
b010: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
b020: 65 64 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  ed ){.    db->ma
b030: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
b040: 49 43 5f 53 49 43 4b 3b 0a 20 20 20 20 67 6f 74  IC_SICK;.    got
b050: 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
b060: 7d 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  }.  db->pDfltCol
b070: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
b080: 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54  ollSeq(db, SQLIT
b090: 45 5f 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22  E_UTF8, "BINARY"
b0a0: 2c 20 36 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  , 6, 0);.  asser
b0b0: 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  t( db->pDfltColl
b0c0: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  !=0 );..  /* Als
b0d0: 6f 20 61 64 64 20 61 20 55 54 46 2d 38 20 63 61  o add a UTF-8 ca
b0e0: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63  se-insensitive c
b0f0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
b100: 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  e. */.  createCo
b110: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43  llation(db, "NOC
b120: 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ASE", SQLITE_UTF
b130: 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c  8, 0, nocaseColl
b140: 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a  atingFunc, 0);..
b150: 20 20 2f 2a 20 53 65 74 20 66 6c 61 67 73 20 6f    /* Set flags o
b160: 6e 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63  n the built-in c
b170: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
b180: 65 73 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c  es */.  db->pDfl
b190: 74 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 53 51  tColl->type = SQ
b1a0: 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59  LITE_COLL_BINARY
b1b0: 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  pColl = sqli
b1c0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
b1d0: 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
b1e0: 22 4e 4f 43 41 53 45 22 2c 20 36 2c 20 30 29 3b  "NOCASE", 6, 0);
b1f0: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a  .  if( pColl ){.
b200: 20 20 20 20 70 43 6f 6c 6c 2d 3e 74 79 70 65 20      pColl->type 
b210: 3d 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f  = SQLITE_COLL_NO
b220: 43 41 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  CASE;.  }..  /* 
b230: 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64  Open the backend
b240: 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72   database driver
b250: 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
b260: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72  ags = flags;.  r
b270: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
b280: 46 61 63 74 6f 72 79 28 64 62 2c 20 7a 46 69 6c  Factory(db, zFil
b290: 65 6e 61 6d 65 2c 20 30 2c 20 53 51 4c 49 54 45  ename, 0, SQLITE
b2a0: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
b2b0: 49 5a 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  IZE, .          
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f   flags | SQLITE_
b2e0: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 2c 0a 20 20  OPEN_MAIN_DB,.  
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b300: 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44           &db->aD
b310: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28  b[0].pBt);.  if(
b320: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b330: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
b340: 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20  or(db, rc, 0);. 
b350: 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
b360: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b  QLITE_MAGIC_SICK
b370: 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
b380: 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
b390: 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
b3a0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
b3b0: 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30  et(db, db->aDb[0
b3c0: 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44  ].pBt);.  db->aD
b3d0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[1].pSchema = s
b3e0: 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
b3f0: 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54  db, 0);...  /* T
b400: 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74  he default safet
b410: 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20  y_level for the 
b420: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
b430: 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65   'full'; for the
b440: 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62   temp.  ** datab
b450: 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27  ase it is 'NONE'
b460: 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  . This matches t
b470: 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64  he pager layer d
b480: 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a  efaults.  .  */.
b490: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61    db->aDb[0].zNa
b4a0: 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64  me = "main";.  d
b4b0: 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79  b->aDb[0].safety
b4c0: 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 23 69 66 6e  _level = 3;.#ifn
b4d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b4e0: 54 45 4d 50 44 42 0a 20 20 64 62 2d 3e 61 44 62  TEMPDB.  db->aDb
b4f0: 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d  [1].zName = "tem
b500: 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
b510: 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
b520: 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d  1;.#endif..  db-
b530: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
b540: 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66  MAGIC_OPEN;.  if
b550: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
b560: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
b570: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
b580: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
b590: 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  l built-in funct
b5a0: 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74  ions, but do not
b5b0: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
b5c0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
b5d0: 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54  se schema yet. T
b5e0: 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  his is delayed u
b5f0: 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
b600: 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
b610: 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65  .  ** is accesse
b620: 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
b630: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
b640: 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
b650: 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74  te3RegisterBuilt
b660: 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
b670: 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f  ..  /* Load auto
b680: 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73  matic extensions
b690: 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68   - extensions th
b6a0: 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67  at have been reg
b6b0: 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69  istered.  ** usi
b6c0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61  ng the sqlite3_a
b6d0: 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69  utomatic_extensi
b6e0: 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20  on() API..  */. 
b6f0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 41 75   (void)sqlite3Au
b700: 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73  toLoadExtensions
b710: 28 64 62 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  (db);.  if( sqli
b720: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 21  te3_errcode(db)!
b730: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b740: 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
b750: 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  t;.  }..#ifdef S
b760: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
b770: 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  1.  if( !db->mal
b780: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b790: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
b7a0: 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69  te3Fts1Init(sqli
b7b0: 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
b7c0: 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
b7d0: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
b7e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b7f0: 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28  NABLE_FTS2.  if(
b800: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
b810: 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
b820: 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72  _OK ){.    exter
b830: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  n int sqlite3Fts
b840: 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b  2Init(sqlite3*);
b850: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b860: 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts2Init(db);. 
b870: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
b880: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b890: 46 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS3.  if( !db->
b8a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
b8b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b8c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b8d0: 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts3Init(db);. 
b8e0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
b8f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b900: 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  ICU.  if( !db->m
b910: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
b920: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b930: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
b940: 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 73 71  qlite3IcuInit(sq
b950: 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
b960: 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74  = sqlite3IcuInit
b970: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
b980: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b990: 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69  ENABLE_RTREE.  i
b9a0: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
b9b0: 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
b9c0: 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
b9d0: 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69   sqlite3RtreeIni
b9e0: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
b9f0: 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  f..  sqlite3Erro
ba00: 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20  r(db, rc, 0);.. 
ba10: 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46   /* -DSQLITE_DEF
ba20: 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
ba30: 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53  E=1 makes EXCLUS
ba40: 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74 20  IVE the default 
ba50: 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
ba60: 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46  e.  -DSQLITE_DEF
ba70: 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
ba80: 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20  E=0 make NORMAL 
ba90: 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
baa0: 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
bab0: 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74  Doing nothing at
bac0: 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20   all also makes 
bad0: 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
bae0: 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  lt..  */.#ifdef 
baf0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
bb00: 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62  OCKING_MODE.  db
bb10: 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d  ->dfltLockMode =
bb20: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
bb30: 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20  LOCKING_MODE;.  
bb40: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
bb50: 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42  ingMode(sqlite3B
bb60: 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44  treePager(db->aD
bb70: 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20  b[0].pBt),.     
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
bba0: 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
bbb0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
bbc0: 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61  Enable the looka
bbd0: 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73  side-malloc subs
bbe0: 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70  ystem */.  setup
bbf0: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c  Lookaside(db, 0,
bc00: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 73   sqlite3Config.s
bc10: 7a 4c 6f 6f 6b 61 73 69 64 65 2c 20 73 71 6c 69  zLookaside, sqli
bc20: 74 65 33 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  te3Config.nLooka
bc30: 73 69 64 65 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f  side);..opendb_o
bc40: 75 74 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a  ut:.  if( db ){.
bc50: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
bc60: 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68  mutex!=0 || isTh
bc70: 72 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73  readsafe==0 || s
bc80: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62 46 75  qlite3Config.bFu
bc90: 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20  llMutex==0 );.  
bca0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
bcb0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
bcc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49  ;.  }.  if( SQLI
bcd0: 54 45 5f 4e 4f 4d 45 4d 3d 3d 28 72 63 20 3d 20  TE_NOMEM==(rc = 
bce0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
bcf0: 64 62 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  db)) ){.    sqli
bd00: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
bd10: 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 20     db = 0;.  }. 
bd20: 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 20 20 72   *ppDb = db;.  r
bd30: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69  eturn sqlite3Api
bd40: 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a  Exit(0, rc);.}..
bd50: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
bd60: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
bd70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
bd80: 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  _open(.  const c
bd90: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
bda0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
bdb0: 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  b .){.  return o
bdc0: 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
bdd0: 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20  ename, ppDb,.   
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
be00: 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
be10: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
be20: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
be30: 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73  _open_v2(.  cons
be40: 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
be50: 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ,   /* Database 
be60: 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29  filename (UTF-8)
be70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
be80: 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  ppDb,         /*
be90: 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20   OUT: SQLite db 
bea0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
beb0: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
bec0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a      /* Flags */.
bed0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
bee0: 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  fs        /* Nam
bef0: 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20  e of VFS module 
bf00: 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72  to use */.){.  r
bf10: 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
bf20: 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44  se(filename, ppD
bf30: 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b  b, flags, zVfs);
bf40: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
bf50: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
bf60: 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
bf70: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
bf80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
bf90: 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76  pen16(.  const v
bfa0: 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  oid *zFilename, 
bfb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
bfc0: 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  b.){.  char cons
bfd0: 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20  t *zFilename8;  
bfe0: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e   /* zFilename en
bff0: 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69  coded in UTF-8 i
c000: 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36  nstead of UTF-16
c010: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
c020: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
c030: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
c040: 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 61  zFilename );.  a
c050: 73 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a 20  ssert( ppDb );. 
c060: 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
c070: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c080: 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
c090: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
c0a0: 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
c0b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
c0c0: 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  if.  pVal = sqli
c0d0: 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
c0e0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
c0f0: 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a  tStr(pVal, -1, z
c100: 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45  Filename, SQLITE
c110: 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51  _UTF16NATIVE, SQ
c120: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
c130: 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c  zFilename8 = sql
c140: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
c150: 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  al, SQLITE_UTF8)
c160: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
c170: 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  e8 ){.    rc = o
c180: 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
c190: 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20  ename8, ppDb,.  
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
c1c0: 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
c1d0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
c1e0: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
c1f0: 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c  *ppDb || rc==SQL
c200: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
c210: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c220: 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70  OK && !DbHasProp
c230: 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44  erty(*ppDb, 0, D
c240: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20  B_SchemaLoaded) 
c250: 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70 70  ){.      ENC(*pp
c260: 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  Db) = SQLITE_UTF
c270: 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a  16NATIVE;.    }.
c280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
c290: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
c2a0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c    }.  sqlite3Val
c2b0: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20  ueFree(pVal);.. 
c2c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
c2d0: 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d  piExit(0, rc);.}
c2e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c2f0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
c300: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
c310: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
c320: 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
c330: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
c340: 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
c350: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c360: 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
c370: 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
c380: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
c390: 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
c3a0: 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
c3b0: 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
c3c0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
c3d0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
c3e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
c3f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c400: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c410: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
c420: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
c430: 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
c440: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65  ion(db, zName, e
c450: 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
c460: 72 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  re, 0);.  rc = s
c470: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
c480: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
c490: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
c4a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
c4b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
c4c0: 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
c4d0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
c4e0: 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
c4f0: 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
c500: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
c510: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c520: 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
c530: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
c540: 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
c550: 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
c560: 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
c570: 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
c580: 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
c590: 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
c5a0: 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
c5b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
c5c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
c5d0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
c5e0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
c5f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
c600: 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
c610: 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
c620: 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
c630: 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63  are, xDel);.  rc
c640: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
c650: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
c660: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
c670: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
c680: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
c690: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c6a0: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
c6b0: 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
c6c0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
c6d0: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
c6e0: 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
c6f0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
c700: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20  e_collation16(. 
c710: 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
c720: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61   const void *zNa
c730: 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  me,.  int enc, .
c740: 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
c750: 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
c760: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
c770: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
c780: 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
c790: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c7a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20   char *zName8;. 
c7b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
c7c0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
c7d0: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
c7e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
c7f0: 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74    zName8 = sqlit
c800: 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
c810: 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 69 66 28  Name, -1);.  if(
c820: 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72   zName8 ){.    r
c830: 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
c840: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20  ion(db, zName8, 
c850: 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
c860: 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  are, 0);.    sql
c870: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
c880: 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63  Name8);.  }.  rc
c890: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
c8a0: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
c8b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
c8c0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
c8d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
c8e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
c8f0: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
c900: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c  * Register a col
c910: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
c920: 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b  factory callback
c930: 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
c940: 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
c950: 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65   Replace any pre
c960: 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65  viously installe
c970: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
c980: 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f  ence factory..*/
c990: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .int sqlite3_col
c9a0: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20  lation_needed(. 
c9b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
c9c0: 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
c9d0: 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
c9e0: 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69  xCollNeeded)(voi
c9f0: 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20  d*,sqlite3*,int 
ca00: 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63  eTextRep,const c
ca10: 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74  har*).){.  sqlit
ca20: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
ca30: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
ca40: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78  >xCollNeeded = x
ca50: 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62  CollNeeded;.  db
ca60: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
ca70: 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  = 0;.  db->pColl
ca80: 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
ca90: 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
caa0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
cab0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
cac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cad0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
cae0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
caf0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
cb00: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
cb10: 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  ce factory callb
cb20: 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74  ack with the dat
cb30: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
cb40: 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20  db. Replace any 
cb50: 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61  previously insta
cb60: 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lled collation s
cb70: 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e  equence factory.
cb80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
cb90: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
cba0: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
cbb0: 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c  b, .  void *pCol
cbc0: 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76  lNeededArg, .  v
cbd0: 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64  oid(*xCollNeeded
cbe0: 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  16)(void*,sqlite
cbf0: 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
cc00: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
cc10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cc20: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
cc30: 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
cc40: 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78  ded = 0;.  db->x
cc50: 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78  CollNeeded16 = x
cc60: 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20  CollNeeded16;.  
cc70: 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
cc80: 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64  rg = pCollNeeded
cc90: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
cca0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ccb0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
ccc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
ccd0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
cce0: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66  IT_UTF16 */..#if
ccf0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cd00: 5f 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a 2f  _GLOBALRECOVER./
cd10: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
cd20: 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61  on is now an ana
cd30: 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65  chronism. It use
cd40: 64 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20  d to be used to 
cd50: 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a  recover from a.*
cd60: 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  * malloc() failu
cd70: 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e  re, but SQLite n
cd80: 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74  ow does this aut
cd90: 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69  omatically..*/.i
cda0: 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61  nt sqlite3_globa
cdb0: 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b  l_recover(void){
cdc0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cdd0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
cde0: 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65  *.** Test to see
cdf0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
ce00: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
ce10: 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75  nection is in au
ce20: 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65  tocommit.** mode
ce30: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
ce40: 66 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53  f it is and FALS
ce50: 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63  E if not.  Autoc
ce60: 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e  ommit mode is on
ce70: 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20  .** by default. 
ce80: 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64   Autocommit is d
ce90: 69 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47  isabled by a BEG
cea0: 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  IN statement and
ceb0: 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79   reenabled.** by
cec0: 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54   the next COMMIT
ced0: 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a   or ROLLBACK..**
cee0: 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53  .******* THIS IS
cef0: 20 41 4e 20 45 58 50 45 52 49 4d 45 4e 54 41 4c   AN EXPERIMENTAL
cf00: 20 41 50 49 20 41 4e 44 20 49 53 20 53 55 42 4a   API AND IS SUBJ
cf10: 45 43 54 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a  ECT TO CHANGE **
cf20: 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ****.*/.int sqli
cf30: 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
cf40: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
cf50: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75  .  return db->au
cf60: 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 23 69 66  toCommit;.}..#if
cf70: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
cf80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
cf90: 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  wing routine is 
cfa0: 73 75 62 74 69 74 75 74 65 64 20 66 6f 72 20 63  subtituted for c
cfb0: 6f 6e 73 74 61 6e 74 20 53 51 4c 49 54 45 5f 43  onstant SQLITE_C
cfc0: 4f 52 52 55 50 54 20 69 6e 0a 2a 2a 20 64 65 62  ORRUPT in.** deb
cfd0: 75 67 67 69 6e 67 20 62 75 69 6c 64 73 2e 20 20  ugging builds.  
cfe0: 54 68 69 73 20 70 72 6f 76 69 64 65 73 20 61 20  This provides a 
cff0: 77 61 79 20 74 6f 20 73 65 74 20 61 20 62 72 65  way to set a bre
d000: 61 6b 70 6f 69 6e 74 20 66 6f 72 20 77 68 65 6e  akpoint for when
d010: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
d020: 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64  s first detected
d030: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d040: 43 6f 72 72 75 70 74 28 76 6f 69 64 29 7b 0a 20  Corrupt(void){. 
d050: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d060: 4f 52 52 55 50 54 3b 0a 7d 0a 23 65 6e 64 69 66  ORRUPT;.}.#endif
d070: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
d080: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f  a convenience ro
d090: 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73  utine that makes
d0a0: 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74   sure that all t
d0b0: 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a  hread-specific.*
d0c0: 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  * data for this 
d0d0: 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20  thread has been 
d0e0: 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  deallocated..**.
d0f0: 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e  ** SQLite no lon
d100: 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d  ger uses thread-
d110: 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f  specific data so
d120: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d130: 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e   now a.** no-op.
d140: 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64    It is retained
d150: 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
d160: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a  compatibility..*
d170: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74  /.void sqlite3_t
d180: 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f  hread_cleanup(vo
d190: 69 64 29 7b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  id){.}../*.** Re
d1a0: 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d  turn meta inform
d1b0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70  ation about a sp
d1c0: 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66  ecific column of
d1d0: 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
d1e0: 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
d1f0: 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28  t in sqlite3.h (
d200: 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72  sqlite.h.in) for
d210: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66   details..*/.#if
d220: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d230: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
d240: 41 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61  A.int sqlite3_ta
d250: 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
d260: 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ata(.  sqlite3 *
d270: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
d280: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
d290: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
d2a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
d2b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ,        /* Data
d2c0: 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c  base name or NUL
d2d0: 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
d2e0: 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20  r *zTableName,  
d2f0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65     /* Table name
d300: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
d310: 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20   *zColumnName,  
d320: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
d330: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
d340: 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20   **pzDataType,  
d350: 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63    /* OUTPUT: Dec
d360: 6c 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20  lared data type 
d370: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
d380: 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20  **pzCollSeq,    
d390: 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c   /* OUTPUT: Coll
d3a0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
d3b0: 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e  ame */.  int *pN
d3c0: 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20  otNull,         
d3d0: 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
d3e0: 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c  True if NOT NULL
d3f0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73   constraint exis
d400: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72  ts */.  int *pPr
d410: 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20  imaryKey,       
d420: 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
d430: 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61  rue if column pa
d440: 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e  rt of PK */.  in
d450: 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20  t *pAutoinc     
d460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
d470: 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c  PUT: True if col
d480: 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72  umn is auto-incr
d490: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ement */.){.  in
d4a0: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
d4b0: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62  rrMsg = 0;.  Tab
d4c0: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
d4d0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30  Column *pCol = 0
d4e0: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20  ;.  int iCol;.. 
d4f0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61   char const *zDa
d500: 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68  taType = 0;.  ch
d510: 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53  ar const *zCollS
d520: 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f  eq = 0;.  int no
d530: 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  tnull = 0;.  int
d540: 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b   primarykey = 0;
d550: 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d  .  int autoinc =
d560: 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65   0;..  /* Ensure
d570: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
d580: 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f  hema has been lo
d590: 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  aded */.  sqlite
d5a0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
d5b0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 28 76 6f 69  ->mutex);.  (voi
d5c0: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
d5d0: 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  n(db);.  sqlite3
d5e0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
d5f0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
d600: 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d  3Init(db, &zErrM
d610: 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  sg);.  sqlite3Bt
d620: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
d630: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
d640: 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !=rc ){.    goto
d650: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
d660: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
d670: 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69   table in questi
d680: 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73  on */.  pTab = s
d690: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
d6a0: 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20  db, zTableName, 
d6b0: 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zDbName);.  if( 
d6c0: 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70  !pTab || pTab->p
d6d0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54  Select ){.    pT
d6e0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  ab = 0;.    goto
d6f0: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
d700: 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63  .  /* Find the c
d710: 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20  olumn for which 
d720: 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65  info is requeste
d730: 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  d */.  if( sqlit
d740: 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d  e3IsRowid(zColum
d750: 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69 43  nName) ){.    iC
d760: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
d770: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  ;.    if( iCol>=
d780: 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20  0 ){.      pCol 
d790: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
d7a0: 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ol];.    }.  }el
d7b0: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c  se{.    for(iCol
d7c0: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
d7d0: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
d7e0: 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
d7f0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
d800: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
d810: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
d820: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61  zName, zColumnNa
d830: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
d840: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d850: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
d860: 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  ==pTab->nCol ){.
d870: 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a        pTab = 0;.
d880: 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
d890: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
d8a0: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
d8b0: 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73  ing block stores
d8c0: 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d   the meta inform
d8d0: 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
d8e0: 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  be returned.  **
d8f0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
d900: 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  n local variable
d910: 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f  s zDataType, zCo
d920: 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20  llSeq, notnull, 
d930: 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20  primarykey.  ** 
d940: 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20  and autoinc. At 
d950: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
d960: 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69   are two possibi
d970: 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20  lities:.  ** .  
d980: 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70  **     1. The sp
d990: 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e  ecified column n
d9a0: 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20  ame was rowid", 
d9b0: 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64  "oid" or "_rowid
d9c0: 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  _" .  **        
d9d0: 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
d9e0: 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
d9f0: 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20  red IPK column. 
da00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32  .  **.  **     2
da10: 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e  . The table is n
da20: 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  ot a view and th
da30: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64  e column name id
da40: 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a  entified an .  *
da50: 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69  *        explici
da60: 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  tly declared col
da70: 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69  umn. Copy meta i
da80: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
da90: 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69  *pCol..  */ .  i
daa0: 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  f( pCol ){.    z
dab0: 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d  DataType = pCol-
dac0: 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c  >zType;.    zCol
dad0: 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f  lSeq = pCol->zCo
dae0: 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20  ll;.    notnull 
daf0: 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21  = pCol->notNull!
db00: 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  =0;.    primaryk
db10: 65 79 20 20 3d 20 70 43 6f 6c 2d 3e 69 73 50 72  ey  = pCol->isPr
db20: 69 6d 4b 65 79 21 3d 30 3b 0a 20 20 20 20 61 75  imKey!=0;.    au
db30: 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50  toinc = pTab->iP
db40: 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54  Key==iCol && (pT
db50: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
db60: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
db70: 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  !=0;.  }else{.  
db80: 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49    zDataType = "I
db90: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69  NTEGER";.    pri
dba0: 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d  marykey = 1;.  }
dbb0: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71  .  if( !zCollSeq
dbc0: 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71   ){.    zCollSeq
dbd0: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d   = "BINARY";.  }
dbe0: 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 28  ..error_out:.  (
dbf0: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
dc00: 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a  tyOff(db);..  /*
dc10: 20 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e   Whether the fun
dc20: 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65  ction call succe
dc30: 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20  eded or failed, 
dc40: 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70  set the output p
dc50: 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74  arameters.  ** t
dc60: 6f 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72  o whatever their
dc70: 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61   local counterpa
dc80: 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20  rts contain. If 
dc90: 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63  an error did occ
dca0: 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61  ur,.  ** this ha
dcb0: 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
dcc0: 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70  zeroing all outp
dcd0: 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  ut parameters.. 
dce0: 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61   */.  if( pzData
dcf0: 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79  Type ) *pzDataTy
dd00: 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a  pe = zDataType;.
dd10: 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20    if( pzCollSeq 
dd20: 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a  ) *pzCollSeq = z
dd30: 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70  CollSeq;.  if( p
dd40: 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e  NotNull ) *pNotN
dd50: 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20  ull = notnull;. 
dd60: 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79   if( pPrimaryKey
dd70: 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20   ) *pPrimaryKey 
dd80: 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20  = primarykey;.  
dd90: 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a  if( pAutoinc ) *
dda0: 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69  pAutoinc = autoi
ddb0: 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  nc;..  if( SQLIT
ddc0: 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61  E_OK==rc && !pTa
ddd0: 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
dde0: 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d  DbFree(db, zErrM
ddf0: 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67  sg);.    zErrMsg
de00: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
de10: 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74  f(db, "no such t
de20: 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e  able column: %s.
de30: 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  %s", zTableName,
de40: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e  .        zColumn
de50: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
de60: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
de70: 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
de80: 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73  (db, rc, (zErrMs
de90: 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d  g?"%s":0), zErrM
dea0: 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  sg);.  sqlite3Db
deb0: 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
dec0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
ded0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
dee0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
def0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
df00: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
df10: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
df20: 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
df30: 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
df40: 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
df50: 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
df60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65  int sqlite3_slee
df70: 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c  p(int ms){.  sql
df80: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a  ite3_vfs *pVfs;.
df90: 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73    int rc;.  pVfs
dfa0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
dfb0: 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56  ind(0);.  if( pV
dfc0: 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  fs==0 ) return 0
dfd0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
dfe0: 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d  ction works in m
dff0: 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74  illiseconds, but
e000: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
e010: 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20  OsSleep() .  ** 
e020: 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65  API uses microse
e030: 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65  conds. Hence the
e040: 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20   1000's..  */.  
e050: 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53  rc = (sqlite3OsS
e060: 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a  leep(pVfs, 1000*
e070: 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74  ms)/1000);.  ret
e080: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e090: 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
e0a0: 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20  le the extended 
e0b0: 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f  result codes..*/
e0c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74  .int sqlite3_ext
e0d0: 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
e0e0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
e0f0: 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71  int onoff){.  sq
e100: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e110: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
e120: 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e  db->errMask = on
e130: 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66  off ? 0xffffffff
e140: 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74   : 0xff;.  sqlit
e150: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
e160: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
e170: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e180: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
e190: 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  he xFileControl 
e1a0: 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74  method on a part
e1b0: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e  icular database.
e1c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
e1d0: 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c  file_control(sql
e1e0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
e1f0: 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69  char *zDbName, i
e200: 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
e210: 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
e220: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69  QLITE_ERROR;.  i
e230: 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
e240: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
e250: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
e260: 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  zDbName==0 ){.  
e270: 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 7d 65 6c    iDb = 0;.  }el
e280: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 44 62 3d  se{.    for(iDb=
e290: 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  0; iDb<db->nDb; 
e2a0: 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  iDb++){.      if
e2b0: 28 20 73 74 72 63 6d 70 28 64 62 2d 3e 61 44 62  ( strcmp(db->aDb
e2c0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62  [iDb].zName, zDb
e2d0: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
e2e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
e2f0: 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 7b  ( iDb<db->nDb ){
e300: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 72  .    Btree *pBtr
e310: 65 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ee = db->aDb[iDb
e320: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
e330: 42 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20 50  Btree ){.      P
e340: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
e350: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
e360: 20 2a 66 64 3b 0a 20 20 20 20 20 20 73 71 6c 69   *fd;.      sqli
e370: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
e380: 74 72 65 65 29 3b 0a 20 20 20 20 20 20 70 50 61  tree);.      pPa
e390: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
e3a0: 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b  eePager(pBtree);
e3b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e3c0: 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
e3d0: 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61    fd = sqlite3Pa
e3e0: 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b  gerFile(pPager);
e3f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
e400: 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  d!=0 );.      if
e410: 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
e420: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
e430: 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
e440: 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67  rol(fd, op, pArg
e450: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e460: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
e470: 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  ve(pBtree);.    
e480: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
e490: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
e4a0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
e4b0: 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a   rc;   .}../*.**
e4c0: 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68   Interface to th
e4d0: 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e  e testing logic.
e4e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
e4f0: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
e500: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74   op, ...){.  int
e510: 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66   rc = 0;.#ifndef
e520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49   SQLITE_OMIT_BUI
e530: 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c  LTIN_TEST.  va_l
e540: 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
e550: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
e560: 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
e570: 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20   /*.    ** Save 
e580: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
e590: 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20  e of the PRNG.. 
e5a0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
e5b0: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
e5c0: 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20  RNG_SAVE: {.    
e5d0: 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76    sqlite3PrngSav
e5e0: 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
e5f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
e600: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74    /*.    ** Rest
e610: 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ore the state of
e620: 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65   the PRNG to the
e630: 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65   last state save
e640: 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50  d using.    ** P
e650: 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52  RNG_SAVE.  If PR
e660: 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65  NG_SAVE has neve
e670: 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61  r before been ca
e680: 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  lled, then.    *
e690: 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73  * this verb acts
e6a0: 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54   like PRNG_RESET
e6b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
e6c0: 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
e6d0: 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20  L_PRNG_RESTORE: 
e6e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
e6f0: 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28  rngRestoreState(
e700: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e710: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
e720: 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50    ** Reset the P
e730: 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20  RNG back to its 
e740: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
e750: 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63  ate.  The next c
e760: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
e770: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
e780: 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74  () will reseed t
e790: 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20  he PRNG using a 
e7a0: 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20  single call.    
e7b0: 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f  ** to the xRando
e7c0: 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20  mness method of 
e7d0: 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e  the default VFS.
e7e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
e7f0: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
e800: 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20  _PRNG_RESET: {. 
e810: 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
e820: 52 65 73 65 74 53 74 61 74 65 28 29 3b 0a 20 20  ResetState();.  
e830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e840: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
e850: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
e860: 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53  ntrol(BITVEC_TES
e870: 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d  T, size, program
e880: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
e890: 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e  Run a test again
e8a0: 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65  st a Bitvec obje
e8b0: 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65  ct of size.  The
e8c0: 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e   program argumen
e8d0: 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61  t.    ** is an a
e8e0: 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73  rray of integers
e8f0: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
e900: 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20  e test.  Return 
e910: 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d  -1 on a.    ** m
e920: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
e930: 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63   error, 0 on suc
e940: 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  cess, or non-zer
e950: 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  o for an error..
e960: 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73      ** See the s
e970: 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
e980: 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64  tinTest() for ad
e990: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
e9a0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
e9b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
e9c0: 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
e9d0: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  T: {.      int s
e9e0: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
e9f0: 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  nt);.      int *
ea00: 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  aProg = va_arg(a
ea10: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
ea20: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
ea30: 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a  ecBuiltinTest(sz
ea40: 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20  , aProg);.      
ea50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
ea60: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
ea70: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
ea80: 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  l(BENIGN_MALLOC_
ea90: 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78  HOOKS, xBegin, x
eaa0: 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  End).    **.    
eab0: 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b  ** Register hook
eac0: 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64  s to call to ind
ead0: 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c  icate which mall
eae0: 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20  oc() failures . 
eaf0: 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e     ** are benign
eb00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
eb10: 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
eb20: 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  L_BENIGN_MALLOC_
eb30: 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74  HOOKS: {.      t
eb40: 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f  ypedef void (*vo
eb50: 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69  id_function)(voi
eb60: 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66  d);.      void_f
eb70: 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42  unction xBenignB
eb80: 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64  egin;.      void
eb90: 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
eba0: 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e  nEnd;.      xBen
ebb0: 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72  ignBegin = va_ar
ebc0: 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
ebd0: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e  ion);.      xBen
ebe0: 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28  ignEnd = va_arg(
ebf0: 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f  ap, void_functio
ec00: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
ec10: 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f  3BenignMallocHoo
ec20: 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c  ks(xBenignBegin,
ec30: 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20   xBenignEnd);.  
ec40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ec50: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
ec60: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
ec70: 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
ec80: 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72  _TEST */.  retur
ec90: 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.