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

Artifact 4540ec2c0ba99a0dcb8bd114f733007958c6258e:


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 34 34 20 32 30 30 38 2f 30 36  ,v 1.444 2008/06
0280: 2f 31 34 20 31 36 3a 35 36 3a 32 32 20 64 72 68  /14 16:56:22 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 46 6c 61 67 73 20  0;../*.** Flags 
06b0: 74 6f 20 68 65 6c 70 20 53 51 4c 69 74 65 20 64  to help SQLite d
06c0: 65 74 65 72 6d 69 6e 65 20 69 66 20 69 74 20 68  etermine if it h
06d0: 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  as been initiali
06e0: 7a 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  zed..*/.static i
06f0: 6e 74 20 73 71 6c 69 74 65 33 49 73 49 6e 69 74  nt sqlite3IsInit
0700: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
0710: 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  Initialization h
0720: 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 73 74  as started */.st
0730: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
0740: 46 75 6c 6c 49 6e 69 74 20 3d 20 30 3b 20 20 20  FullInit = 0;   
0750: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 61     /* Initializa
0760: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65  tion is complete
0770: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   */../*.** Initi
0780: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0790: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
07a0: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
07b0: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
07c0: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
07d0: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
07e0: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
07f0: 65 73 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f  esms prior to do
0800: 69 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20  ing any serious 
0810: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c  work with.** SQL
0820: 69 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e  ite.  But as lon
0830: 67 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20  g as you do not 
0840: 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c  compile with SQL
0850: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
0860: 54 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  T.** this routin
0870: 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
0880: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62   automatically b
0890: 79 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73  y key routines s
08a0: 75 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65  uch as.** sqlite
08b0: 33 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a  3_open().  .**.*
08c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
08d0: 73 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74  s a no-op except
08e0: 20 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72   on its very fir
08f0: 73 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20  st call for the 
0900: 70 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66  process,.** or f
0910: 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  or the first cal
0920: 6c 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  l after a call t
0930: 6f 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  o sqlite3_shutdo
0940: 77 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  wn..*/.int sqlit
0950: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 76 6f  e3_initialize(vo
0960: 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  id){.  int rc;. 
0970: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 49 6e   if( sqlite3IsIn
0980: 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  it ) return SQLI
0990: 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71  TE_OK;.  rc = sq
09a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 69 6e 69 74  lite3_mutex_init
09b0: 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
09c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64  LITE_OK ){.#ifnd
09d0: 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  ef SQLITE_MUTEX_
09e0: 4e 4f 4f 50 0a 20 20 20 20 73 71 6c 69 74 65 33  NOOP.    sqlite3
09f0: 5f 6d 75 74 65 78 20 2a 70 4d 75 74 65 78 20 3d  _mutex *pMutex =
0a00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
0a10: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
0a20: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
0a30: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
0a40: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
0a50: 28 70 4d 75 74 65 78 29 3b 0a 20 20 20 20 69 66  (pMutex);.    if
0a60: 28 20 73 71 6c 69 74 65 33 49 73 49 6e 69 74 3d  ( sqlite3IsInit=
0a70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
0a80: 74 65 33 49 73 49 6e 69 74 20 3d 20 31 3b 0a 20  te3IsInit = 1;. 
0a90: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
0aa0: 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71  ITE_OK ) rc = sq
0ab0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28  lite3MallocInit(
0ac0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
0ad0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
0ae0: 3d 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  = sqlite3_os_ini
0af0: 74 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  t();.      if( r
0b00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
0b10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
0b20: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  sInit = 0;.     
0b30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
0b40: 73 71 6c 69 74 65 33 46 75 6c 6c 49 6e 69 74 20  sqlite3FullInit 
0b50: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
0b60: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d   }.    sqlite3_m
0b70: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 75 74 65  utex_leave(pMute
0b80: 78 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  x);.  }.  return
0b90: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e   rc;.}../*.** Un
0ba0: 64 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  do the effects o
0bb0: 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  f sqlite3_initia
0bc0: 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e 6f  lize().  Must no
0bd0: 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c  t be called whil
0be0: 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6f  e.** there are o
0bf0: 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74 61 62  utstanding datab
0c00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
0c10: 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  or memory alloca
0c20: 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69 6c  tions or.** whil
0c30: 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20 53 51  e any part of SQ
0c40: 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77 69 73  Lite is otherwis
0c50: 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e 79 20  e in use in any 
0c60: 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a 2a 2a  thread.  This.**
0c70: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20   routine is not 
0c80: 74 68 72 65 61 64 73 61 66 65 2e 20 20 4e 6f 74  threadsafe.  Not
0c90: 20 62 79 20 61 20 6c 6f 6e 67 20 73 68 6f 74 2e   by a long shot.
0ca0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
0cb0: 73 68 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a  shutdown(void){.
0cc0: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64    sqlite3_os_end
0cd0: 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c  ();.  sqlite3Mal
0ce0: 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 73 71 6c 69  locEnd();.  sqli
0cf0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 64 28 29 3b  te3_mutex_end();
0d00: 0a 20 20 73 71 6c 69 74 65 33 46 75 6c 6c 49 6e  .  sqlite3FullIn
0d10: 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
0d20: 33 49 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72  3IsInit = 0;.  r
0d30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41  .}../*.** This A
0d50: 50 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63  PI allows applic
0d60: 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79  ations to modify
0d70: 20 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66   the global conf
0d80: 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20  iguration of.** 
0d90: 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61  the SQLite libra
0da0: 72 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a  ry at run-time..
0db0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0dc0: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
0dd0: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
0de0: 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
0df0: 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61  anding.** databa
0e00: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  se connections o
0e10: 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  r memory allocat
0e20: 69 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74  ions.  This rout
0e30: 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68  ine is not.** th
0e40: 72 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75  readsafe.  Failu
0e50: 72 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65  re to heed these
0e60: 20 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65   warnings can le
0e70: 61 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61  ad to unpredicta
0e80: 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e  ble.** behavior.
0e90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
0ea0: 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e  config(int op, .
0eb0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
0ec0: 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
0ed0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73  LITE_OK;..  /* s
0ee0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20  qlite3_config() 
0ef0: 73 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c  shall return SQL
0f00: 49 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74  ITE_MISUSE if it
0f10: 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c   is invoked whil
0f20: 65 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74  e.  ** the SQLit
0f30: 65 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20  e library is in 
0f40: 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71  use. */.  if( sq
0f50: 6c 69 74 65 33 46 75 6c 6c 49 6e 69 74 20 29 20  lite3FullInit ) 
0f60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
0f70: 53 55 53 45 3b 0a 0a 20 20 76 61 5f 73 74 61 72  SUSE;..  va_star
0f80: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
0f90: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
0fa0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
0fb0: 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 3a 20  G_SINGLETHREAD: 
0fc0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62  {.      /* Disab
0fd0: 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20  le all mutexing 
0fe0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
0ff0: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
1000: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  x = 0;.      sql
1010: 69 74 65 33 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  ite3Config.bFull
1020: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Mutex = 0;.     
1030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1040: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
1050: 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44  NFIG_MULTITHREAD
1060: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
1070: 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66  able mutexing of
1080: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1090: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f  tions */.      /
10a0: 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e  * Enable mutexin
10b0: 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73  g of core data s
10c0: 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
10d0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67     sqlite3Config
10e0: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
10f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1100: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
1110: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1130: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
1140: 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20  ERIALIZED: {.   
1150: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c     /* Enable all
1160: 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20   mutexing */.   
1170: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67     sqlite3Config
1180: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
1190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
11a0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
11b0: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
11c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
11e0: 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f  ALLOC: {.      /
11f0: 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74  * Specify an alt
1200: 65 72 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63 20  ernative malloc 
1210: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
1220: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  /.      sqlite3C
1230: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72  onfig.m = *va_ar
1240: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
1250: 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  m_methods*);.   
1260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1270: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1280: 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53  CONFIG_MEMSTATUS
1290: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61  : {.      /* Ena
12a0: 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
12b0: 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74 75 73  he malloc status
12c0: 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20   collection */. 
12d0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66       sqlite3Conf
12e0: 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76 61  ig.bMemstat = va
12f0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1310: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
1320: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1330: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1340: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1350: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
1360: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1370: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 6e 65 65  *.** Routine nee
1380: 64 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 74  ded to support t
1390: 68 65 20 74 65 73 74 63 61 73 65 28 29 20 6d 61  he testcase() ma
13a0: 63 72 6f 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  cro..*/.#ifdef S
13b0: 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
13c0: 45 53 54 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  EST.void sqlite3
13d0: 43 6f 76 65 72 61 67 65 28 69 6e 74 20 78 29 7b  Coverage(int x){
13e0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 64 75  .  static int du
13f0: 6d 6d 79 20 3d 20 30 3b 0a 20 20 64 75 6d 6d 79  mmy = 0;.  dummy
1400: 20 2b 3d 20 78 3b 0a 7d 0a 23 65 6e 64 69 66 0a   += x;.}.#endif.
1410: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1420: 72 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65  rue if the buffe
1430: 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74  r z[0..n-1] cont
1440: 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e  ains all spaces.
1450: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1460: 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63  llSpaces(const c
1470: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
1480: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
1490: 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e  z[n-1]==' ' ){ n
14a0: 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  --; }.  return n
14b0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ==0;.}../*.** Th
14c0: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
14d0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  t collating func
14e0: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41  tion named "BINA
14f0: 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77  RY" which is alw
1500: 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ays.** available
1510: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
1520: 61 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  adFlag argument 
1530: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
1540: 20 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61   space padding a
1550: 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20  t the end.** of 
1560: 73 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72  strings is ignor
1570: 65 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d  ed.  This implem
1580: 65 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63  ents the RTRIM c
1590: 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ollation..*/.sta
15a0: 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46  tic int binCollF
15b0: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64  unc(.  void *pad
15c0: 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Flag,.  int nKey
15d0: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
15e0: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
15f0: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
1600: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
1610: 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
1620: 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
1630: 20 6e 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d   nKey2;.  rc = m
1640: 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65  emcmp(pKey1, pKe
1650: 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63  y2, n);.  if( rc
1660: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
1670: 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61  adFlag.     && a
1680: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
1690: 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31  )pKey1)+n, nKey1
16a0: 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  -n).     && allS
16b0: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
16c0: 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29  ey2)+n, nKey2-n)
16d0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
16e0: 20 4c 65 61 76 65 20 72 63 20 75 6e 63 68 61 6e   Leave rc unchan
16f0: 67 65 64 20 61 74 20 30 20 2a 2f 0a 20 20 20 20  ged at 0 */.    
1700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1710: 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
1720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1730: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1740: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
1750: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
1760: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
1770: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
1780: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
1790: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
17a0: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
17b0: 64 65 70 65 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d  dependant.** com
17c0: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
17d0: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
17e0: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
17f0: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
1800: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
1810: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
1820: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
1830: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
1840: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
1850: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
1860: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
1870: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
1880: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
1890: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
18a0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
18b0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
18c0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
18d0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
18e0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
18f0: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
1900: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
1910: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
1920: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
1930: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
1940: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
1950: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 69 66 28  y1:nKey2);.  if(
1960: 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d   0==r ){.    r =
1970: 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20   nKey1-nKey2;.  
1980: 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
1990: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19a0: 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d  e ROWID of the m
19b0: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
19c0: 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36  t.*/.sqlite_int6
19d0: 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  4 sqlite3_last_i
19e0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69  nsert_rowid(sqli
19f0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
1a00: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
1a10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a20: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a30: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
1a40: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
1a50: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
1a60: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
1a70: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
1a80: 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
1a90: 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a   db->nChange;.}.
1aa0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1ab0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
1ac0: 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61  ges since the da
1ad0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61  tabase handle wa
1ae0: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  s opened..*/.int
1af0: 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
1b00: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
1b10: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
1b20: 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a  ->nTotalChange;.
1b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1b40: 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74  n existing SQLit
1b50: 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 69 6e  e database.*/.in
1b60: 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  t sqlite3_close(
1b70: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
1b80: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
1b90: 6e 74 20 6a 3b 0a 0a 20 20 69 66 28 20 21 64 62  nt j;..  if( !db
1ba0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1bb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1bc0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1bd0: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
1be0: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
1bf0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
1c00: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1c10: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1c20: 75 74 65 78 29 3b 0a 0a 23 69 66 64 65 66 20 53  utex);..#ifdef S
1c30: 51 4c 49 54 45 5f 53 53 45 0a 20 20 7b 0a 20 20  QLITE_SSE.  {.  
1c40: 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71    extern void sq
1c50: 6c 69 74 65 33 53 73 65 43 6c 65 61 6e 75 70 28  lite3SseCleanup(
1c60: 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 73  sqlite3*);.    s
1c70: 71 6c 69 74 65 33 53 73 65 43 6c 65 61 6e 75 70  qlite3SseCleanup
1c80: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
1c90: 20 0a 0a 20 20 73 71 6c 69 74 65 33 52 65 73 65   ..  sqlite3Rese
1ca0: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
1cb0: 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66  db, 0);..  /* If
1cc0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1cd0: 73 20 6f 70 65 6e 2c 20 74 68 65 20 52 65 73 65  s open, the Rese
1ce0: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
1cf0: 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a  ) call above.  *
1d00: 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20  * will not have 
1d10: 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69 73 63  called the xDisc
1d20: 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20  onnect() method 
1d30: 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c 0a 20  on any virtual. 
1d40: 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68   ** tables in th
1d50: 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20  e db->aVTrans[] 
1d60: 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f  array. The follo
1d70: 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74 61 62  wing sqlite3Vtab
1d80: 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20  Rollback().  ** 
1d90: 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e  call will do so.
1da0: 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74   We need to do t
1db0: 68 69 73 20 62 65 66 6f 72 65 20 74 68 65 20 63  his before the c
1dc0: 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76 65 0a  heck for active.
1dd0: 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
1de0: 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20 74 68  nts below, as th
1df0: 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d  e v-table implem
1e00: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  entation may be 
1e10: 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d  storing.  ** som
1e20: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
1e30: 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79  ments internally
1e40: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1e50: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
1e60: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
1e70: 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e   are any outstan
1e80: 64 69 6e 67 20 56 4d 73 2c 20 72 65 74 75 72 6e  ding VMs, return
1e90: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 2a 2f   SQLITE_BUSY. */
1ea0: 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65  .  if( db->pVdbe
1eb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1ec0: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
1ed0: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
1ee0: 55 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20  Unable to close 
1ef0: 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 73  due to unfinalis
1f00: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ed statements");
1f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
1f20: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1f30: 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ex);.    return 
1f40: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
1f50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1f60: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
1f70: 6b 4f 72 4f 6b 28 64 62 29 20 29 3b 0a 0a 20 20  kOrOk(db) );..  
1f80: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
1f90: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; j++){.    st
1fa0: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
1fb0: 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20  db->aDb[j];.    
1fc0: 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a  if( pDb->pBt ){.
1fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1fe0: 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74  eeClose(pDb->pBt
1ff0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42  );.      pDb->pB
2000: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
2010: 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   j!=1 ){.       
2020: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20   pDb->pSchema = 
2030: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
2040: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
2050: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
2060: 61 28 64 62 2c 20 30 29 3b 0a 20 20 61 73 73 65  a(db, 0);.  asse
2070: 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29  rt( db->nDb<=2 )
2080: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
2090: 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74  aDb==db->aDbStat
20a0: 69 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71  ic );.  for(i=sq
20b0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
20c0: 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69 3d  b->aFunc); i; i=
20d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
20e0: 29 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  )){.    FuncDef 
20f0: 2a 70 46 75 6e 63 2c 20 2a 70 4e 65 78 74 3b 0a  *pFunc, *pNext;.
2100: 20 20 20 20 66 6f 72 28 70 46 75 6e 63 20 3d 20      for(pFunc = 
2110: 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69 74 65  (FuncDef*)sqlite
2120: 48 61 73 68 44 61 74 61 28 69 29 3b 20 70 46 75  HashData(i); pFu
2130: 6e 63 3b 20 70 46 75 6e 63 3d 70 4e 65 78 74 29  nc; pFunc=pNext)
2140: 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
2150: 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20  pFunc->pNext;.  
2160: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2170: 28 70 46 75 6e 63 29 3b 0a 20 20 20 20 7d 0a 20  (pFunc);.    }. 
2180: 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69   }..  for(i=sqli
2190: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
21a0: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69  >aCollSeq); i; i
21b0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
21c0: 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  i)){.    CollSeq
21d0: 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53   *pColl = (CollS
21e0: 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  eq *)sqliteHashD
21f0: 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49  ata(i);.    /* I
2200: 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75  nvoke any destru
2210: 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64  ctors registered
2220: 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   for collation s
2230: 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74  equence user dat
2240: 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d  a. */.    for(j=
2250: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
2260: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d      if( pColl[j]
2270: 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  .xDel ){.       
2280: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70   pColl[j].xDel(p
2290: 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a  Coll[j].pUser);.
22a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22c0: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Coll);.  }.  sql
22d0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
22e0: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
22f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2300: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2310: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
2320: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
2330: 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ule); i; i=sqlit
2340: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
2350: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
2360: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
2370: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
2380: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65     if( pMod->xDe
2390: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70  stroy ){.      p
23a0: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d  Mod->xDestroy(pM
23b0: 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d  od->pAux);.    }
23c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
23d0: 65 28 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73  e(pMod);.  }.  s
23e0: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
23f0: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
2400: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
2410: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
2420: 46 75 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Func);.  sqlite3
2430: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
2440: 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c  _OK, 0); /* Deal
2450: 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68  locates any cach
2460: 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73  ed error strings
2470: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70  . */.  if( db->p
2480: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
2490: 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e  e3ValueFree(db->
24a0: 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pErr);.  }.  sql
24b0: 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69  ite3CloseExtensi
24c0: 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e  ons(db);..  db->
24d0: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
24e0: 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f  AGIC_ERROR;..  /
24f0: 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62  * The temp-datab
2500: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c  ase schema is al
2510: 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e  located differen
2520: 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  tly from the oth
2530: 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f  er schema.  ** o
2540: 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71  bjects (using sq
2550: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72  liteMalloc() dir
2560: 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
2570: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  f sqlite3BtreeSc
2580: 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f  hema())..  ** So
2590: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
25a0: 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f  freed here. Todo
25b0: 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74  : Why not roll t
25c0: 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69  he temp schema i
25d0: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d  nto.  ** the sam
25e0: 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  e sqliteMalloc()
25f0: 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74   as the one that
2600: 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64   allocates the d
2610: 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74  atabase .  ** st
2620: 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20  ructure?.  */.  
2630: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
2640: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
2650: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
2660: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
2670: 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  x);.  db->magic 
2680: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  = SQLITE_MAGIC_C
2690: 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  LOSED;.  sqlite3
26a0: 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e  _mutex_free(db->
26b0: 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  mutex);.  sqlite
26c0: 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 72 65  3_free(db);.  re
26d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
26f0: 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66  k all database f
2700: 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iles..*/.void sq
2710: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
2720: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
2730: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e   int i;.  int in
2740: 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 61 73 73  Trans = 0;.  ass
2750: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2760: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
2770: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  x) );.  sqlite3F
2780: 61 75 6c 74 42 65 67 69 6e 42 65 6e 69 67 6e 28  aultBeginBenign(
2790: 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45  SQLITE_FAULTINJE
27a0: 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b 0a 20 20  CTOR_MALLOC);.  
27b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
27c0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
27d0: 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
27e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
27f0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
2800: 61 6e 73 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ans(db->aDb[i].p
2810: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Bt) ){.        i
2820: 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20  nTrans = 1;.    
2830: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2840: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 64  3BtreeRollback(d
2850: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  b->aDb[i].pBt);.
2860: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d        db->aDb[i]
2870: 2e 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20  .inTrans = 0;.  
2880: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2890: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
28a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 61 75 6c  );.  sqlite3Faul
28b0: 74 45 6e 64 42 65 6e 69 67 6e 28 53 51 4c 49 54  tEndBenign(SQLIT
28c0: 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f  E_FAULTINJECTOR_
28d0: 4d 41 4c 4c 4f 43 29 3b 0a 0a 20 20 69 66 28 20  MALLOC);..  if( 
28e0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
28f0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
2900: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2910: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
2920: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73  ments(db);.    s
2930: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
2940: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
2950: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f  ;.  }..  /* If o
2960: 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ne has been conf
2970: 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74  igured, invoke t
2980: 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b  he rollback-hook
2990: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   callback */.  i
29a0: 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  f( db->xRollback
29b0: 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54  Callback && (inT
29c0: 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74  rans || !db->aut
29d0: 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20  oCommit) ){.    
29e0: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
29f0: 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62  lback(db->pRollb
2a00: 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a  ackArg);.  }.}..
2a10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
2a20: 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61  tatic string tha
2a30: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
2a40: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
2a50: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
2a60: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63  * argument..*/.c
2a70: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
2a80: 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29  e3ErrStr(int rc)
2a90: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2aa0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  z;.  switch( rc 
2ab0: 26 20 30 78 66 66 20 29 7b 0a 20 20 20 20 63 61  & 0xff ){.    ca
2ac0: 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 0a 20  se SQLITE_ROW:. 
2ad0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
2ae0: 4f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ONE:.    case SQ
2af0: 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20  LITE_OK:        
2b00: 20 7a 20 3d 20 22 6e 6f 74 20 61 6e 20 65 72 72   z = "not an err
2b10: 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  or";            
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2b30: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2b40: 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20  LITE_ERROR:     
2b50: 20 7a 20 3d 20 22 53 51 4c 20 6c 6f 67 69 63 20   z = "SQL logic 
2b60: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
2b70: 20 64 61 74 61 62 61 73 65 22 3b 20 20 20 62 72   database";   br
2b80: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2b90: 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20  LITE_PERM:      
2ba0: 20 7a 20 3d 20 22 61 63 63 65 73 73 20 70 65 72   z = "access per
2bb0: 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 3b  mission denied";
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2bd0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2be0: 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20  LITE_ABORT:     
2bf0: 20 7a 20 3d 20 22 63 61 6c 6c 62 61 63 6b 20 72   z = "callback r
2c00: 65 71 75 65 73 74 65 64 20 71 75 65 72 79 20 61  equested query a
2c10: 62 6f 72 74 22 3b 20 20 20 20 20 20 20 20 62 72  bort";        br
2c20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2c30: 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20  LITE_BUSY:      
2c40: 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 69   z = "database i
2c50: 73 20 6c 6f 63 6b 65 64 22 3b 20 20 20 20 20 20  s locked";      
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2c70: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2c80: 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20  LITE_LOCKED:    
2c90: 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 74   z = "database t
2ca0: 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 3b  able is locked";
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2cc0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2cd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  LITE_NOMEM:     
2ce0: 20 7a 20 3d 20 22 6f 75 74 20 6f 66 20 6d 65 6d   z = "out of mem
2cf0: 6f 72 79 22 3b 20 20 20 20 20 20 20 20 20 20 20  ory";           
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2d10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2d20: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20  LITE_READONLY:  
2d30: 20 7a 20 3d 20 22 61 74 74 65 6d 70 74 20 74 6f   z = "attempt to
2d40: 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c   write a readonl
2d50: 79 20 64 61 74 61 62 61 73 65 22 3b 20 20 62 72  y database";  br
2d60: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2d70: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20  LITE_INTERRUPT: 
2d80: 20 7a 20 3d 20 22 69 6e 74 65 72 72 75 70 74 65   z = "interrupte
2d90: 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d";             
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2db0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2dc0: 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20  LITE_IOERR:     
2dd0: 20 7a 20 3d 20 22 64 69 73 6b 20 49 2f 4f 20 65   z = "disk I/O e
2de0: 72 72 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20  rror";          
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2e00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2e10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20  LITE_CORRUPT:   
2e20: 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 64   z = "database d
2e30: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
2e40: 66 6f 72 6d 65 64 22 3b 20 20 20 20 20 20 62 72  formed";      br
2e50: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2e60: 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20  LITE_FULL:      
2e70: 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 6f   z = "database o
2e80: 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 3b  r disk is full";
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2ea0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2eb0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20  LITE_CANTOPEN:  
2ec0: 20 7a 20 3d 20 22 75 6e 61 62 6c 65 20 74 6f 20   z = "unable to 
2ed0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
2ee0: 6c 65 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  le";          br
2ef0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2f00: 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20  LITE_EMPTY:     
2f10: 20 7a 20 3d 20 22 74 61 62 6c 65 20 63 6f 6e 74   z = "table cont
2f20: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 3b 20 20  ains no data";  
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2f40: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2f50: 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20  LITE_SCHEMA:    
2f60: 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 73   z = "database s
2f70: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
2f80: 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72  d";           br
2f90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2fa0: 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20  LITE_TOOBIG:    
2fb0: 20 7a 20 3d 20 22 53 74 72 69 6e 67 20 6f 72 20   z = "String or 
2fc0: 42 4c 4f 42 20 65 78 63 65 65 64 65 64 20 73 69  BLOB exceeded si
2fd0: 7a 65 20 6c 69 6d 69 74 22 3b 20 20 20 20 62 72  ze limit";    br
2fe0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2ff0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a  LITE_CONSTRAINT:
3000: 20 7a 20 3d 20 22 63 6f 6e 73 74 72 61 69 6e 74   z = "constraint
3010: 20 66 61 69 6c 65 64 22 3b 20 20 20 20 20 20 20   failed";       
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
3030: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
3040: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20  LITE_MISMATCH:  
3050: 20 7a 20 3d 20 22 64 61 74 61 74 79 70 65 20 6d   z = "datatype m
3060: 69 73 6d 61 74 63 68 22 3b 20 20 20 20 20 20 20  ismatch";       
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
3080: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
3090: 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20  LITE_MISUSE:    
30a0: 20 7a 20 3d 20 22 6c 69 62 72 61 72 79 20 72 6f   z = "library ro
30b0: 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74  utine called out
30c0: 20 6f 66 20 73 65 71 75 65 6e 63 65 22 3b 62 72   of sequence";br
30d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
30e0: 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20  LITE_NOLFS:     
30f0: 20 7a 20 3d 20 22 6c 61 72 67 65 20 66 69 6c 65   z = "large file
3100: 20 73 75 70 70 6f 72 74 20 69 73 20 64 69 73 61   support is disa
3110: 62 6c 65 64 22 3b 20 20 20 20 20 20 20 20 62 72  bled";        br
3120: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
3130: 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20  LITE_AUTH:      
3140: 20 7a 20 3d 20 22 61 75 74 68 6f 72 69 7a 61 74   z = "authorizat
3150: 69 6f 6e 20 64 65 6e 69 65 64 22 3b 20 20 20 20  ion denied";    
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
3170: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
3180: 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20  LITE_FORMAT:    
3190: 20 7a 20 3d 20 22 61 75 78 69 6c 69 61 72 79 20   z = "auxiliary 
31a0: 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20  database format 
31b0: 65 72 72 6f 72 22 3b 20 20 20 20 20 20 20 62 72  error";       br
31c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
31d0: 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20  LITE_RANGE:     
31e0: 20 7a 20 3d 20 22 62 69 6e 64 20 6f 72 20 63 6f   z = "bind or co
31f0: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f  lumn index out o
3200: 66 20 72 61 6e 67 65 22 3b 20 20 20 20 20 62 72  f range";     br
3210: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
3220: 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20  LITE_NOTADB:    
3230: 20 7a 20 3d 20 22 66 69 6c 65 20 69 73 20 65 6e   z = "file is en
3240: 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f  crypted or is no
3250: 74 20 61 20 64 61 74 61 62 61 73 65 22 3b 62 72  t a database";br
3260: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
3270: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
3280: 20 7a 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72   z = "unknown er
3290: 72 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20 20  ror";           
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
32b0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
32c0: 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n z;.}../*.** Th
32d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
32e0: 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c  ments a busy cal
32f0: 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70  lback that sleep
3300: 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61  s and tries.** a
3310: 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d  gain until a tim
3320: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65  eout value is re
3330: 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65  ached.  The time
3340: 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  out value is.** 
3350: 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
3360: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
3370: 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74  s passed in as t
3380: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
3390: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
33a0: 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c  int sqliteDefaul
33b0: 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20  tBusyCallback(. 
33c0: 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20  void *ptr,      
33d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
33e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
33f0: 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20  */. int count   
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3410: 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  Number of times 
3420: 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62  table has been b
3430: 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 4f 53  usy */.){.#if OS
3440: 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64  _WIN || (defined
3450: 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
3460: 20 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20 20   HAVE_USLEEP).  
3470: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
3480: 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20  delays[] =.     
3490: 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31  { 1, 2, 5, 10, 1
34a0: 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20  5, 20, 25, 25,  
34b0: 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30  25,  50,  50, 10
34c0: 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  0 };.  static co
34d0: 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20  nst u8 totals[] 
34e0: 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33  =.     { 0, 1, 3
34f0: 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33  ,  8, 18, 33, 53
3500: 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20  , 78, 103, 128, 
3510: 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65  178, 228 };.# de
3520: 66 69 6e 65 20 4e 44 45 4c 41 59 20 28 73 69 7a  fine NDELAY (siz
3530: 65 6f 66 28 64 65 6c 61 79 73 29 2f 73 69 7a 65  eof(delays)/size
3540: 6f 66 28 64 65 6c 61 79 73 5b 30 5d 29 29 0a 20  of(delays[0])). 
3550: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
3560: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
3570: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64   int timeout = d
3580: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  b->busyTimeout;.
3590: 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69    int delay, pri
35a0: 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  or;..  assert( c
35b0: 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ount>=0 );.  if(
35c0: 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20   count < NDELAY 
35d0: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  ){.    delay = d
35e0: 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  elays[count];.  
35f0: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
3600: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65  [count];.  }else
3610: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  {.    delay = de
3620: 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a  lays[NDELAY-1];.
3630: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
3640: 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64  ls[NDELAY-1] + d
3650: 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45  elay*(count-(NDE
3660: 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69  LAY-1));.  }.  i
3670: 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79  f( prior + delay
3680: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
3690: 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75    delay = timeou
36a0: 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69  t - prior;.    i
36b0: 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65  f( delay<=0 ) re
36c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
36d0: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d  lite3OsSleep(db-
36e0: 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30  >pVfs, delay*100
36f0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
3700: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20  #else.  sqlite3 
3710: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
3720: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
3730: 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20  out = ((sqlite3 
3740: 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65  *)ptr)->busyTime
3750: 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e  out;.  if( (coun
3760: 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65  t+1)*1000 > time
3770: 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  out ){.    retur
3780: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
3790: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
37a0: 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20  fs, 1000000);.  
37b0: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
37c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
37d0: 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20   the given busy 
37e0: 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  handler..**.** T
37f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3800: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70  alled when an op
3810: 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77  eration failed w
3820: 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49  ith a lock..** I
3830: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
3840: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
3850: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74   the lock is ret
3860: 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20  ried.  If it.** 
3870: 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f  returns 0, the o
3880: 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20  peration aborts 
3890: 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42  with an SQLITE_B
38a0: 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e  USY error..*/.in
38b0: 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  t sqlite3InvokeB
38c0: 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48  usyHandler(BusyH
38d0: 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e  andler *p){.  in
38e0: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 3d 3d 30  t rc;.  if( p==0
38f0: 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   || p->xFunc==0 
3900: 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20  || p->nBusy<0 ) 
3910: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
3920: 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72   p->xFunc(p->pAr
3930: 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20  g, p->nBusy);.  
3940: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
3950: 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a   p->nBusy = -1;.
3960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
3970: 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72  nBusy++;.  }.  r
3980: 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a  eturn rc; .}../*
3990: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
39a0: 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63   sets the busy c
39b0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
39c0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
39d0: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
39e0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
39f0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
3a00: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
3a10: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
3a20: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
3a30: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42   *db,.  int (*xB
3a40: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
3a50: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
3a60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
3a70: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
3a80: 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  );.  db->busyHan
3a90: 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75  dler.xFunc = xBu
3aa0: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
3ab0: 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72  ndler.pArg = pAr
3ac0: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
3ad0: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
3ae0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
3af0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
3b00: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
3b10: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
3b20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
3b30: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f  GRESS_CALLBACK./
3b40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3b50: 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72  e sets the progr
3b60: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ess callback for
3b70: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
3b80: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
3b90: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
3ba0: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
3bb0: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  iven argument. T
3bc0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
3bd0: 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  back will.** be 
3be0: 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f  invoked every nO
3bf0: 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76  ps opcodes..*/.v
3c00: 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67  oid sqlite3_prog
3c10: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20  ress_handler(.  
3c20: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
3c30: 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20  int nOps,.  int 
3c40: 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69  (*xProgress)(voi
3c50: 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41  d*), .  void *pA
3c60: 72 67 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  rg.){.  if( sqli
3c70: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
3c80: 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  (db) ){.    sqli
3c90: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
3ca0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
3cb0: 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20  if( nOps>0 ){.  
3cc0: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
3cd0: 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20  s = xProgress;. 
3ce0: 20 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65       db->nProgre
3cf0: 73 73 4f 70 73 20 3d 20 6e 4f 70 73 3b 0a 20 20  ssOps = nOps;.  
3d00: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
3d10: 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 20  sArg = pArg;.   
3d20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
3d30: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->xProgress = 0;
3d40: 0a 20 20 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  .      db->nProg
3d50: 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20  ressOps = 0;.   
3d60: 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73     db->pProgress
3d70: 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Arg = 0;.    }. 
3d80: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
3d90: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
3da0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
3db0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3dc0: 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20  tine installs a 
3dd0: 64 65 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e  default busy han
3de0: 64 6c 65 72 20 74 68 61 74 20 77 61 69 74 73 20  dler that waits 
3df0: 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  for the.** speci
3e00: 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d  fied number of m
3e10: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f  illiseconds befo
3e20: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a  re returning 0..
3e30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
3e40: 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69  usy_timeout(sqli
3e50: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29  te3 *db, int ms)
3e60: 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a  {.  if( ms>0 ){.
3e70: 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65      db->busyTime
3e80: 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20 73 71  out = ms;.    sq
3e90: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
3ea0: 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66  er(db, sqliteDef
3eb0: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
3ec0: 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20  , (void*)db);.  
3ed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
3ee0: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
3ef0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  db, 0, 0);.  }. 
3f00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3f10: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73  K;.}../*.** Caus
3f20: 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70  e any pending op
3f30: 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20  eration to stop 
3f40: 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20  at its earliest 
3f50: 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a  opportunity..*/.
3f60: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74  void sqlite3_int
3f70: 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a  errupt(sqlite3 *
3f80: 64 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  db){.  if( sqlit
3f90: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
3fa0: 64 62 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 75  db) ){.    db->u
3fb0: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
3fc0: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  = 1;.  }.}.../*.
3fd0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3fe0: 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20   is exactly the 
3ff0: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f  same as sqlite3_
4000: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
4010: 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  ), except.** tha
4020: 74 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64  t it is designed
4030: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79   to be called by
4040: 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20   internal code. 
4050: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
4060: 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d  s.** that if a m
4070: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e  alloc() fails in
4080: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
4090: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65  function(), an e
40a0: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
40b0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
40c0: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c   mallocFailed fl
40d0: 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a  ag cleared. .*/.
40e0: 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74  int sqlite3Creat
40f0: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
4100: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
4110: 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  ar *zFunctionNam
4120: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
4130: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
4140: 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76   *pUserData,.  v
4150: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
4160: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
4170: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
4180: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
4190: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
41a0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
41b0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
41c0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
41d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
41e0: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b  ){.  FuncDef *p;
41f0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20  .  int nName;.. 
4200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4210: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
4220: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
4230: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
4240: 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63   ||.      (xFunc
4250: 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78   && (xFinal || x
4260: 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20  Step)) || .     
4270: 20 28 21 78 46 75 6e 63 20 26 26 20 28 78 46 69   (!xFunc && (xFi
4280: 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20  nal && !xStep)) 
4290: 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63  ||.      (!xFunc
42a0: 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20   && (!xFinal && 
42b0: 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20  xStep)) ||.     
42c0: 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72   (nArg<-1 || nAr
42d0: 67 3e 31 32 37 29 20 7c 7c 0a 20 20 20 20 20 20  g>127) ||.      
42e0: 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 74  (255<(nName = st
42f0: 72 6c 65 6e 28 7a 46 75 6e 63 74 69 6f 6e 4e 61  rlen(zFunctionNa
4300: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  me))) ){.    sql
4310: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
4320: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 62 61 64  LITE_ERROR, "bad
4330: 20 70 61 72 61 6d 65 74 65 72 73 22 29 3b 0a 20   parameters");. 
4340: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4350: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23  _ERROR;.  }.  .#
4360: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4370: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
4380: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
4390: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
43a0: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
43b0: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
43c0: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
43d0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
43e0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
43f0: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
4400: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
4410: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
4420: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
4430: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
4440: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
4450: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
4460: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
4470: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
4480: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
4490: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
44a0: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
44b0: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
44c0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
44d0: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
44e0: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
44f0: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
4500: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
4510: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
4520: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
4530: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
4540: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
4550: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75    pUserData, xFu
4560: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
4570: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  l);.    if( rc==
4580: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4590: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
45a0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
45b0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
45c0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  g, SQLITE_UTF16L
45d0: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73  E,.          pUs
45e0: 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78  erData, xFunc, x
45f0: 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20  Step, xFinal);. 
4600: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
4610: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4620: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
4630: 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53     }.    enc = S
4640: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
4650: 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d   }.#else.  enc =
4660: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
4670: 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65  ndif.  .  /* Che
4680: 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ck if an existin
4690: 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  g function is be
46a0: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f  ing overridden o
46b0: 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f  r deleted. If so
46c0: 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65  ,.  ** and there
46d0: 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
46e0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   then return SQL
46f0: 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66  ITE_BUSY. If a f
4700: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
4710: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
4720: 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65  /deleted but the
4730: 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  re are no active
4740: 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a   VMs, allow the.
4750: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74    ** operation t
4760: 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69  o continue but i
4770: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
4780: 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  ecompiled statem
4790: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  ents..  */.  p =
47a0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
47b0: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
47c0: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
47d0: 41 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  Arg, enc, 0);.  
47e0: 69 66 28 20 70 20 26 26 20 70 2d 3e 69 50 72 65  if( p && p->iPre
47f0: 66 45 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e  fEnc==enc && p->
4800: 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20  nArg==nArg ){.  
4810: 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65    if( db->active
4820: 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20  VdbeCnt ){.     
4830: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
4840: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
4850: 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20          "Unable 
4860: 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
4870: 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64   user-function d
4880: 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
4890: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
48a0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
48b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
48c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
48d0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
48e0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
48f0: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
4900: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
4910: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73    }.  }..  p = s
4920: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
4930: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
4940: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
4950: 67 2c 20 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73  g, enc, 1);.  as
4960: 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61  sert(p || db->ma
4970: 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69  llocFailed);.  i
4980: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
4990: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
49a0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 66 6c 61 67 73  ;.  }.  p->flags
49b0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e 63   = 0;.  p->xFunc
49c0: 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78   = xFunc;.  p->x
49d0: 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20  Step = xStep;.  
49e0: 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78  p->xFinalize = x
49f0: 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65  Final;.  p->pUse
4a00: 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74  rData = pUserDat
4a10: 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 6e  a;.  p->nArg = n
4a20: 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Arg;.  return SQ
4a30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4a40: 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65  * Create new use
4a50: 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  r functions..*/.
4a60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
4a70: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  te_function(.  s
4a80: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
4a90: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74  nst char *zFunct
4aa0: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
4ab0: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
4ac0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
4ad0: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
4ae0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
4af0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4b00: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
4b10: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
4b20: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
4b30: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
4b40: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
4b50: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
4b60: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
4b70: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
4b80: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
4b90: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
4ba0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74  eFunc(db, zFunct
4bb0: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 65  ionName, nArg, e
4bc0: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
4bd0: 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20  tep, xFinal);.  
4be0: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
4bf0: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
4c00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
4c10: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
4c20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
4c30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4c40: 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c  IT_UTF16.int sql
4c50: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
4c60: 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
4c70: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76  3 *db,.  const v
4c80: 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61  oid *zFunctionNa
4c90: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  me,.  int nArg,.
4ca0: 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a    int eTextRep,.
4cb0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
4cc0: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
4cd0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
4ce0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
4cf0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
4d00: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
4d10: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
4d20: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
4d30: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
4d40: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
4d50: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
4d60: 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71 6c 69 74  *zFunc8;.  sqlit
4d70: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
4d80: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
4d90: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
4da0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e  Failed );.  zFun
4db0: 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31  c8 = sqlite3Utf1
4dc0: 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69  6to8(db, zFuncti
4dd0: 6f 6e 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 72  onName, -1);.  r
4de0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
4df0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38  eFunc(db, zFunc8
4e00: 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70  , nArg, eTextRep
4e10: 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  , p, xFunc, xSte
4e20: 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 73 71  p, xFinal);.  sq
4e30: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6e 63  lite3_free(zFunc
4e40: 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  8);.  rc = sqlit
4e50: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
4e60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
4e70: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
4e80: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
4e90: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
4ea0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20  ** Declare that 
4eb0: 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  a function has b
4ec0: 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62  een overloaded b
4ed0: 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  y a virtual tabl
4ee0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
4ef0: 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  function already
4f00: 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67   exists as a reg
4f10: 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ular global func
4f20: 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tion, then.** th
4f30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
4f40: 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66  no-op.  If the f
4f50: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
4f60: 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65   exist, then cre
4f70: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65  ate.** a new one
4f80: 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72   that always thr
4f90: 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65  ows a run-time e
4fa0: 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  rror.  .**.** Wh
4fb0: 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
4fc0: 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76  s intend to prov
4fd0: 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65  ide an overloade
4fe0: 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79  d function, they
4ff0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
5000: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
5010: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c  make sure the gl
5020: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78  obal function ex
5030: 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61  ists..** A globa
5040: 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  l function must 
5050: 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66  exist in order f
5060: 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  or name resoluti
5070: 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72  on to work.** pr
5080: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  operly..*/.int s
5090: 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
50a0: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
50b0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
50c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
50d0: 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e  int nArg.){.  in
50e0: 74 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e  t nName = strlen
50f0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72  (zName);.  int r
5100: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  c;.  sqlite3_mut
5110: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
5120: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
5130: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
5140: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  b, zName, nName,
5150: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
5160: 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  F8, 0)==0 ){.   
5170: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
5180: 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  nc(db, zName, nA
5190: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
51a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
51b0: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
51c0: 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e  3InvalidFunction
51d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
51e0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
51f0: 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  it(db, SQLITE_OK
5200: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
5210: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
5220: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
5230: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
5240: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
5250: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
5260: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20  trace function. 
5270: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
5280: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
5290: 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a  gistered trace.*
52a0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  * is returned.  
52b0: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72  .**.** A NULL tr
52c0: 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ace function mea
52d0: 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69  ns that no traci
52e0: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
52f0: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74   A non-NULL.** t
5300: 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65  race is a pointe
5310: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
5320: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
5330: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
5340: 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74  each.** SQL stat
5350: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ement..*/.void *
5360: 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71  sqlite3_trace(sq
5370: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
5380: 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c  (*xTrace)(void*,
5390: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f  const char*), vo
53a0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69  id *pArg){.  voi
53b0: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
53c0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
53d0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
53e0: 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72  d = db->pTraceAr
53f0: 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  g;.  db->xTrace 
5400: 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = xTrace;.  db->
5410: 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
5420: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
5430: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
5440: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
5450: 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  d;.}./*.** Regis
5460: 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75  ter a profile fu
5470: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
5480: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
5490: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
54a0: 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e   .** profile fun
54b0: 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65  ction is returne
54c0: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
54d0: 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  L profile functi
54e0: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
54f0: 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78   profiling is ex
5500: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
5510: 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69  ULL.** profile i
5520: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
5530: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
5540: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
5550: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a   conclusion of.*
5560: 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  * each SQL state
5570: 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e  ment that is run
5580: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
5590: 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71  e3_profile(.  sq
55a0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
55b0: 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f  d (*xProfile)(vo
55c0: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
55d0: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a  sqlite_uint64),.
55e0: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
55f0: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20    void *pOld;.  
5600: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
5610: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
5620: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72    pOld = db->pPr
5630: 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e  ofileArg;.  db->
5640: 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66  xProfile = xProf
5650: 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66  ile;.  db->pProf
5660: 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ileArg = pArg;. 
5670: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
5680: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
5690: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
56a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
56b0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f  TE_OMIT_TRACE */
56c0: 0a 0a 2f 2a 2a 2a 20 45 58 50 45 52 49 4d 45 4e  ../*** EXPERIMEN
56d0: 54 41 4c 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65  TAL ***.**.** Re
56e0: 67 69 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f  gister a functio
56f0: 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
5700: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
5710: 6f 6e 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 20  on comments..** 
5720: 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66  If the invoked f
5730: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5740: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
5750: 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65  he commit become
5760: 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e  s a.** rollback.
5770: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
5780: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20  3_commit_hook(. 
5790: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
57a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
57b0: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
57c0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
57d0: 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
57e0: 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a  ack)(void*),  /*
57f0: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76   Function to inv
5800: 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d  oke on each comm
5810: 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  it */.  void *pA
5820: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
5830: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
5840: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
5850: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
5860: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
5870: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
5880: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
5890: 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64  >pCommitArg;.  d
58a0: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
58b0: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
58c0: 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67    db->pCommitArg
58d0: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
58e0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
58f0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
5900: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a  urn pOld;.}../*.
5910: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
5920: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
5930: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
5940: 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
5950: 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
5960: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
5970: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
5980: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
5990: 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f  *sqlite3_update_
59a0: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
59b0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
59c0: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
59d0: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
59e0: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
59f0: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
5a00: 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  d*,int,char cons
5a10: 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  t *,char const *
5a20: 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a  ,sqlite_int64),.
5a30: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5a50: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
5a60: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
5a70: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71  void *pRet;.  sq
5a80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
5a90: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
5aa0: 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61  pRet = db->pUpda
5ab0: 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70  teArg;.  db->xUp
5ac0: 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78  dateCallback = x
5ad0: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
5ae0: 70 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72  pUpdateArg = pAr
5af0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
5b00: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
5b10: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
5b20: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  et;.}../*.** Reg
5b30: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
5b40: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
5b50: 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
5b60: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
5b70: 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73  .** back by this
5b80: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5b90: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
5ba0: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
5bb0: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
5bc0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
5bd0: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
5be0: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
5bf0: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
5c00: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
5c10: 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  d*), /* Callback
5c20: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
5c30: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
5c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
5c50: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
5c60: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
5c70: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
5c80: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
5c90: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
5ca0: 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  t = db->pRollbac
5cb0: 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c  kArg;.  db->xRol
5cc0: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20  lbackCallback = 
5cd0: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
5ce0: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20  >pRollbackArg = 
5cf0: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
5d00: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
5d10: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
5d20: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
5d30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5d40: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
5d50: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
5d60: 20 61 20 64 61 74 61 62 61 73 65 20 42 54 72 65   a database BTre
5d70: 65 0a 2a 2a 20 64 72 69 76 65 72 2e 20 20 49 66  e.** driver.  If
5d80: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
5d90: 65 20 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c 65  e name of a file
5da0: 2c 20 74 68 65 6e 20 74 68 61 74 20 66 69 6c 65  , then that file
5db0: 20 69 73 0a 2a 2a 20 6f 70 65 6e 65 64 20 61 6e   is.** opened an
5dc0: 64 20 75 73 65 64 2e 20 20 49 66 20 7a 46 69 6c  d used.  If zFil
5dd0: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6d 61 67  ename is the mag
5de0: 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
5df0: 3a 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64  :" then.** the d
5e00: 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
5e10: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 28 61 6e 64  d in memory (and
5e20: 20 69 73 20 74 68 75 73 20 66 6f 72 67 6f 74 74   is thus forgott
5e30: 65 6e 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a  en as soon as.**
5e40: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
5e50: 69 73 20 63 6c 6f 73 65 64 2e 29 20 20 49 66 20  is closed.)  If 
5e60: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
5e70: 4c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  L then the datab
5e80: 61 73 65 0a 2a 2a 20 69 73 20 61 20 22 76 69 72  ase.** is a "vir
5e90: 74 75 61 6c 22 20 64 61 74 61 62 61 73 65 20 66  tual" database f
5ea0: 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 75 73 65  or transient use
5eb0: 20 6f 6e 6c 79 20 61 6e 64 20 69 73 20 64 65 6c   only and is del
5ec0: 65 74 65 64 20 61 73 0a 2a 2a 20 73 6f 6f 6e 20  eted as.** soon 
5ed0: 61 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  as the connectio
5ee0: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  n is closed..**.
5ef0: 2a 2a 20 41 20 76 69 72 74 75 61 6c 20 64 61 74  ** A virtual dat
5f00: 61 62 61 73 65 20 63 61 6e 20 62 65 20 65 69 74  abase can be eit
5f10: 68 65 72 20 61 20 64 69 73 6b 20 66 69 6c 65 20  her a disk file 
5f20: 28 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74  (that is automat
5f30: 69 63 61 6c 6c 79 0a 2a 2a 20 64 65 6c 65 74 65  ically.** delete
5f40: 64 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65 20  d when the file 
5f50: 69 73 20 63 6c 6f 73 65 64 29 20 6f 72 20 69 74  is closed) or it
5f60: 20 61 6e 20 62 65 20 68 65 6c 64 20 65 6e 74 69   an be held enti
5f70: 72 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 0a  rely in memory,.
5f80: 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ** depending on 
5f90: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
5fa0: 65 20 54 45 4d 50 5f 53 54 4f 52 45 20 63 6f 6d  e TEMP_STORE com
5fb0: 70 69 6c 65 2d 74 69 6d 65 20 6d 61 63 72 6f 20  pile-time macro 
5fc0: 61 6e 64 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 74  and the.** db->t
5fd0: 65 6d 70 5f 73 74 6f 72 65 20 76 61 72 69 61 62  emp_store variab
5fe0: 6c 65 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  le, according to
5ff0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
6000: 68 61 72 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hart:.**.**     
6010: 20 20 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20    TEMP_STORE    
6020: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
6030: 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20      Location of 
6040: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
6050: 73 65 0a 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  se.**       ----
6060: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
60a0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
60b0: 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
60c0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 0a 2a            file.*
60d0: 2a 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20  *           1   
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
6100: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 31 20  .**           1 
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
6130: 6d 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mory.**         
6140: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
6150: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
6160: 20 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20    file.**       
6170: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
6180: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
6190: 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20      file.**     
61a0: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
61b0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
61c0: 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a 20        memory.** 
61d0: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
61e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
61f0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
6200: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 33 20  .**           3 
6210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
6220: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  y             me
6230: 6d 6f 72 79 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mory.*/.int sqli
6240: 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28  te3BtreeFactory(
6250: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
6260: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
6270: 4d 61 69 6e 20 64 61 74 61 62 61 73 65 20 77 68  Main database wh
6280: 65 6e 20 6f 70 65 6e 69 6e 67 20 61 75 78 20 6f  en opening aux o
6290: 74 68 65 72 77 69 73 65 20 30 20 2a 2f 0a 20 20  therwise 0 */.  
62a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
62b0: 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d  ename,    /* Nam
62c0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
62d0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
62e0: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
62f0: 20 69 6e 74 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c   int omitJournal
6300: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66  ,          /* if
6310: 20 54 52 55 45 20 74 68 65 6e 20 64 6f 20 6e 6f   TRUE then do no
6320: 74 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 66  t journal this f
6330: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 61  ile */.  int nCa
6340: 63 68 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  che,            
6350: 20 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 70     /* How many p
6360: 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
6370: 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20   cache */.  int 
6380: 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20  vfsFlags,       
6390: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
63a0: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
63b0: 20 76 66 73 4f 70 65 6e 20 2a 2f 0a 20 20 42 74   vfsOpen */.  Bt
63c0: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 20 20 20  ree **ppBtree   
63d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
63e0: 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
63f0: 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
6400: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
6410: 62 74 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69  btFlags = 0;.  i
6420: 6e 74 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65  nt rc;.  .  asse
6430: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6440: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
6450: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
6460: 70 42 74 72 65 65 20 21 3d 20 30 29 3b 0a 20 20  pBtree != 0);.  
6470: 69 66 28 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 20  if( omitJournal 
6480: 29 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20 7c  ){.    btFlags |
6490: 3d 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  = BTREE_OMIT_JOU
64a0: 52 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RNAL;.  }.  if( 
64b0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
64c0: 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b  TE_NoReadlock ){
64d0: 0a 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d 20  .    btFlags |= 
64e0: 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43  BTREE_NO_READLOC
64f0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69  K;.  }.  if( zFi
6500: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  lename==0 ){.#if
6510: 20 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20   TEMP_STORE==0. 
6520: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
6530: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64   */.#endif.#ifnd
6540: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
6550: 45 4d 4f 52 59 44 42 0a 23 69 66 20 54 45 4d 50  EMORYDB.#if TEMP
6560: 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 20 20 69 66  _STORE==1.    if
6570: 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  ( db->temp_store
6580: 3d 3d 32 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20  ==2 ) zFilename 
6590: 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65  = ":memory:";.#e
65a0: 6e 64 69 66 0a 23 69 66 20 54 45 4d 50 5f 53 54  ndif.#if TEMP_ST
65b0: 4f 52 45 3d 3d 32 0a 20 20 20 20 69 66 28 20 64  ORE==2.    if( d
65c0: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31  b->temp_store!=1
65d0: 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22   ) zFilename = "
65e0: 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e 64 69  :memory:";.#endi
65f0: 66 0a 23 69 66 20 54 45 4d 50 5f 53 54 4f 52 45  f.#if TEMP_STORE
6600: 3d 3d 33 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  ==3.    zFilenam
6610: 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a  e = ":memory:";.
6620: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a  #endif.#endif /*
6630: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
6640: 4f 52 59 44 42 20 2a 2f 0a 20 20 7d 0a 0a 20 20  ORYDB */.  }..  
6650: 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20  if( (vfsFlags & 
6660: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
6670: 5f 44 42 29 21 3d 30 20 26 26 20 28 7a 46 69 6c  _DB)!=0 && (zFil
6680: 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69  ename==0 || *zFi
6690: 6c 65 6e 61 6d 65 3d 3d 30 29 20 29 7b 0a 20 20  lename==0) ){.  
66a0: 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
66b0: 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
66c0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
66d0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
66e0: 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  P_DB;.  }.  rc =
66f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
6700: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 73 71  n(zFilename, (sq
6710: 6c 69 74 65 33 20 2a 29 64 62 2c 20 70 70 42 74  lite3 *)db, ppBt
6720: 72 65 65 2c 20 62 74 46 6c 61 67 73 2c 20 76 66  ree, btFlags, vf
6730: 73 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72  sFlags);.  if( r
6740: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6750: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6760: 53 65 74 43 61 63 68 65 53 69 7a 65 28 2a 70 70  SetCacheSize(*pp
6770: 42 74 72 65 65 2c 20 6e 43 61 63 68 65 29 3b 0a  Btree, nCache);.
6780: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
67a0: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45   UTF-8 encoded E
67b0: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
67c0: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
67d0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
67e0: 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73  * error..*/.cons
67f0: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
6800: 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a  errmsg(sqlite3 *
6810: 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  db){.  const cha
6820: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20  r *z;.  if( !db 
6830: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
6840: 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
6850: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20  TE_NOMEM);.  }. 
6860: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
6870: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
6880: 28 64 62 29 20 7c 7c 20 64 62 2d 3e 65 72 72 43  (db) || db->errC
6890: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4d 49 53 55  ode==SQLITE_MISU
68a0: 53 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  SE ){.    return
68b0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
68c0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 29 3b 0a 20  QLITE_MISUSE);. 
68d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
68e0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
68f0: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
6900: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6910: 20 29 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a   );.  z = (char*
6920: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6930: 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  ext(db->pErr);. 
6940: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
6950: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6960: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
6970: 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
6980: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a  r(db->errCode);.
6990: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
69a0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
69b0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
69c0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
69d0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
69e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
69f0: 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69  16 encoded Engli
6a00: 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
6a10: 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  anation of the m
6a20: 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72  ost recent.** er
6a30: 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  ror..*/.const vo
6a40: 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d  id *sqlite3_errm
6a50: 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62  sg16(sqlite3 *db
6a60: 29 7b 0a 20 20 2f 2a 20 42 65 63 61 75 73 65 20  ){.  /* Because 
6a70: 61 6c 6c 20 74 68 65 20 63 68 61 72 61 63 74 65  all the characte
6a80: 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67  rs in the string
6a90: 20 61 72 65 20 69 6e 20 74 68 65 20 75 6e 69 63   are in the unic
6aa0: 6f 64 65 0a 20 20 2a 2a 20 72 61 6e 67 65 20 30  ode.  ** range 0
6ab0: 78 30 30 2d 30 78 46 46 2c 20 69 66 20 77 65 20  x00-0xFF, if we 
6ac0: 70 61 64 20 74 68 65 20 62 69 67 2d 65 6e 64 69  pad the big-endi
6ad0: 61 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20 61  an string with a
6ae0: 20 0a 20 20 2a 2a 20 7a 65 72 6f 20 62 79 74 65   .  ** zero byte
6af0: 2c 20 77 65 20 63 61 6e 20 6f 62 74 61 69 6e 20  , we can obtain 
6b00: 74 68 65 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61  the little-endia
6b10: 6e 20 73 74 72 69 6e 67 20 77 69 74 68 0a 20 20  n string with.  
6b20: 2a 2a 20 26 62 69 67 5f 65 6e 64 69 61 6e 5b 31  ** &big_endian[1
6b30: 5d 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63  ]..  */.  static
6b40: 20 63 6f 6e 73 74 20 63 68 61 72 20 6f 75 74 4f   const char outO
6b50: 66 4d 65 6d 42 65 5b 5d 20 3d 20 7b 0a 20 20 20  fMemBe[] = {.   
6b60: 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27 75 27 2c   0, 'o', 0, 'u',
6b70: 20 30 2c 20 27 74 27 2c 20 30 2c 20 27 20 27 2c   0, 't', 0, ' ',
6b80: 20 0a 20 20 20 20 30 2c 20 27 6f 27 2c 20 30 2c   .    0, 'o', 0,
6b90: 20 27 66 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20   'f', 0, ' ', . 
6ba0: 20 20 20 30 2c 20 27 6d 27 2c 20 30 2c 20 27 65     0, 'm', 0, 'e
6bb0: 27 2c 20 30 2c 20 27 6d 27 2c 20 30 2c 20 27 6f  ', 0, 'm', 0, 'o
6bc0: 27 2c 20 30 2c 20 27 72 27 2c 20 30 2c 20 27 79  ', 0, 'r', 0, 'y
6bd0: 27 2c 20 30 2c 20 30 2c 20 30 0a 20 20 7d 3b 0a  ', 0, 0, 0.  };.
6be0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
6bf0: 68 61 72 20 6d 69 73 75 73 65 42 65 20 5b 5d 20  har misuseBe [] 
6c00: 3d 20 7b 0a 20 20 20 20 30 2c 20 27 6c 27 2c 20  = {.    0, 'l', 
6c10: 30 2c 20 27 69 27 2c 20 30 2c 20 27 62 27 2c 20  0, 'i', 0, 'b', 
6c20: 30 2c 20 27 72 27 2c 20 30 2c 20 27 61 27 2c 20  0, 'r', 0, 'a', 
6c30: 30 2c 20 27 72 27 2c 20 30 2c 20 27 79 27 2c 20  0, 'r', 0, 'y', 
6c40: 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20  0, ' ', .    0, 
6c50: 27 72 27 2c 20 30 2c 20 27 6f 27 2c 20 30 2c 20  'r', 0, 'o', 0, 
6c60: 27 75 27 2c 20 30 2c 20 27 74 27 2c 20 30 2c 20  'u', 0, 't', 0, 
6c70: 27 69 27 2c 20 30 2c 20 27 6e 27 2c 20 30 2c 20  'i', 0, 'n', 0, 
6c80: 27 65 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20  'e', 0, ' ', .  
6c90: 20 20 30 2c 20 27 63 27 2c 20 30 2c 20 27 61 27    0, 'c', 0, 'a'
6ca0: 2c 20 30 2c 20 27 6c 27 2c 20 30 2c 20 27 6c 27  , 0, 'l', 0, 'l'
6cb0: 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 27 64 27  , 0, 'e', 0, 'd'
6cc0: 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30  , 0, ' ', .    0
6cd0: 2c 20 27 6f 27 2c 20 30 2c 20 27 75 27 2c 20 30  , 'o', 0, 'u', 0
6ce0: 2c 20 27 74 27 2c 20 30 2c 20 27 20 27 2c 20 0a  , 't', 0, ' ', .
6cf0: 20 20 20 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27      0, 'o', 0, '
6d00: 66 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20 20  f', 0, ' ', .   
6d10: 20 30 2c 20 27 73 27 2c 20 30 2c 20 27 65 27 2c   0, 's', 0, 'e',
6d20: 20 30 2c 20 27 71 27 2c 20 30 2c 20 27 75 27 2c   0, 'q', 0, 'u',
6d30: 20 30 2c 20 27 65 27 2c 20 30 2c 20 27 6e 27 2c   0, 'e', 0, 'n',
6d40: 20 30 2c 20 27 63 27 2c 20 30 2c 20 27 65 27 2c   0, 'c', 0, 'e',
6d50: 20 30 2c 20 30 2c 20 30 0a 20 20 7d 3b 0a 0a 20   0, 0, 0.  };.. 
6d60: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a   const void *z;.
6d70: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
6d80: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
6d90: 28 26 6f 75 74 4f 66 4d 65 6d 42 65 5b 53 51 4c  (&outOfMemBe[SQL
6da0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3d  ITE_UTF16NATIVE=
6db0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3f  =SQLITE_UTF16LE?
6dc0: 31 3a 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  1:0]);.  }.  if(
6dd0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
6de0: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
6df0: 20 7c 7c 20 64 62 2d 3e 65 72 72 43 6f 64 65 3d   || db->errCode=
6e00: 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 29  =SQLITE_MISUSE )
6e10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
6e20: 69 64 20 2a 29 28 26 6d 69 73 75 73 65 42 65 5b  id *)(&misuseBe[
6e30: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
6e40: 56 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  VE==SQLITE_UTF16
6e50: 4c 45 3f 31 3a 30 5d 29 3b 0a 20 20 7d 0a 20 20  LE?1:0]);.  }.  
6e60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6e70: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6e80: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
6e90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6ea0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
6eb0: 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
6ec0: 72 72 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  rr);.  if( z==0 
6ed0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  ){.    sqlite3Va
6ee0: 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
6ef0: 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 45  rr, -1, sqlite3E
6f00: 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64  rrStr(db->errCod
6f10: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  e),.         SQL
6f20: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
6f30: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 20  _STATIC);.    z 
6f40: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6f50: 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
6f60: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 20 6d 61 6c  ;.  }.  /* A mal
6f70: 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66  loc() may have f
6f80: 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65  ailed within the
6f90: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
6fa0: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a  _value_text16().
6fb0: 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74    ** above. If t
6fc0: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
6fd0: 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61   then the db->ma
6fe0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
6ff0: 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 62 65  needs to.  ** be
7000: 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
7010: 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68  returning. Do th
7020: 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  is directly, ins
7030: 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 2a 2a  tead of via.  **
7040: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
7050: 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74  ), to avoid sett
7060: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
7070: 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65   handle error me
7080: 73 73 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 64 62  ssage..  */.  db
7090: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
70a0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
70b0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
70c0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
70d0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
70e0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
70f0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
7100: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
7110: 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65   error code gene
7120: 72 61 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69  rated by an SQLi
7130: 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e  te routine. If N
7140: 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64  ULL is.** passed
7150: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
7160: 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d  n, we assume a m
7170: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64  alloc() failed d
7180: 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70  uring sqlite3_op
7190: 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  en()..*/.int sql
71a0: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c  ite3_errcode(sql
71b0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
71c0: 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53   db && !sqlite3S
71d0: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
71e0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
71f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
7200: 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  SE;.  }.  if( !d
7210: 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
7220: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
7230: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
7240: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
7250: 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d  b->errCode & db-
7260: 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a  >errMask;.}../*.
7270: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
7280: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
7290: 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  on for database 
72a0: 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20  "db".  The name 
72b0: 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20  is zName.** and 
72c0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  the encoding is 
72d0: 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  enc..*/.static i
72e0: 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  nt createCollati
72f0: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
7300: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
7310: 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
7320: 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
7330: 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
7340: 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
7350: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
7360: 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
7370: 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
7380: 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ).){.  CollSeq *
7390: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63  pColl;.  int enc
73a0: 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  2;.  .  assert( 
73b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
73c0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
73d0: 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  ..  /* If SQLITE
73e0: 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
73f0: 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
7400: 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
7410: 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
7420: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
7430: 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
7440: 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
7450: 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
7460: 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
7470: 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
7480: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
7490: 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e  nally..  */.  en
74a0: 63 32 20 3d 20 65 6e 63 20 26 20 7e 53 51 4c 49  c2 = enc & ~SQLI
74b0: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
74c0: 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51  ;.  if( enc2==SQ
74d0: 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20  LITE_UTF16 ){.  
74e0: 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f    enc2 = SQLITE_
74f0: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
7500: 0a 0a 20 20 69 66 28 20 28 65 6e 63 32 26 7e 33  ..  if( (enc2&~3
7510: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
7520: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
7530: 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e  ITE_ERROR, "unkn
7540: 6f 77 6e 20 65 6e 63 6f 64 69 6e 67 22 29 3b 0a  own encoding");.
7550: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7560: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
7570: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
7580: 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e   call is removin
7590: 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61  g or replacing a
75a0: 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61  n existing colla
75b0: 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65  tion .  ** seque
75c0: 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20  nce. If so, and 
75d0: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
75e0: 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73   VMs, return bus
75f0: 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a  y. If there.  **
7600: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
7610: 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  Ms, invalidate a
7620: 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ny pre-compiled 
7630: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
7640: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
7650: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
7660: 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
7670: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
7680: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 0);.  if( pCol
7690: 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l && pColl->xCmp
76a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
76b0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b  activeVdbeCnt ){
76c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
76d0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  ror(db, SQLITE_B
76e0: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 55  USY, .        "U
76f0: 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
7700: 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e  modify collation
7710: 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f   sequence due to
7720: 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
7730: 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ts");.      retu
7740: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
7750: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7760: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
7770: 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a  tatements(db);..
7780: 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74      /* If collat
7790: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ion sequence pCo
77a0: 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64  ll was created d
77b0: 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c  irectly by a cal
77c0: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
77d0: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
77e0: 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65  tion, and not ge
77f0: 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68  nerated by synth
7800: 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a  CollSeq(),.    *
7810: 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65  * then any copie
7820: 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43  s made by synthC
7830: 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f  ollSeq() need to
7840: 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e   be invalidated.
7850: 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f  .    ** Also, co
7860: 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74  llation destruct
7870: 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65  or - CollSeq.xDe
7880: 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d  l() - function m
7890: 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  ay need.    ** t
78a0: 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20  o be called..   
78b0: 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43   */ .    if( (pC
78c0: 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49  oll->enc & ~SQLI
78d0: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
78e0: 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20  )==enc2 ){.     
78f0: 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20   CollSeq *aColl 
7900: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
7910: 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
7920: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
7930: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 69 6e  Name));.      in
7940: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
7950: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
7960: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
7970: 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
7980: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
7990: 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
79a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
79b0: 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
79c0: 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
79d0: 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
79e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
79f0: 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
7a00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7a10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
7a20: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
7a30: 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
7a40: 63 32 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  c2, zName, strle
7a50: 6e 28 7a 4e 61 6d 65 29 2c 20 31 29 3b 0a 20 20  n(zName), 1);.  
7a60: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
7a70: 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78   pColl->xCmp = x
7a80: 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 70 43 6f  Compare;.    pCo
7a90: 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78  ll->pUser = pCtx
7aa0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 78 44 65  ;.    pColl->xDe
7ab0: 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 20 20 70 43  l = xDel;.    pC
7ac0: 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 65 6e 63 32 20  oll->enc = enc2 
7ad0: 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f  | (enc & SQLITE_
7ae0: 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3b 0a  UTF16_ALIGNED);.
7af0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
7b00: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
7b10: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 0);.  return S
7b20: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
7b30: 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20 64  .** This array d
7b40: 65 66 69 6e 65 73 20 68 61 72 64 20 75 70 70 65  efines hard uppe
7b50: 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69  r bounds on limi
7b60: 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a  t values.  The.*
7b70: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75  * initializer mu
7b80: 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79  st be kept in sy
7b90: 6e 63 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  nc with the SQLI
7ba0: 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64  TE_LIMIT_*.** #d
7bb0: 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65  efines in sqlite
7bc0: 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  3.h..*/.static c
7bd0: 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69  onst int aHardLi
7be0: 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49  mit[] = {.  SQLI
7bf0: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20  TE_MAX_LENGTH,. 
7c00: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
7c10: 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
7c20: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53  _MAX_COLUMN,.  S
7c30: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
7c40: 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  EPTH,.  SQLITE_M
7c50: 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
7c60: 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  CT,.  SQLITE_MAX
7c70: 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49  _VDBE_OP,.  SQLI
7c80: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
7c90: 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  ARG,.  SQLITE_MA
7ca0: 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51  X_ATTACHED,.  SQ
7cb0: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
7cc0: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20  TTERN_LENGTH,.  
7cd0: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
7ce0: 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 7d 3b 0a 0a  BLE_NUMBER,.};..
7cf0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
7d00: 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20  the hard limits 
7d10: 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f  are set to reaso
7d20: 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a  nable values.*/.
7d30: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
7d40: 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f  ENGTH<100.# erro
7d50: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  r SQLITE_MAX_LEN
7d60: 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
7d70: 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
7d80: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
7d90: 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  QL_LENGTH<100.# 
7da0: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
7db0: 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
7dc0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
7dd0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
7de0: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
7df0: 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  H>SQLITE_MAX_LEN
7e00: 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  GTH.# error SQLI
7e10: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
7e20: 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72  H must not be gr
7e30: 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54  eater than SQLIT
7e40: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e  E_MAX_LENGTH.#en
7e50: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
7e60: 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
7e70: 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c  CT<2.# error SQL
7e80: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
7e90: 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  _SELECT must be 
7ea0: 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69  at least 2.#endi
7eb0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
7ec0: 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72  _VDBE_OP<40.# er
7ed0: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ror SQLITE_MAX_V
7ee0: 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61  DBE_OP must be a
7ef0: 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69  t least 40.#endi
7f00: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
7f10: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20  _FUNCTION_ARG<0 
7f20: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  || SQLITE_MAX_FU
7f30: 4e 43 54 49 4f 4e 5f 41 52 47 3e 32 35 35 0a 23  NCTION_ARG>255.#
7f40: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
7f50: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d  X_FUNCTION_ARG m
7f60: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
7f70: 20 61 6e 64 20 32 35 35 0a 23 65 6e 64 69 66 0a   and 255.#endif.
7f80: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  #if SQLITE_MAX_A
7f90: 54 54 41 43 48 3c 30 20 7c 7c 20 53 51 4c 49 54  TTACH<0 || SQLIT
7fa0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 3e 33 30 0a  E_MAX_ATTACH>30.
7fb0: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
7fc0: 41 58 5f 41 54 54 41 43 48 20 6d 75 73 74 20 62  AX_ATTACH must b
7fd0: 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
7fe0: 33 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  30.#endif.#if SQ
7ff0: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
8000: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23  TTERN_LENGTH<1.#
8010: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
8020: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
8030: 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
8040: 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
8050: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  #if SQLITE_MAX_V
8060: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 3c 31  ARIABLE_NUMBER<1
8070: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
8080: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
8090: 42 45 52 20 6d 75 73 74 20 62 65 20 61 74 20 6c  BER must be at l
80a0: 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a 0a  east 1.#endif...
80b0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
80c0: 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69   value of a limi
80d0: 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f  t.  Report the o
80e0: 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20  ld value..** If 
80f0: 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74  an invalid limit
8100: 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69   index is suppli
8110: 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a  ed, report -1..*
8120: 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
8130: 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f  s but still repo
8140: 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
8150: 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c   if the.** new l
8160: 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
8170: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f  ..**.** A new lo
8180: 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e  wer limit does n
8190: 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69  ot shrink existi
81a0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a  ng constructs..*
81b0: 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76  * It merely prev
81c0: 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75  ents new constru
81d0: 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20  cts that exceed 
81e0: 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f  the limit.** fro
81f0: 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e  m forming..*/.in
8200: 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  t sqlite3_limit(
8210: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
8220: 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65   limitId, int ne
8230: 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f  wLimit){.  int o
8240: 6c 64 4c 69 6d 69 74 3b 0a 20 20 69 66 28 20 6c  ldLimit;.  if( l
8250: 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69  imitId<0 || limi
8260: 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49  tId>=SQLITE_N_LI
8270: 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MIT ){.    retur
8280: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c  n -1;.  }.  oldL
8290: 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  imit = db->aLimi
82a0: 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66  t[limitId];.  if
82b0: 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b  ( newLimit>=0 ){
82c0: 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
82d0: 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
82e0: 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
82f0: 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
8300: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20  imit[limitId];. 
8310: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69     }.    db->aLi
8320: 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e  mit[limitId] = n
8330: 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  ewLimit;.  }.  r
8340: 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 0a  eturn oldLimit;.
8350: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8360: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
8370: 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
8380: 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
8390: 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
83a0: 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
83b0: 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
83c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
83d0: 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
83e0: 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
83f0: 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
8400: 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
8410: 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
8420: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
8430: 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
8440: 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
8450: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
8460: 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
8470: 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
8480: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
8490: 20 20 75 6e 73 69 67 6e 65 64 20 66 6c 61 67 73    unsigned flags
84a0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72  ,        /* Oper
84b0: 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
84c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
84d0: 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
84e0: 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
84f0: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
8500: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
8510: 63 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  c;.  CollSeq *pC
8520: 6f 6c 6c 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  oll;..#ifndef SQ
8530: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
8540: 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
8550: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
8560: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
8570: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  n rc;.#endif..  
8580: 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75  /* Remove harmfu
8590: 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20  l bits from the 
85a0: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
85b0: 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e  */.  flags &=  ~
85c0: 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  ( SQLITE_OPEN_DE
85d0: 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
85f0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
8600: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
8610: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
8620: 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  MP_DB | .       
8630: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
8640: 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
8650: 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
8660: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
8670: 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  AIN_JOURNAL | . 
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
8690: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
86a0: 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
86b0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
86c0: 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
86d0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
86e0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
86f0: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20  STER_JOURNAL.   
8700: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20            );..  
8710: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
8720: 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75  sqlite data stru
8730: 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20  cture */.  db = 
8740: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
8750: 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  o( sizeof(sqlite
8760: 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d  3) );.  if( db==
8770: 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f  0 ) goto opendb_
8780: 6f 75 74 3b 0a 20 20 64 62 2d 3e 6d 75 74 65 78  out;.  db->mutex
8790: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
87a0: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
87b0: 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
87c0: 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d    if( db->mutex=
87d0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
87e0: 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20  3_free(db);.    
87f0: 64 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  db = 0;.    goto
8800: 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
8810: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8820: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8830: 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
8840: 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 70   = 0xff;.  db->p
8850: 72 69 6f 72 4e 65 77 52 6f 77 69 64 20 3d 20 30  riorNewRowid = 0
8860: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b  ;.  db->nDb = 2;
8870: 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
8880: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
8890: 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62  ;.  db->aDb = db
88a0: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 61  ->aDbStatic;.  a
88b0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62  ssert( sizeof(db
88c0: 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f  ->aLimit)==sizeo
88d0: 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b  f(aHardLimit) );
88e0: 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c  .  memcpy(db->aL
88f0: 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74  imit, aHardLimit
8900: 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  , sizeof(db->aLi
8910: 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74  mit));.  db->aut
8920: 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64  oCommit = 1;.  d
8930: 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d  b->nextAutovac =
8940: 20 2d 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50   -1;.  db->nextP
8950: 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64  agesize = 0;.  d
8960: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
8970: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
8980: 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
8990: 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c  ULT_FILE_FORMAT<
89a0: 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4.              
89b0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61     | SQLITE_Lega
89c0: 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66  cyFileFmt.#endif
89d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
89e0: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
89f0: 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20  SION.           
8a00: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c        | SQLITE_L
8a10: 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e  oadExtension.#en
8a20: 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71  dif.      ;.  sq
8a30: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
8a40: 62 2d 3e 61 46 75 6e 63 2c 20 53 51 4c 49 54 45  b->aFunc, SQLITE
8a50: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
8a60: 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  ;.  sqlite3HashI
8a70: 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  nit(&db->aCollSe
8a80: 71 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  q, SQLITE_HASH_S
8a90: 54 52 49 4e 47 2c 20 30 29 3b 0a 23 69 66 6e 64  TRING, 0);.#ifnd
8aa0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
8ab0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
8ac0: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
8ad0: 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 53 51 4c 49  b->aModule, SQLI
8ae0: 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  TE_HASH_STRING, 
8af0: 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  0);.#endif..  db
8b00: 2d 3e 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33  ->pVfs = sqlite3
8b10: 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
8b20: 0a 20 20 69 66 28 20 21 64 62 2d 3e 70 56 66 73  .  if( !db->pVfs
8b30: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
8b40: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 64  ITE_ERROR;.    d
8b50: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
8b60: 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20  E_MAGIC_SICK;.  
8b70: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
8b80: 62 2c 20 72 63 2c 20 22 6e 6f 20 73 75 63 68 20  b, rc, "no such 
8b90: 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b  vfs: %s", zVfs);
8ba0: 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
8bb0: 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
8bc0: 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20  Add the default 
8bd0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8be0: 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52  ce BINARY. BINAR
8bf0: 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68  Y works for both
8c00: 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20   UTF-8.  ** and 
8c10: 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61  UTF-16, so add a
8c20: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63   version for eac
8c30: 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75  h to avoid any u
8c40: 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20  nnecessary.  ** 
8c50: 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65  conversions. The
8c60: 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74   only error that
8c70: 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20   can occur here 
8c80: 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  is a malloc() fa
8c90: 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72  ilure..  */.  cr
8ca0: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
8cb0: 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
8cc0: 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43  TE_UTF8, 0, binC
8cd0: 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
8ce0: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
8cf0: 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
8d00: 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20  ITE_UTF16BE, 0, 
8d10: 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
8d20: 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
8d30: 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
8d40: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
8d50: 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
8d60: 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
8d70: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49  lation(db, "RTRI
8d80: 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  M", SQLITE_UTF8,
8d90: 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f   (void*)1, binCo
8da0: 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66  llFunc, 0);.  if
8db0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
8dc0: 65 64 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  ed ){.    db->ma
8dd0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
8de0: 49 43 5f 53 49 43 4b 3b 0a 20 20 20 20 67 6f 74  IC_SICK;.    got
8df0: 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
8e00: 7d 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  }.  db->pDfltCol
8e10: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
8e20: 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54  ollSeq(db, SQLIT
8e30: 45 5f 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22  E_UTF8, "BINARY"
8e40: 2c 20 36 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  , 6, 0);.  asser
8e50: 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  t( db->pDfltColl
8e60: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  !=0 );..  /* Als
8e70: 6f 20 61 64 64 20 61 20 55 54 46 2d 38 20 63 61  o add a UTF-8 ca
8e80: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63  se-insensitive c
8e90: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
8ea0: 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  e. */.  createCo
8eb0: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43  llation(db, "NOC
8ec0: 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ASE", SQLITE_UTF
8ed0: 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c  8, 0, nocaseColl
8ee0: 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a  atingFunc, 0);..
8ef0: 20 20 2f 2a 20 53 65 74 20 66 6c 61 67 73 20 6f    /* Set flags o
8f00: 6e 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63  n the built-in c
8f10: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
8f20: 65 73 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c  es */.  db->pDfl
8f30: 74 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 53 51  tColl->type = SQ
8f40: 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59  LITE_COLL_BINARY
8f50: 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  pColl = sqli
8f60: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
8f70: 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
8f80: 22 4e 4f 43 41 53 45 22 2c 20 36 2c 20 30 29 3b  "NOCASE", 6, 0);
8f90: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a  .  if( pColl ){.
8fa0: 20 20 20 20 70 43 6f 6c 6c 2d 3e 74 79 70 65 20      pColl->type 
8fb0: 3d 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f  = SQLITE_COLL_NO
8fc0: 43 41 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  CASE;.  }..  /* 
8fd0: 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64  Open the backend
8fe0: 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72   database driver
8ff0: 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
9000: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72  ags = flags;.  r
9010: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
9020: 46 61 63 74 6f 72 79 28 64 62 2c 20 7a 46 69 6c  Factory(db, zFil
9030: 65 6e 61 6d 65 2c 20 30 2c 20 53 51 4c 49 54 45  ename, 0, SQLITE
9040: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
9050: 49 5a 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  IZE, .          
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f   flags | SQLITE_
9080: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 2c 0a 20 20  OPEN_MAIN_DB,.  
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44           &db->aD
90b0: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28  b[0].pBt);.  if(
90c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
90d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
90e0: 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20  or(db, rc, 0);. 
90f0: 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
9100: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b  QLITE_MAGIC_SICK
9110: 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
9120: 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
9130: 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
9140: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
9150: 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30  et(db, db->aDb[0
9160: 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44  ].pBt);.  db->aD
9170: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[1].pSchema = s
9180: 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
9190: 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54  db, 0);...  /* T
91a0: 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74  he default safet
91b0: 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20  y_level for the 
91c0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
91d0: 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65   'full'; for the
91e0: 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62   temp.  ** datab
91f0: 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27  ase it is 'NONE'
9200: 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  . This matches t
9210: 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64  he pager layer d
9220: 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a  efaults.  .  */.
9230: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61    db->aDb[0].zNa
9240: 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64  me = "main";.  d
9250: 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79  b->aDb[0].safety
9260: 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 23 69 66 6e  _level = 3;.#ifn
9270: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9280: 54 45 4d 50 44 42 0a 20 20 64 62 2d 3e 61 44 62  TEMPDB.  db->aDb
9290: 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d  [1].zName = "tem
92a0: 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
92b0: 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
92c0: 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d  1;.#endif..  db-
92d0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
92e0: 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66  MAGIC_OPEN;.  if
92f0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
9300: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
9310: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
9320: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
9330: 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  l built-in funct
9340: 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74  ions, but do not
9350: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
9360: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
9370: 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54  se schema yet. T
9380: 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  his is delayed u
9390: 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
93a0: 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
93b0: 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65  .  ** is accesse
93c0: 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
93d0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
93e0: 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
93f0: 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74  te3RegisterBuilt
9400: 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
9410: 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f  ..  /* Load auto
9420: 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73  matic extensions
9430: 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68   - extensions th
9440: 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67  at have been reg
9450: 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69  istered.  ** usi
9460: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61  ng the sqlite3_a
9470: 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69  utomatic_extensi
9480: 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20  on() API..  */. 
9490: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 41 75   (void)sqlite3Au
94a0: 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73  toLoadExtensions
94b0: 28 64 62 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  (db);.  if( sqli
94c0: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 21  te3_errcode(db)!
94d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
94e0: 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
94f0: 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  t;.  }..#ifdef S
9500: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
9510: 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  1.  if( !db->mal
9520: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9530: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
9540: 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69  te3Fts1Init(sqli
9550: 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
9560: 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
9570: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
9580: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
9590: 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28  NABLE_FTS2.  if(
95a0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
95b0: 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
95c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72  _OK ){.    exter
95d0: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  n int sqlite3Fts
95e0: 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b  2Init(sqlite3*);
95f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9600: 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts2Init(db);. 
9610: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
9620: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9630: 46 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS3.  if( !db->
9640: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
9650: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9660: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9670: 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts3Init(db);. 
9680: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
9690: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
96a0: 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  ICU.  if( !db->m
96b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
96c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
96d0: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
96e0: 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 73 71  qlite3IcuInit(sq
96f0: 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
9700: 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74  = sqlite3IcuInit
9710: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
9720: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9730: 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69  ENABLE_RTREE.  i
9740: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
9750: 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
9760: 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
9770: 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69   sqlite3RtreeIni
9780: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
9790: 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  f..  sqlite3Erro
97a0: 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20  r(db, rc, 0);.. 
97b0: 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46   /* -DSQLITE_DEF
97c0: 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
97d0: 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53  E=1 makes EXCLUS
97e0: 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74 20  IVE the default 
97f0: 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
9800: 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46  e.  -DSQLITE_DEF
9810: 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
9820: 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20  E=0 make NORMAL 
9830: 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
9840: 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
9850: 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74  Doing nothing at
9860: 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20   all also makes 
9870: 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
9880: 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  lt..  */.#ifdef 
9890: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
98a0: 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62  OCKING_MODE.  db
98b0: 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d  ->dfltLockMode =
98c0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
98d0: 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20  LOCKING_MODE;.  
98e0: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
98f0: 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42  ingMode(sqlite3B
9900: 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44  treePager(db->aD
9910: 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20  b[0].pBt),.     
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9930: 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
9940: 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
9950: 29 3b 0a 23 65 6e 64 69 66 0a 0a 6f 70 65 6e 64  );.#endif..opend
9960: 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20  b_out:.  if( db 
9970: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
9980: 62 2d 3e 6d 75 74 65 78 21 3d 30 20 29 3b 0a 20  b->mutex!=0 );. 
9990: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
99a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
99b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  );.  }.  if( SQL
99c0: 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 28 72 63 20 3d  ITE_NOMEM==(rc =
99d0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
99e0: 28 64 62 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  (db)) ){.    sql
99f0: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
9a00: 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 0a      db = 0;.  }.
9a10: 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 20 20    *ppDb = db;.  
9a20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70  return sqlite3Ap
9a30: 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a  iExit(0, rc);.}.
9a40: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
9a50: 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  w database handl
9a60: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
9a70: 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  3_open(.  const 
9a80: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
9a90: 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
9aa0: 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Db .){.  return 
9ab0: 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
9ac0: 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20  lename, ppDb,.  
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
9af0: 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
9b00: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
9b10: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
9b20: 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e  3_open_v2(.  con
9b30: 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  st char *filenam
9b40: 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  e,   /* Database
9b50: 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38   filename (UTF-8
9b60: 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  ) */.  sqlite3 *
9b70: 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f  *ppDb,         /
9b80: 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62  * OUT: SQLite db
9b90: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
9ba0: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
9bb0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f       /* Flags */
9bc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9bd0: 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  Vfs        /* Na
9be0: 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65  me of VFS module
9bf0: 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
9c00: 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
9c10: 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70  ase(filename, pp
9c20: 44 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29  Db, flags, zVfs)
9c30: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
9c40: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
9c50: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
9c60: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
9c70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
9c80: 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20  open16(.  const 
9c90: 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  void *zFilename,
9ca0: 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
9cb0: 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  Db.){.  char con
9cc0: 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20  st *zFilename8; 
9cd0: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65    /* zFilename e
9ce0: 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20  ncoded in UTF-8 
9cf0: 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31  instead of UTF-1
9d00: 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  6 */.  sqlite3_v
9d10: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
9d20: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
9d30: 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20   zFilename );.  
9d40: 61 73 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a  assert( ppDb );.
9d50: 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
9d60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9d70: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
9d80: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
9d90: 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
9da0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
9db0: 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  dif.  pVal = sql
9dc0: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
9dd0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
9de0: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
9df0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54  zFilename, SQLIT
9e00: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53  E_UTF16NATIVE, S
9e10: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
9e20: 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71   zFilename8 = sq
9e30: 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
9e40: 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Val, SQLITE_UTF8
9e50: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
9e60: 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
9e70: 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
9e80: 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20  lename8, ppDb,. 
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ea0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
9eb0: 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
9ec0: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
9ed0: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
9ee0: 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51   *ppDb || rc==SQ
9ef0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
9f00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9f10: 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f  _OK && !DbHasPro
9f20: 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20  perty(*ppDb, 0, 
9f30: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
9f40: 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70   ){.      ENC(*p
9f50: 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
9f60: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
9f70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
9f80: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
9f90: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61  .  }.  sqlite3Va
9fa0: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
9fb0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
9fc0: 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
9fd0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9fe0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
9ff0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
a000: 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
a010: 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
a020: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
a030: 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
a040: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
a050: 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
a060: 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
a070: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
a080: 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
a090: 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
a0a0: 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
a0b0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
a0c0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
a0d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
a0e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
a0f0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
a100: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
a110: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
a120: 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
a130: 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
a140: 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
a150: 61 72 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20  are, 0);.  rc = 
a160: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
a170: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
a180: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
a190: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
a1a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a1b0: 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
a1c0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
a1d0: 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
a1e0: 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
a1f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
a200: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
a210: 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  2(.  sqlite3* db
a220: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
a230: 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
a240: 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
a250: 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
a260: 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
a270: 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
a280: 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
a290: 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
a2a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
a2b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
a2c0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
a2d0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
a2e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
a2f0: 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
a300: 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ation(db, zName,
a310: 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d   enc, pCtx, xCom
a320: 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72  pare, xDel);.  r
a330: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
a340: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
a350: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
a360: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
a370: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
a380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a390: 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
a3a0: 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
a3b0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
a3c0: 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
a3d0: 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
a3e0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
a3f0: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a  te_collation16(.
a400: 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
a410: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
a420: 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
a430: 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
a440: 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
a450: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
a460: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
a470: 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
a480: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a490: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b  .  char *zName8;
a4a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a4b0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
a4c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
a4d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a4e0: 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c  ;.  zName8 = sql
a4f0: 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
a500: 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 69   zName, -1);.  i
a510: 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20  f( zName8 ){.   
a520: 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
a530: 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38  ation(db, zName8
a540: 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  , enc, pCtx, xCo
a550: 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73  mpare, 0);.    s
a560: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
a570: 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  e8);.  }.  rc = 
a580: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
a590: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
a5a0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
a5b0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
a5c0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
a5d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
a5e0: 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
a5f0: 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
a600: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
a610: 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
a620: 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
a630: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
a640: 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
a650: 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
a660: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
a670: 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
a680: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
a690: 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71  ion_needed(.  sq
a6a0: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
a6b0: 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
a6c0: 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
a6d0: 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c  llNeeded)(void*,
a6e0: 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
a6f0: 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72  xtRep,const char
a700: 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *).){.  sqlite3_
a710: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
a720: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43  mutex);.  db->xC
a730: 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c  ollNeeded = xCol
a740: 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78  lNeeded;.  db->x
a750: 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30  CollNeeded16 = 0
a760: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ;.  db->pCollNee
a770: 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65  dedArg = pCollNe
a780: 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74  ededArg;.  sqlit
a790: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
a7a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
a7b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a7c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a7d0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
a7e0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c  * Register a col
a7f0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
a800: 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b  factory callback
a810: 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
a820: 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
a830: 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65   Replace any pre
a840: 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65  viously installe
a850: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
a860: 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f  ence factory..*/
a870: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .int sqlite3_col
a880: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28  lation_needed16(
a890: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
a8a0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
a8b0: 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
a8c0: 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29  (*xCollNeeded16)
a8d0: 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c  (void*,sqlite3*,
a8e0: 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e  int eTextRep,con
a8f0: 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73  st void*).){.  s
a900: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
a910: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
a920: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
a930: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c   = 0;.  db->xCol
a940: 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c  lNeeded16 = xCol
a950: 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d  lNeeded16;.  db-
a960: 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
a970: 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
a980: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a990: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
a9a0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
a9b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
a9c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a9d0: 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65  UTF16 */..#ifnde
a9e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c  f SQLITE_OMIT_GL
a9f0: 4f 42 41 4c 52 45 43 4f 56 45 52 0a 2f 2a 0a 2a  OBALRECOVER./*.*
aa00: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
aa10: 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72  is now an anachr
aa20: 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74  onism. It used t
aa30: 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63  o be used to rec
aa40: 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d  over from a.** m
aa50: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c  alloc() failure,
aa60: 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20   but SQLite now 
aa70: 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61  does this automa
aa80: 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  tically..*/.int 
aa90: 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
aaa0: 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20  ecover(void){.  
aab0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
aac0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
aad0: 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68  * Test to see wh
aae0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
aaf0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
ab00: 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63  tion is in autoc
ab10: 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20  ommit.** mode.  
ab20: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
ab30: 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69  t is and FALSE i
ab40: 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d  f not.  Autocomm
ab50: 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a  it mode is on.**
ab60: 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75   by default.  Au
ab70: 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61  tocommit is disa
ab80: 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20  bled by a BEGIN 
ab90: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65  statement and re
aba0: 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68  enabled.** by th
abb0: 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72  e next COMMIT or
abc0: 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a   ROLLBACK..**.**
abd0: 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41 4e  ***** THIS IS AN
abe0: 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41 50   EXPERIMENTAL AP
abf0: 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43 54  I AND IS SUBJECT
ac00: 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a   TO CHANGE *****
ac10: 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
ac20: 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
ac30: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
ac40: 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43  return db->autoC
ac50: 6f 6d 6d 69 74 3b 0a 7d 0a 0a 23 69 66 64 65 66  ommit;.}..#ifdef
ac60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
ac70: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
ac80: 67 20 72 6f 75 74 69 6e 65 20 69 73 20 73 75 62  g routine is sub
ac90: 74 69 74 75 74 65 64 20 66 6f 72 20 63 6f 6e 73  tituted for cons
aca0: 74 61 6e 74 20 53 51 4c 49 54 45 5f 43 4f 52 52  tant SQLITE_CORR
acb0: 55 50 54 20 69 6e 0a 2a 2a 20 64 65 62 75 67 67  UPT in.** debugg
acc0: 69 6e 67 20 62 75 69 6c 64 73 2e 20 20 54 68 69  ing builds.  Thi
acd0: 73 20 70 72 6f 76 69 64 65 73 20 61 20 77 61 79  s provides a way
ace0: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
acf0: 6f 69 6e 74 20 66 6f 72 20 77 68 65 6e 0a 2a 2a  oint for when.**
ad00: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 66   corruption is f
ad10: 69 72 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a  irst detected..*
ad20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72  /.int sqlite3Cor
ad30: 72 75 70 74 28 76 6f 69 64 29 7b 0a 20 20 72 65  rupt(void){.  re
ad40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ad50: 55 50 54 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  UPT;.}.#endif../
ad60: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
ad70: 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69  onvenience routi
ad80: 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ne that makes su
ad90: 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65  re that all thre
ada0: 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64  ad-specific.** d
adb0: 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72  ata for this thr
adc0: 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61  ead has been dea
add0: 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
ade0: 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72  SQLite no longer
adf0: 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65   uses thread-spe
ae00: 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68  cific data so th
ae10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
ae20: 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49  w a.** no-op.  I
ae30: 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f  t is retained fo
ae40: 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d  r historical com
ae50: 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76  patibility..*/.v
ae60: 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65  oid sqlite3_thre
ae70: 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29  ad_cleanup(void)
ae80: 7b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  {.}../*.** Retur
ae90: 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  n meta informati
aea0: 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63 69  on about a speci
aeb0: 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  fic column of a 
aec0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
aed0: 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69  ** See comment i
aee0: 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c  n sqlite3.h (sql
aef0: 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65  ite.h.in) for de
af00: 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  tails..*/.#ifdef
af10: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
af20: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69  OLUMN_METADATA.i
af30: 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  nt sqlite3_table
af40: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
af50: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  /* Connection ha
af80: 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
af90: 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20  char *zDbName,  
afa0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
afb0: 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a  e name or NULL *
afc0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
afd0: 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20  zTableName,     
afe0: 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  /* Table name */
aff0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b000: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f  ColumnName,    /
b010: 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
b020: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
b030: 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f  pzDataType,    /
b040: 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72  * OUTPUT: Declar
b050: 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a  ed data type */.
b060: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
b070: 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a  zCollSeq,     /*
b080: 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69   OUTPUT: Collati
b090: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
b0a0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e   */.  int *pNotN
b0b0: 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
b0c0: 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
b0d0: 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  e if NOT NULL co
b0e0: 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20  nstraint exists 
b0f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61  */.  int *pPrima
b100: 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ryKey,          
b110: 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
b120: 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20   if column part 
b130: 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a  of PK */.  int *
b140: 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20  pAutoinc        
b150: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
b160: 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 73  : True if colums
b170: 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65   is auto-increme
b180: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
b190: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
b1a0: 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20  sg = 0;.  Table 
b1b0: 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c  *pTab = 0;.  Col
b1c0: 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20  umn *pCol = 0;. 
b1d0: 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68   int iCol;..  ch
b1e0: 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54  ar const *zDataT
b1f0: 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
b200: 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20  const *zCollSeq 
b210: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75  = 0;.  int notnu
b220: 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72  ll = 0;.  int pr
b230: 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20  imarykey = 0;.  
b240: 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b  int autoinc = 0;
b250: 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68  ..  /* Ensure th
b260: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
b270: 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65  a has been loade
b280: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  d */.  sqlite3_m
b290: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
b2a0: 75 74 65 78 29 3b 0a 20 20 28 76 6f 69 64 29 73  utex);.  (void)s
b2b0: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64  qlite3SafetyOn(d
b2c0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  b);.  sqlite3Btr
b2d0: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
b2e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
b2f0: 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29  it(db, &zErrMsg)
b300: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
b310: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20  LeaveAll(db);.  
b320: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
b330: 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72  c ){.    goto er
b340: 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
b350: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  /* Locate the ta
b360: 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20  ble in question 
b370: 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  */.  pTab = sqli
b380: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
b390: 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62   zTableName, zDb
b3a0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54  Name);.  if( !pT
b3b0: 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  ab || pTab->pSel
b3c0: 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20  ect ){.    pTab 
b3d0: 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72  = 0;.    goto er
b3e0: 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
b3f0: 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75  /* Find the colu
b400: 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66  mn for which inf
b410: 6f 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a  o is requested *
b420: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  /.  if( sqlite3I
b430: 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61  sRowid(zColumnNa
b440: 6d 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  me) ){.    iCol 
b450: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
b460: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
b470: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26  {.      pCol = &
b480: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
b490: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
b4a0: 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  .    for(iCol=0;
b4b0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
b4c0: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
b4d0: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
b4e0: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[iCol];.     
b4f0: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
b500: 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
b510: 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  me, zColumnName)
b520: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
b530: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
b540: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70  .    if( iCol==p
b550: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
b560: 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
b570: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
b580: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
b590: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
b5a0: 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68   block stores th
b5b0: 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  e meta informati
b5c0: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  on that will be 
b5d0: 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f  returned.  ** to
b5e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c   the caller in l
b5f0: 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a  ocal variables z
b600: 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53  DataType, zCollS
b610: 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69  eq, notnull, pri
b620: 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64  marykey.  ** and
b630: 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69   autoinc. At thi
b640: 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72  s point there ar
b650: 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74  e two possibilit
b660: 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ies:.  ** .  ** 
b670: 20 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69      1. The speci
b680: 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fied column name
b690: 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69   was rowid", "oi
b6a0: 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20  d" or "_rowid_" 
b6b0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64  .  **        and
b6c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70   there is no exp
b6d0: 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
b6e0: 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20   IPK column. .  
b6f0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54  **.  **     2. T
b700: 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  he table is not 
b710: 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63  a view and the c
b720: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74  olumn name ident
b730: 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20  ified an .  **  
b740: 20 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79        explicitly
b750: 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e   declared column
b760: 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f  . Copy meta info
b770: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43  rmation from *pC
b780: 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ol..  */ .  if( 
b790: 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74  pCol ){.    zDat
b7a0: 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54  aType = pCol->zT
b7b0: 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  ype;.    zCollSe
b7c0: 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b  q = pCol->zColl;
b7d0: 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 28  .    notnull = (
b7e0: 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 3f 31 3a  pCol->notNull?1:
b7f0: 30 29 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  0);.    primaryk
b800: 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 69 73 50  ey  = (pCol->isP
b810: 72 69 6d 4b 65 79 3f 31 3a 30 29 3b 0a 20 20 20  rimKey?1:0);.   
b820: 20 61 75 74 6f 69 6e 63 20 3d 20 28 28 70 54 61   autoinc = ((pTa
b830: 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26  b->iPKey==iCol &
b840: 26 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 29  & pTab->autoInc)
b850: 3f 31 3a 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ?1:0);.  }else{.
b860: 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
b870: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70  "INTEGER";.    p
b880: 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20  rimarykey = 1;. 
b890: 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53   }.  if( !zCollS
b8a0: 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53  eq ){.    zCollS
b8b0: 65 71 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  eq = "BINARY";. 
b8c0: 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20   }..error_out:. 
b8d0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
b8e0: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20  fetyOff(db);..  
b8f0: 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20 66  /* Whether the f
b900: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63  unction call suc
b910: 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64  ceeded or failed
b920: 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  , set the output
b930: 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a   parameters.  **
b940: 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68 65   to whatever the
b950: 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72  ir local counter
b960: 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49  parts contain. I
b970: 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f  f an error did o
b980: 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20  ccur,.  ** this 
b990: 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
b9a0: 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75  f zeroing all ou
b9b0: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e  tput parameters.
b9c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61  .  */.  if( pzDa
b9d0: 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61  taType ) *pzData
b9e0: 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65  Type = zDataType
b9f0: 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65  ;.  if( pzCollSe
ba00: 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d  q ) *pzCollSeq =
ba10: 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28   zCollSeq;.  if(
ba20: 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f   pNotNull ) *pNo
ba30: 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b  tNull = notnull;
ba40: 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b  .  if( pPrimaryK
ba50: 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65  ey ) *pPrimaryKe
ba60: 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  y = primarykey;.
ba70: 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29    if( pAutoinc )
ba80: 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74   *pAutoinc = aut
ba90: 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c  oinc;..  if( SQL
baa0: 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70  ITE_OK==rc && !p
bab0: 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
bac0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 45 72  e3SetString(&zEr
bad0: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74  rMsg, "no such t
bae0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 22 2c 20  able column: ", 
baf0: 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 22 2e 22 2c  zTableName, ".",
bb00: 20 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d   .        zColum
bb10: 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 72  nName, 0);.    r
bb20: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
bb30: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
bb40: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45  rror(db, rc, (zE
bb50: 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a  rrMsg?"%s":0), z
bb60: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
bb70: 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
bb80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
bb90: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
bba0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
bbb0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
bbc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
bbd0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
bbe0: 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
bbf0: 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
bc00: 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
bc10: 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69  time slept..*/.i
bc20: 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70  nt sqlite3_sleep
bc30: 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69  (int ms){.  sqli
bc40: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
bc50: 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20   int rc;.  pVfs 
bc60: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
bc70: 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66  nd(0);.  if( pVf
bc80: 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  s==0 ) return 0;
bc90: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
bca0: 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69  tion works in mi
bcb0: 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20  lliseconds, but 
bcc0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f  the underlying O
bcd0: 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41  sSleep() .  ** A
bce0: 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63  PI uses microsec
bcf0: 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20  onds. Hence the 
bd00: 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72  1000's..  */.  r
bd10: 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c  c = (sqlite3OsSl
bd20: 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d  eep(pVfs, 1000*m
bd30: 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75  s)/1000);.  retu
bd40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bd50: 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
bd60: 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  e the extended r
bd70: 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a  esult codes..*/.
bd80: 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
bd90: 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
bda0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
bdb0: 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c  nt onoff){.  sql
bdc0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
bdd0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
bde0: 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f  b->errMask = ono
bdf0: 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  ff ? 0xffffffff 
be00: 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65  : 0xff;.  sqlite
be10: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
be20: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
be30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
be40: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
be50: 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d  e xFileControl m
be60: 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69  ethod on a parti
be70: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a  cular database..
be80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  */.int sqlite3_f
be90: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69  ile_control(sqli
bea0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
beb0: 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e  har *zDbName, in
bec0: 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
bed0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
bee0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e  LITE_ERROR;.  in
bef0: 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
bf00: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
bf10: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
bf20: 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  DbName==0 ){.   
bf30: 20 69 44 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   iDb = 0;.  }els
bf40: 65 7b 0a 20 20 20 20 66 6f 72 28 69 44 62 3d 30  e{.    for(iDb=0
bf50: 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
bf60: 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Db++){.      if(
bf70: 20 73 74 72 63 6d 70 28 64 62 2d 3e 61 44 62 5b   strcmp(db->aDb[
bf80: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 4e  iDb].zName, zDbN
bf90: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
bfa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
bfb0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 7b 0a   iDb<db->nDb ){.
bfc0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 72 65      Btree *pBtre
bfd0: 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  e = db->aDb[iDb]
bfe0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
bff0: 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20 50 61  tree ){.      Pa
c000: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
c010: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
c020: 2a 66 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  *fd;.      sqlit
c030: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
c040: 72 65 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ree);.      pPag
c050: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
c060: 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a  ePager(pBtree);.
c070: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c080: 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  ager!=0 );.     
c090: 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67   fd = sqlite3Pag
c0a0: 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  erFile(pPager);.
c0b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 64        assert( fd
c0c0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
c0d0: 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b   fd->pMethods ){
c0e0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
c0f0: 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
c100: 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29  ol(fd, op, pArg)
c110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c120: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
c130: 65 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 7d  e(pBtree);.    }
c140: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
c150: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
c160: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
c170: 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rc;   .}../*.** 
c180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65  Interface to the
c190: 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a   testing logic..
c1a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
c1b0: 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20  est_control(int 
c1c0: 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20  op, ...){.  int 
c1d0: 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  rc = 0;.#ifndef 
c1e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
c1f0: 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69  TIN_TEST.  va_li
c200: 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
c210: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
c220: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 2f  tch( op ){.    /
c230: 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  *.    ** sqlite3
c240: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41  _test_control(FA
c250: 55 4c 54 5f 43 4f 4e 46 49 47 2c 20 66 61 75 6c  ULT_CONFIG, faul
c260: 74 5f 69 64 2c 20 6e 44 65 6c 61 79 2c 20 6e 52  t_id, nDelay, nR
c270: 65 70 65 61 74 29 0a 20 20 20 20 2a 2a 0a 20 20  epeat).    **.  
c280: 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61    ** Configure a
c290: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 6f 72 2e   fault injector.
c2a0: 20 20 54 68 65 20 73 70 65 63 69 66 69 63 20 66    The specific f
c2b0: 61 75 6c 74 20 69 6e 6a 65 63 74 6f 72 20 69 73  ault injector is
c2c0: 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 66 69  .    ** identifi
c2d0: 65 64 20 62 79 20 74 68 65 20 66 61 75 6c 74 5f  ed by the fault_
c2e0: 69 64 20 61 72 67 75 6d 65 6e 74 2e 20 20 28 65  id argument.  (e
c2f0: 78 3a 20 53 51 4c 49 54 45 5f 46 41 55 4c 54 49  x: SQLITE_FAULTI
c300: 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 0a  NJECTOR_MALLOC).
c310: 20 20 20 20 2a 2a 20 54 68 65 20 66 61 75 6c 74      ** The fault
c320: 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 66 74 65   will occur afte
c330: 72 20 61 20 64 65 6c 61 79 20 6f 66 20 6e 44 65  r a delay of nDe
c340: 6c 61 79 20 63 61 6c 6c 73 2e 20 20 54 68 65 20  lay calls.  The 
c350: 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 77 69 6c  fault.    ** wil
c360: 6c 20 72 65 70 65 61 74 20 6e 52 65 70 65 61 74  l repeat nRepeat
c370: 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   times..    */. 
c380: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
c390: 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 43 4f  ESTCTRL_FAULT_CO
c3a0: 4e 46 49 47 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NFIG: {.      in
c3b0: 74 20 69 64 20 3d 20 76 61 5f 61 72 67 28 61 70  t id = va_arg(ap
c3c0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e  , int);.      in
c3d0: 74 20 6e 44 65 6c 61 79 20 3d 20 76 61 5f 61 72  t nDelay = va_ar
c3e0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
c3f0: 20 20 69 6e 74 20 6e 52 65 70 65 61 74 20 3d 20    int nRepeat = 
c400: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
c410: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 61  .      sqlite3Fa
c420: 75 6c 74 43 6f 6e 66 69 67 28 69 64 2c 20 6e 44  ultConfig(id, nD
c430: 65 6c 61 79 2c 20 6e 52 65 70 65 61 74 29 3b 0a  elay, nRepeat);.
c440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c450: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
c460: 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
c470: 6f 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 46 41 49  ontrol(FAULT_FAI
c480: 4c 55 52 45 53 2c 20 66 61 75 6c 74 5f 69 64 29  LURES, fault_id)
c490: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
c4a0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
c4b0: 20 6f 66 20 66 61 75 6c 74 73 20 28 62 6f 74 68   of faults (both
c4c0: 20 68 61 72 64 20 61 6e 64 20 62 65 6e 69 67 6e   hard and benign
c4d0: 20 66 61 75 6c 74 73 29 20 74 68 61 74 20 68 61   faults) that ha
c4e0: 76 65 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  ve.    ** occurr
c4f0: 65 64 20 73 69 6e 63 65 20 74 68 65 20 69 6e 6a  ed since the inj
c500: 65 63 74 6f 72 20 69 64 65 6e 74 69 66 69 65 64  ector identified
c510: 20 62 79 20 66 61 75 6c 74 5f 69 64 29 20 77 61   by fault_id) wa
c520: 73 20 6c 61 73 74 20 63 6f 6e 66 69 67 75 72 65  s last configure
c530: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
c540: 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
c550: 52 4c 5f 46 41 55 4c 54 5f 46 41 49 4c 55 52 45  RL_FAULT_FAILURE
c560: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  S: {.      int i
c570: 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  d = va_arg(ap, i
c580: 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
c590: 73 71 6c 69 74 65 33 46 61 75 6c 74 46 61 69 6c  sqlite3FaultFail
c5a0: 75 72 65 73 28 69 64 29 3b 0a 20 20 20 20 20 20  ures(id);.      
c5b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
c5c0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69    /*.    ** sqli
c5d0: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
c5e0: 28 46 41 55 4c 54 5f 42 45 4e 49 47 4e 5f 46 41  (FAULT_BENIGN_FA
c5f0: 49 4c 55 52 45 53 2c 20 66 61 75 6c 74 5f 69 64  ILURES, fault_id
c600: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
c610: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
c620: 72 20 6f 66 20 62 65 6e 69 67 6e 20 66 61 75 6c  r of benign faul
c630: 74 73 20 74 68 61 74 20 68 61 76 65 20 6f 63 63  ts that have occ
c640: 75 72 72 65 64 20 73 69 6e 63 65 20 74 68 65 0a  urred since the.
c650: 20 20 20 20 2a 2a 20 69 6e 6a 65 63 74 6f 72 20      ** injector 
c660: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 66 61  identified by fa
c670: 75 6c 74 5f 69 64 20 77 61 73 20 6c 61 73 74 20  ult_id was last 
c680: 63 6f 6e 66 69 67 75 72 65 64 2e 0a 20 20 20 20  configured..    
c690: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
c6a0: 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c  TE_TESTCTRL_FAUL
c6b0: 54 5f 42 45 4e 49 47 4e 5f 46 41 49 4c 55 52 45  T_BENIGN_FAILURE
c6c0: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  S: {.      int i
c6d0: 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  d = va_arg(ap, i
c6e0: 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
c6f0: 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65 6e 69  sqlite3FaultBeni
c700: 67 6e 46 61 69 6c 75 72 65 73 28 69 64 29 3b 0a  gnFailures(id);.
c710: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c720: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
c730: 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
c740: 6f 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 50 45 4e  ontrol(FAULT_PEN
c750: 44 49 4e 47 2c 20 66 61 75 6c 74 5f 69 64 29 0a  DING, fault_id).
c760: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
c770: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
c780: 6f 66 20 73 75 63 63 65 73 73 65 73 20 74 68 61  of successes tha
c790: 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 62 65 66  t will occur bef
c7a0: 6f 72 65 20 74 68 65 20 6e 65 78 74 0a 20 20 20  ore the next.   
c7b0: 20 2a 2a 20 73 63 68 65 64 75 6c 65 64 20 66 61   ** scheduled fa
c7c0: 69 6c 75 72 65 20 6f 6e 20 66 61 75 6c 74 20 69  ilure on fault i
c7d0: 6e 6a 65 63 74 6f 72 20 66 61 75 6c 74 5f 69 64  njector fault_id
c7e0: 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 20 66  ..    ** If no f
c7f0: 61 69 6c 75 72 65 73 20 61 72 65 20 73 63 68 65  ailures are sche
c800: 64 75 6c 65 64 2c 20 72 65 74 75 72 6e 20 2d 31  duled, return -1
c810: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
c820: 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
c830: 4c 5f 46 41 55 4c 54 5f 50 45 4e 44 49 4e 47 3a  L_FAULT_PENDING:
c840: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 20   {.      int id 
c850: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
c860: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
c870: 6c 69 74 65 33 46 61 75 6c 74 50 65 6e 64 69 6e  lite3FaultPendin
c880: 67 28 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  g(id);.      bre
c890: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
c8a0: 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68  *.    ** Save th
c8b0: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
c8c0: 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20  of the PRNG..   
c8d0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
c8e0: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
c8f0: 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20  G_SAVE: {.      
c900: 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53  sqlite3PrngSaveS
c910: 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
c920: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
c930: 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72  /*.    ** Restor
c940: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
c950: 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c  he PRNG to the l
c960: 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64 20  ast state saved 
c970: 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e  using.    ** PRN
c980: 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47  G_SAVE.  If PRNG
c990: 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72 20  _SAVE has never 
c9a0: 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c  before been call
c9b0: 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
c9c0: 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20 6c  this verb acts l
c9d0: 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a  ike PRNG_RESET..
c9e0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
c9f0: 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
ca00: 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a  PRNG_RESTORE: {.
ca10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
ca20: 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b  gRestoreState();
ca30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ca40: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
ca50: 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50 52 4e  ** Reset the PRN
ca60: 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e  G back to its un
ca70: 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74  initialized stat
ca80: 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c  e.  The next cal
ca90: 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
caa0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29  te3_randomness()
cab0: 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65   will reseed the
cac0: 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69   PRNG using a si
cad0: 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  ngle call.    **
cae0: 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e   to the xRandomn
caf0: 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  ess method of th
cb00: 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20  e default VFS.. 
cb10: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
cb20: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
cb30: 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20  RNG_RESET: {.   
cb40: 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65     sqlite3PrngRe
cb50: 73 65 74 53 74 61 74 65 28 29 3b 0a 20 20 20 20  setState();.    
cb60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
cb70: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
cb80: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
cb90: 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c  rol(BITVEC_TEST,
cba0: 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a   size, program).
cbb0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75      **.    ** Ru
cbc0: 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73 74  n a test against
cbd0: 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74   a Bitvec object
cbe0: 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70   of size.  The p
cbf0: 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a  rogram argument.
cc00: 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72      ** is an arr
cc10: 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74  ay of integers t
cc20: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
cc30: 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31  test.  Return -1
cc40: 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d   on a.    ** mem
cc50: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
cc60: 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65  rror, 0 on succe
cc70: 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  ss, or non-zero 
cc80: 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  for an error..  
cc90: 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c    ** See the sql
cca0: 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
ccb0: 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64 69  nTest() for addi
ccc0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
ccd0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  on..    */.    c
cce0: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
ccf0: 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a  TRL_BITVEC_TEST:
cd00: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20   {.      int sz 
cd10: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
cd20: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50  );.      int *aP
cd30: 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  rog = va_arg(ap,
cd40: 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63   int*);.      rc
cd50: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
cd60: 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20  BuiltinTest(sz, 
cd70: 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72  aProg);.      br
cd80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
cd90: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e   va_end(ap);.#en
cda0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
cdb0: 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20  IT_BUILTIN_TEST 
cdc0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
cdd0: 7d 0a                                            }.