/ Hex Artifact Content
Login

Artifact 59b622b0f6b6c4b44a23a71ae8dac53bfec113ca:


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 37 39 20 32 30 30 38 2f 30 37  ,v 1.479 2008/07
0280: 2f 31 36 20 31 34 3a 30 32 3a 33 33 20 64 72 68  /16 14:02:33 drh
0290: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
02a0: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
02b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
02c0: 2e 68 3e 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .h>..#ifdef SQLI
02d0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 23  TE_ENABLE_FTS3.#
02e0: 20 69 6e 63 6c 75 64 65 20 22 66 74 73 33 2e 68   include "fts3.h
02f0: 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ".#endif.#ifdef 
0300: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54  SQLITE_ENABLE_RT
0310: 52 45 45 0a 23 20 69 6e 63 6c 75 64 65 20 22 72  REE.# include "r
0320: 74 72 65 65 2e 68 22 0a 23 65 6e 64 69 66 0a 0a  tree.h".#endif..
0330: 2f 2a 0a 2a 2a 20 54 68 65 20 76 65 72 73 69 6f  /*.** The versio
0340: 6e 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79  n of the library
0350: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 73  .*/.const char s
0360: 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d  qlite3_version[]
0370: 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f   = SQLITE_VERSIO
0380: 4e 3b 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  N;.const char *s
0390: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
03a0: 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  n(void){ return 
03b0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 3b  sqlite3_version;
03c0: 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c   }.int sqlite3_l
03d0: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
03e0: 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53  (void){ return S
03f0: 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
0400: 4d 42 45 52 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  MBER; }.int sqli
0410: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 76  te3_threadsafe(v
0420: 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c  oid){ return SQL
0430: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3b 20  ITE_THREADSAFE; 
0440: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
0450: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
0460: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
0470: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
0480: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ACE)./*.** If th
0490: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
04a0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20  tion pointer is 
04b0: 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a  not NULL and if.
04c0: 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
04d0: 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62  _IOTRACE is enab
04e0: 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67  led, then messag
04f0: 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a  es describing.**
0500: 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20   I/O active are 
0510: 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68  written using th
0520: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  is function.  Th
0530: 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20  ese messages.** 
0540: 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72  are intended for
0550: 20 64 65 62 75 67 67 69 6e 67 20 61 63 74 69 76   debugging activ
0560: 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ity only..*/.voi
0570: 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54 72 61  d (*sqlite3IoTra
0580: 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ce)(const char*,
0590: 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64 69   ...) = 0;.#endi
05a0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
05b0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
05c0: 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73   variable points
05d0: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69   to a string whi
05e0: 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d  ch is the.** nam
05f0: 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
0600: 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65  , then that dire
0610: 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73  ctory will be us
0620: 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74  ed to store.** t
0630: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
0640: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  **.** See also t
0650: 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f  he "PRAGMA temp_
0660: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22  store_directory"
0670: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   SQL command..*/
0680: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74  .char *sqlite3_t
0690: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
06a0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  0;../*.** Initia
06b0: 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a  lize SQLite.  .*
06c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
06d0: 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
06e0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
06f0: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
0700: 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e  tion,.** VFS, an
0710: 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  d mutex subsyste
0720: 73 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  sms prior to doi
0730: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
0740: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
0750: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
0760: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
0770: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0780: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0790: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
07a0: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
07b0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
07c0: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
07d0: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
07e0: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
07f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0800: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0810: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
0820: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
0830: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
0840: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
0850: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
0860: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
0870: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
0880: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69  3_initialize(voi
0890: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  d){.  static int
08a0: 20 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b   inProgress = 0;
08b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
08c0: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c   If SQLite is al
08d0: 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65  ready initialize
08e0: 64 2c 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  d, this call is 
08f0: 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
0900: 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  ( sqlite3Config.
0910: 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20  isInit ) return 
0920: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
0930: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6d   Make sure the m
0940: 75 74 65 78 20 73 79 73 74 65 6d 20 69 73 20 69  utex system is i
0950: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 2a 2f 0a 20  nitialized. */. 
0960: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
0970: 65 78 49 6e 69 74 28 29 3b 0a 0a 20 20 69 66 28  exInit();..  if(
0980: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
0990: 7b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  {..    /* Initia
09a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
09b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
09c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
09d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 20  Mutex mutex..   
09e0: 20 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69   ** This operati
09f0: 6f 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20  on is protected 
0a00: 62 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41  by the STATIC_MA
0a10: 53 54 45 52 20 6d 75 74 65 78 2e 0a 20 20 20 20  STER mutex..    
0a20: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  */.    sqlite3_m
0a30: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 20 3d 20  utex *pMaster = 
0a40: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
0a50: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
0a60: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
0a70: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
0a80: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
0a90: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
0aa0: 33 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  3Config.isMalloc
0ab0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63  Init ){.      rc
0ac0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
0ad0: 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20  Init();.    }.  
0ae0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
0af0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
0b00: 69 74 65 33 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  ite3Config.isMal
0b10: 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  locInit = 1;.   
0b20: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 43     if( !sqlite3C
0b30: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
0b40: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
0b50: 74 65 33 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  te3Config.pInitM
0b60: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
0b70: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
0b80: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29  MUTEX_RECURSIVE)
0b90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
0ba0: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62 43 6f 72  lite3Config.bCor
0bb0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
0bc0: 65 33 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  e3Config.pInitMu
0bd0: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tex ){.         
0be0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
0bf0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
0c00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
0c10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
0c20: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
0c30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
0c40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
0c50: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
0c60: 20 20 20 2f 2a 20 45 6e 74 65 72 20 74 68 65 20     /* Enter the 
0c70: 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d  recursive pInitM
0c80: 75 74 65 78 20 6d 75 74 65 78 2e 20 41 66 74 65  utex mutex. Afte
0c90: 72 20 64 6f 69 6e 67 20 73 6f 2c 20 69 66 20 74  r doing so, if t
0ca0: 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
0cb0: 33 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 66  3Config.isInit f
0cc0: 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
0cd0: 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 68 72  n some other thr
0ce0: 65 61 64 20 68 61 73 0a 20 20 20 20 2a 2a 20 66  ead has.    ** f
0cf0: 69 6e 69 73 68 65 64 20 64 6f 69 6e 67 20 74 68  inished doing th
0d00: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
0d10: 2e 20 49 66 20 74 68 65 20 69 6e 50 72 6f 67 72  . If the inProgr
0d20: 65 73 73 20 66 6c 61 67 20 69 73 0a 20 20 20 20  ess flag is.    
0d30: 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  ** true, then th
0d40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
0d50: 65 69 6e 67 20 63 61 6c 6c 65 64 20 72 65 63 75  eing called recu
0d60: 72 73 69 76 65 6c 79 20 66 72 6f 6d 20 77 69 74  rsively from wit
0d70: 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hin.    ** the s
0d80: 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29  qlite3_os_init()
0d90: 20 63 61 6c 6c 20 62 65 6c 6f 77 2e 20 49 6e 20   call below. In 
0da0: 65 69 74 68 65 72 20 63 61 73 65 2c 20 65 78 69  either case, exi
0db0: 74 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2f 0a  t early..    */.
0dc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
0dd0: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 43  x_enter(sqlite3C
0de0: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
0df0: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
0e00: 65 33 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  e3Config.isInit 
0e10: 7c 7c 20 69 6e 50 72 6f 67 72 65 73 73 20 29 7b  || inProgress ){
0e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
0e30: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
0e40: 65 33 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  e3Config.pInitMu
0e50: 74 65 78 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tex);.      retu
0e60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
0e70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
0e80: 74 61 74 75 73 52 65 73 65 74 28 29 3b 0a 20 20  tatusReset();.  
0e90: 20 20 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31    inProgress = 1
0ea0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
0eb0: 65 33 5f 6f 73 5f 69 6e 69 74 28 29 3b 0a 20 20  e3_os_init();.  
0ec0: 20 20 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30    inProgress = 0
0ed0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  ;.    sqlite3Con
0ee0: 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 28 72 63  fig.isInit = (rc
0ef0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 31 20  ==SQLITE_OK ? 1 
0f00: 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  : 0);.    sqlite
0f10: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
0f20: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 70 49 6e 69  lite3Config.pIni
0f30: 74 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72  tMutex);.  }.  r
0f40: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
0f50: 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65  ** Undo the effe
0f60: 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  cts of sqlite3_i
0f70: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75  nitialize().  Mu
0f80: 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  st not be called
0f90: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20   while.** there 
0fa0: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
0fb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0fc0: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
0fd0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a  llocations or.**
0fe0: 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20   while any part 
0ff0: 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68  of SQLite is oth
1000: 65 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e  erwise in use in
1010: 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68   any thread.  Th
1020: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
1030: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e   not threadsafe.
1040: 20 20 4e 6f 74 20 62 79 20 61 20 6c 6f 6e 67 20    Not by a long 
1050: 73 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  shot..*/.int sql
1060: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
1070: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
1080: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
1090: 33 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  3Config.pInitMut
10a0: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  ex);.  sqlite3Co
10b0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20  nfig.pInitMutex 
10c0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  = 0;.  sqlite3Co
10d0: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
10e0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
10f0: 69 74 65 33 43 6f 6e 66 69 67 2e 69 73 49 6e 69  ite3Config.isIni
1100: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
1110: 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 7d 0a 20  _os_end();.  }. 
1120: 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66   if( sqlite3Conf
1130: 69 67 2e 6d 2e 78 53 68 75 74 64 6f 77 6e 20 29  ig.m.xShutdown )
1140: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c  {.    sqlite3Mal
1150: 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 7d 0a 20 20  locEnd();.  }.  
1160: 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69  if( sqlite3Confi
1170: 67 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78 45 6e  g.mutex.xMutexEn
1180: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
1190: 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 7d 0a  MutexEnd();.  }.
11a0: 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e    sqlite3Config.
11b0: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65  isInit = 0;.  re
11c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
11e0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
11f0: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
1200: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
1210: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
1220: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
1230: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
1240: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1250: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
1260: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
1270: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
1280: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
1290: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
12a0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
12b0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
12c0: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
12d0: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
12e0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
12f0: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
1300: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
1310: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
1320: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1330: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
1340: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1350: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1360: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
1370: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
1380: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
1390: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
13a0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
13b0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
13c0: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
13d0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
13e0: 69 74 65 33 43 6f 6e 66 69 67 2e 69 73 49 6e 69  ite3Config.isIni
13f0: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
1400: 45 5f 4d 49 53 55 53 45 3b 0a 0a 20 20 76 61 5f  E_MISUSE;..  va_
1410: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
1420: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1430: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
1440: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
1450: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
1460: 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  isable all mutex
1470: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
1480: 69 74 65 33 43 6f 6e 66 69 67 2e 62 43 6f 72 65  ite3Config.bCore
1490: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Mutex = 0;.     
14a0: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62   sqlite3Config.b
14b0: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
14c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14d0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
14e0: 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48  E_CONFIG_MULTITH
14f0: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
1500: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e   Disable mutexin
1510: 67 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  g of database co
1520: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
1530: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74     /* Enable mut
1540: 65 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61  exing of core da
1550: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
1560: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1570: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
1580: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
1590: 65 33 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  e3Config.bFullMu
15a0: 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  tex = 0;.      b
15b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
15d0: 49 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b  IG_SERIALIZED: {
15e0: 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65  .      /* Enable
15f0: 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f   all mutexing */
1600: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1610: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
1620: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
1630: 65 33 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  e3Config.bFullMu
1640: 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  tex = 1;.      b
1650: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1660: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
1670: 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20  IG_MALLOC: {.   
1680: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
1690: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 61 6c   alternative mal
16a0: 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  loc implementati
16b0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
16c0: 74 65 33 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76  te3Config.m = *v
16d0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
16e0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b  3_mem_methods*);
16f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1700: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1710: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41  ITE_CONFIG_GETMA
1720: 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LLOC: {.      /*
1730: 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75   Retrieve the cu
1740: 72 72 65 6e 74 20 6d 61 6c 6c 6f 63 28 29 20 69  rrent malloc() i
1750: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
1760: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1770: 65 33 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c  e3Config.m.xMall
1780: 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d  oc==0 ) sqlite3M
1790: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  emSetDefault();.
17a0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
17b0: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
17c0: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
17d0: 33 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20  3Config.m;.     
17e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
1800: 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20  NFIG_MUTEX: {.  
1810: 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61      /* Specify a
1820: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 75  n alternative mu
1830: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
1840: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
1850: 74 65 33 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20  te3Config.mutex 
1860: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
1870: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68  lite3_mutex_meth
1880: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
1890: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
18a0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
18b0: 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20  _GETMUTEX: {.   
18c0: 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20 74     /* Retrieve t
18d0: 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65 78  he current mutex
18e0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
18f0: 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67  */.      *va_arg
1900: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
1910: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73  ex_methods*) = s
1920: 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d 75 74  qlite3Config.mut
1930: 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ex;.      break;
1940: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1950: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45  SQLITE_CONFIG_ME
1960: 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20  MSTATUS: {.     
1970: 20 2f 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69   /* Enable or di
1980: 73 61 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63  sable the malloc
1990: 20 73 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69   status collecti
19a0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
19b0: 74 65 33 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74  te3Config.bMemst
19c0: 61 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  at = va_arg(ap, 
19d0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
19e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
19f0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
1a00: 53 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20 20  SCRATCH: {.     
1a10: 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20   /* Designate a 
1a20: 62 75 66 66 65 72 20 66 6f 72 20 73 63 72 61 74  buffer for scrat
1a30: 63 68 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  ch memory space 
1a40: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1a50: 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20  Config.pScratch 
1a60: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1a70: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
1a80: 65 33 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74  e3Config.szScrat
1a90: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
1aa0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
1ab0: 74 65 33 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74  te3Config.nScrat
1ac0: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
1ad0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1ae0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1af0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
1b00: 50 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20  PAGECACHE: {.   
1b10: 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20     /* Designate 
1b20: 61 20 62 75 66 66 65 72 20 66 6f 72 20 73 63 72  a buffer for scr
1b30: 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61 63  atch memory spac
1b40: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
1b50: 65 33 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d  e3Config.pPage =
1b60: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1b70: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
1b80: 33 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  3Config.szPage =
1b90: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1ba0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
1bb0: 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76 61  onfig.nPage = va
1bc0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1bd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1be0: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
1bf0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
1c00: 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SYS3) || defined
1c10: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
1c20: 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61 73 65  EMSYS5).    case
1c30: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48   SQLITE_CONFIG_H
1c40: 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EAP: {.      /* 
1c50: 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66 66  Designate a buff
1c60: 65 72 20 66 6f 72 20 68 65 61 70 20 6d 65 6d 6f  er for heap memo
1c70: 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ry space */.    
1c80: 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e    sqlite3Config.
1c90: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
1ca0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
1cb0: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e   sqlite3Config.n
1cc0: 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Heap = va_arg(ap
1cd0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
1ce0: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d 6e 52 65  lite3Config.mnRe
1cf0: 71 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  q = va_arg(ap, i
1d00: 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  nt);..      if( 
1d10: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 70 48  sqlite3Config.pH
1d20: 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eap==0 ){.      
1d30: 20 20 2f 2a 20 49 66 20 74 68 65 20 68 65 61 70    /* If the heap
1d40: 20 70 6f 69 6e 74 65 72 20 69 73 20 4e 55 4c 4c   pointer is NULL
1d50: 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
1d60: 68 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d  he malloc implem
1d70: 65 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20 20 20  entation.       
1d80: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55 4c 4c   ** back to NULL
1d90: 20 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e 20 20   pointers too.  
1da0: 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
1db0: 74 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20 67 6f  the malloc to go
1dc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
1dd0: 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20   to its default 
1de0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
1df0: 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  hen sqlite3_init
1e00: 69 61 6c 69 7a 65 28 29 20 69 73 0a 20 20 20 20  ialize() is.    
1e10: 20 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20 20 20      ** run..    
1e20: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d      */.        m
1e30: 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33 43 6f  emset(&sqlite3Co
1e40: 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f  nfig.m, 0, sizeo
1e50: 66 28 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  f(sqlite3Config.
1e60: 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  m));.      }else
1e70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1e80: 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73   heap pointer is
1e90: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
1ea0: 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74  install one of t
1eb0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65  he.        ** me
1ec0: 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68  m5.c/mem3.c meth
1ed0: 6f 64 73 2e 20 49 66 20 6e 65 69 74 68 65 72 20  ods. If neither 
1ee0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6e  ENABLE_MEMSYS3 n
1ef0: 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 4e  or.        ** EN
1f00: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 69 73 20  ABLE_MEMSYS5 is 
1f10: 64 65 66 69 6e 65 64 2c 20 72 65 74 75 72 6e 20  defined, return 
1f20: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 20 20  an error..      
1f30: 20 20 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74    ** the default
1f40: 20 63 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e   case and return
1f50: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 20   an error..     
1f60: 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
1f70: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
1f80: 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S3.        sqlit
1f90: 65 33 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  e3Config.m = *sq
1fa0: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
1fb0: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
1fc0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1fd0: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
1fe0: 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e    sqlite3Config.
1ff0: 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  m = *sqlite3MemG
2000: 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e  etMemsys5();.#en
2010: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
2020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
2030: 65 6e 64 69 66 0a 0a 20 20 20 20 64 65 66 61 75  endif..    defau
2040: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lt: {.      rc =
2050: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2070: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
2080: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
2090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  .}../*.** Routin
20a0: 65 20 6e 65 65 64 65 64 20 74 6f 20 73 75 70 70  e needed to supp
20b0: 6f 72 74 20 74 68 65 20 74 65 73 74 63 61 73 65  ort the testcase
20c0: 28 29 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  () macro..*/.#if
20d0: 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 56 45 52  def SQLITE_COVER
20e0: 41 47 45 5f 54 45 53 54 0a 76 6f 69 64 20 73 71  AGE_TEST.void sq
20f0: 6c 69 74 65 33 43 6f 76 65 72 61 67 65 28 69 6e  lite3Coverage(in
2100: 74 20 78 29 7b 0a 20 20 73 74 61 74 69 63 20 69  t x){.  static i
2110: 6e 74 20 64 75 6d 6d 79 20 3d 20 30 3b 0a 20 20  nt dummy = 0;.  
2120: 64 75 6d 6d 79 20 2b 3d 20 78 3b 0a 7d 0a 23 65  dummy += x;.}.#e
2130: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ndif.../*.** Ret
2140: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
2150: 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d  buffer z[0..n-1]
2160: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70   contains all sp
2170: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
2180: 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f  int allSpaces(co
2190: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
21a0: 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e   n){.  while( n>
21b0: 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27  0 && z[n-1]==' '
21c0: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74   ){ n--; }.  ret
21d0: 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  urn n==0;.}../*.
21e0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64  ** This is the d
21f0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
2200: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
2210: 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69  "BINARY" which i
2220: 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69  s always.** avai
2230: 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lable..**.** If 
2240: 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67 75  the padFlag argu
2250: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
2260: 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64 64   then space padd
2270: 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a  ing at the end.*
2280: 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20  * of strings is 
2290: 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
22a0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54  mplements the RT
22b0: 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a  RIM collation..*
22c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e  /.static int bin
22d0: 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64  CollFunc(.  void
22e0: 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74   *padFlag,.  int
22f0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
2300: 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74  id *pKey1,.  int
2310: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
2320: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69  id *pKey2.){.  i
2330: 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20  nt rc, n;.  n = 
2340: 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b  nKey1<nKey2 ? nK
2350: 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 72  ey1 : nKey2;.  r
2360: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31  c = memcmp(pKey1
2370: 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69  , pKey2, n);.  i
2380: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
2390: 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20  if( padFlag.    
23a0: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
23b0: 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20  char*)pKey1)+n, 
23c0: 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26  nKey1-n).     &&
23d0: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
23e0: 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65  r*)pKey2)+n, nKe
23f0: 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  y2-n).    ){.   
2400: 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 20 75     /* Leave rc u
2410: 6e 63 68 61 6e 67 65 64 20 61 74 20 30 20 2a 2f  nchanged at 0 */
2420: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2430: 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e    rc = nKey1 - n
2440: 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Key2;.    }.  }.
2450: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2460: 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75  /*.** Another bu
2470: 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
2480: 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53   sequence: NOCAS
2490: 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  E. .**.** This c
24a0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
24b0: 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  e is intended to
24c0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 22 63 61   be used for "ca
24d0: 73 65 20 69 6e 64 65 70 65 6e 64 61 6e 74 0a 2a  se independant.*
24e0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53  * comparison". S
24f0: 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67  QLite's knowledg
2500: 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c  e of upper and l
2510: 6f 77 65 72 20 63 61 73 65 20 65 71 75 69 76 61  ower case equiva
2520: 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73  lents.** extends
2530: 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20   only to the 26 
2540: 63 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20  characters used 
2550: 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c  in the English l
2560: 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41  anguage..**.** A
2570: 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65  t the moment the
2580: 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46  re is only a UTF
2590: 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  -8 implementatio
25a0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
25b0: 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
25c0: 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  Func(.  void *No
25d0: 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65  tUsed,.  int nKe
25e0: 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
25f0: 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65  pKey1,.  int nKe
2600: 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
2610: 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72  pKey2.){.  int r
2620: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43   = sqlite3StrNIC
2630: 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74  mp(.      (const
2640: 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28   char *)pKey1, (
2650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
2660: 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32  y2, (nKey1<nKey2
2670: 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a  )?nKey1:nKey2);.
2680: 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20    if( 0==r ){.  
2690: 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79    r = nKey1-nKey
26a0: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
26b0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
26c0: 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  rn the ROWID of 
26d0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
26e0: 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65  insert.*/.sqlite
26f0: 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c  _int64 sqlite3_l
2700: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
2710: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
2720: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74   return db->last
2730: 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
2740: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2750: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20  r of changes in 
2760: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
2770: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
2780: 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  exec()..*/.int s
2790: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73  qlite3_changes(s
27a0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
27b0: 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67  eturn db->nChang
27c0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
27d0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
27e0: 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74   changes since t
27f0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
2800: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a  le was opened..*
2810: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f  /.int sqlite3_to
2820: 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  tal_changes(sqli
2830: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
2840: 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  rn db->nTotalCha
2850: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  nge;.}../*.** Cl
2860: 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ose an existing 
2870: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a  SQLite database.
2880: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
2890: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
28a0: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
28b0: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 69 66  ;.  int j;..  if
28c0: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
28d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28e0: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
28f0: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
2900: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
2910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
2920: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  SUSE;.  }.  sqli
2930: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2940: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 23 69 66  db->mutex);..#if
2950: 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20  def SQLITE_SSE. 
2960: 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f   {.    extern vo
2970: 69 64 20 73 71 6c 69 74 65 33 53 73 65 43 6c 65  id sqlite3SseCle
2980: 61 6e 75 70 28 73 71 6c 69 74 65 33 2a 29 3b 0a  anup(sqlite3*);.
2990: 20 20 20 20 73 71 6c 69 74 65 33 53 73 65 43 6c      sqlite3SseCl
29a0: 65 61 6e 75 70 28 64 62 29 3b 0a 20 20 7d 0a 23  eanup(db);.  }.#
29b0: 65 6e 64 69 66 20 0a 0a 20 20 73 71 6c 69 74 65  endif ..  sqlite
29c0: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
29d0: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20  hema(db, 0);..  
29e0: 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  /* If a transact
29f0: 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65  ion is open, the
2a00: 20 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63   ResetInternalSc
2a10: 68 65 6d 61 28 29 20 63 61 6c 6c 20 61 62 6f 76  hema() call abov
2a20: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
2a30: 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20  have called the 
2a40: 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65  xDisconnect() me
2a50: 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74  thod on any virt
2a60: 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  ual.  ** tables 
2a70: 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61  in the db->aVTra
2a80: 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20  ns[] array. The 
2a90: 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
2aa0: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a  3VtabRollback().
2ab0: 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64    ** call will d
2ac0: 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f  o so. We need to
2ad0: 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   do this before 
2ae0: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63  the check for ac
2af0: 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74  tive.  ** SQL st
2b00: 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20  atements below, 
2b10: 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69  as the v-table i
2b20: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61  mplementation ma
2b30: 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a  y be storing.  *
2b40: 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20  * some prepared 
2b50: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72  statements inter
2b60: 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  nally..  */.  sq
2b70: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
2b80: 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  k(db);..  /* If 
2b90: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75  there are any ou
2ba0: 74 73 74 61 6e 64 69 6e 67 20 56 4d 73 2c 20 72  tstanding VMs, r
2bb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2bc0: 59 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  Y. */.  if( db->
2bd0: 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c  pVdbe ){.    sql
2be0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
2bf0: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
2c00: 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 63      "Unable to c
2c10: 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69  lose due to unfi
2c20: 6e 61 6c 69 73 65 64 20 73 74 61 74 65 6d 65 6e  nalised statemen
2c30: 74 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ts");.    sqlite
2c40: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
2c50: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65  ->mutex);.    re
2c60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
2c70: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2c80: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
2c90: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
2ca0: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  ;..  for(j=0; j<
2cb0: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
2cc0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
2cd0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b  b = &db->aDb[j];
2ce0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
2cf0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
2d00: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62  e3BtreeClose(pDb
2d10: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44  ->pBt);.      pD
2d20: 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20  b->pBt = 0;.    
2d30: 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20    if( j!=1 ){.  
2d40: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
2d50: 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ma = 0;.      }.
2d60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2d70: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
2d80: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
2d90: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62   assert( db->nDb
2da0: 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  <=2 );.  assert(
2db0: 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44   db->aDb==db->aD
2dc0: 62 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f 72  bStatic );.  for
2dd0: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
2de0: 73 74 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20  st(&db->aFunc); 
2df0: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
2e00: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 46 75 6e  ext(i)){.    Fun
2e10: 63 44 65 66 20 2a 70 46 75 6e 63 2c 20 2a 70 4e  cDef *pFunc, *pN
2e20: 65 78 74 3b 0a 20 20 20 20 66 6f 72 28 70 46 75  ext;.    for(pFu
2e30: 6e 63 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73  nc = (FuncDef*)s
2e40: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
2e50: 3b 20 70 46 75 6e 63 3b 20 70 46 75 6e 63 3d 70  ; pFunc; pFunc=p
2e60: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65  Next){.      pNe
2e70: 78 74 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78  xt = pFunc->pNex
2e80: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
2e90: 5f 66 72 65 65 28 70 46 75 6e 63 29 3b 0a 20 20  _free(pFunc);.  
2ea0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69    }.  }..  for(i
2eb0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
2ec0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
2ed0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
2ee0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f  Next(i)){.    Co
2ef0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
2f00: 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65  CollSeq *)sqlite
2f10: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
2f20: 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64   /* Invoke any d
2f30: 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73  estructors regis
2f40: 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74  tered for collat
2f50: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
2f60: 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66  r data. */.    f
2f70: 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b  or(j=0; j<3; j++
2f80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  ){.      if( pCo
2f90: 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20  ll[j].xDel ){.  
2fa0: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78        pColl[j].x
2fb0: 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73  Del(pColl[j].pUs
2fc0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
2fd0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2fe0: 72 65 65 28 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  ree(pColl);.  }.
2ff0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
3000: 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  ar(&db->aCollSeq
3010: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
3020: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
3030: 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  BLE.  for(i=sqli
3040: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
3050: 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d  >aModule); i; i=
3060: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
3070: 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a  )){.    Module *
3080: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a  pMod = (Module *
3090: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
30a0: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64  i);.    if( pMod
30b0: 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ->xDestroy ){.  
30c0: 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72      pMod->xDestr
30d0: 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a  oy(pMod->pAux);.
30e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
30f0: 33 5f 66 72 65 65 28 70 4d 6f 64 29 3b 0a 20 20  3_free(pMod);.  
3100: 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
3110: 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  lear(&db->aModul
3120: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  e);.#endif..  sq
3130: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
3140: 64 62 2d 3e 61 46 75 6e 63 29 3b 0a 20 20 73 71  db->aFunc);.  sq
3150: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
3160: 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f 2a  QLITE_OK, 0); /*
3170: 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79   Deallocates any
3180: 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73 74   cached error st
3190: 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 69 66 28 20  rings. */.  if( 
31a0: 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20 20  db->pErr ){.    
31b0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
31c0: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a  (db->pErr);.  }.
31d0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78    sqlite3CloseEx
31e0: 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20  tensions(db);.. 
31f0: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
3200: 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b  ITE_MAGIC_ERROR;
3210: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d  ..  /* The temp-
3220: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
3230: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66  is allocated dif
3240: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
3250: 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20  e other schema. 
3260: 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69   ** objects (usi
3270: 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ng sqliteMalloc(
3280: 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  ) directly, inst
3290: 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74  ead of sqlite3Bt
32a0: 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20  reeSchema())..  
32b0: 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74  ** So it needs t
32c0: 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e  o be freed here.
32d0: 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72   Todo: Why not r
32e0: 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68  oll the temp sch
32f0: 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ema into.  ** th
3300: 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c  e same sqliteMal
3310: 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65  loc() as the one
3320: 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20   that allocates 
3330: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
3340: 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20  ** structure?.  
3350: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
3360: 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  e(db->aDb[1].pSc
3370: 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
3380: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
3390: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d  >mutex);.  db->m
33a0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
33b0: 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71  GIC_CLOSED;.  sq
33c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
33d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
33e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
33f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3400: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
3410: 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62  llback all datab
3420: 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f  ase files..*/.vo
3430: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
3440: 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  ckAll(sqlite3 *d
3450: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
3460: 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a  nt inTrans = 0;.
3470: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3480: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
3490: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
34a0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
34b0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69  alloc();.  for(i
34c0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
34d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
34e0: 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a 20  >aDb[i].pBt ){. 
34f0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3500: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 64  BtreeIsInTrans(d
3510: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29  b->aDb[i].pBt) )
3520: 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e  {.        inTran
3530: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 1;.      }. 
3540: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
3550: 65 52 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 61 44  eRollback(db->aD
3560: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20  b[i].pBt);.     
3570: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72   db->aDb[i].inTr
3580: 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ans = 0;.    }. 
3590: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
35a0: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20  Rollback(db);.  
35b0: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
35c0: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28  Malloc();..  if(
35d0: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
35e0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
35f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
3600: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
3610: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
3620: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
3630: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
3640: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
3650: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
3660: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
3670: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
3680: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
3690: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
36a0: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
36b0: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
36c0: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
36d0: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
36e0: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
36f0: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
3700: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
3710: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
3720: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
3730: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
3740: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
3750: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
3760: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
3770: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
3780: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3790: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63  *z;.  switch( rc
37a0: 20 26 20 30 78 66 66 20 29 7b 0a 20 20 20 20 63   & 0xff ){.    c
37b0: 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 0a  ase SQLITE_ROW:.
37c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
37d0: 44 4f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 53  DONE:.    case S
37e0: 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20  QLITE_OK:       
37f0: 20 20 7a 20 3d 20 22 6e 6f 74 20 61 6e 20 65 72    z = "not an er
3800: 72 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20 20  ror";           
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3820: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3830: 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20  QLITE_ERROR:    
3840: 20 20 7a 20 3d 20 22 53 51 4c 20 6c 6f 67 69 63    z = "SQL logic
3850: 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e   error or missin
3860: 67 20 64 61 74 61 62 61 73 65 22 3b 20 20 20 62  g database";   b
3870: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3880: 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20  QLITE_PERM:     
3890: 20 20 7a 20 3d 20 22 61 63 63 65 73 73 20 70 65    z = "access pe
38a0: 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22  rmission denied"
38b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
38c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
38d0: 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20  QLITE_ABORT:    
38e0: 20 20 7a 20 3d 20 22 63 61 6c 6c 62 61 63 6b 20    z = "callback 
38f0: 72 65 71 75 65 73 74 65 64 20 71 75 65 72 79 20  requested query 
3900: 61 62 6f 72 74 22 3b 20 20 20 20 20 20 20 20 62  abort";        b
3910: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3920: 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20  QLITE_BUSY:     
3930: 20 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20    z = "database 
3940: 69 73 20 6c 6f 63 6b 65 64 22 3b 20 20 20 20 20  is locked";     
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3960: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3970: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20  QLITE_LOCKED:   
3980: 20 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20    z = "database 
3990: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22  table is locked"
39a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
39b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
39c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20  QLITE_NOMEM:    
39d0: 20 20 7a 20 3d 20 22 6f 75 74 20 6f 66 20 6d 65    z = "out of me
39e0: 6d 6f 72 79 22 3b 20 20 20 20 20 20 20 20 20 20  mory";          
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3a00: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3a10: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20  QLITE_READONLY: 
3a20: 20 20 7a 20 3d 20 22 61 74 74 65 6d 70 74 20 74    z = "attempt t
3a30: 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e  o write a readon
3a40: 6c 79 20 64 61 74 61 62 61 73 65 22 3b 20 20 62  ly database";  b
3a50: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3a60: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a  QLITE_INTERRUPT:
3a70: 20 20 7a 20 3d 20 22 69 6e 74 65 72 72 75 70 74    z = "interrupt
3a80: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ed";            
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3aa0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3ab0: 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20  QLITE_IOERR:    
3ac0: 20 20 7a 20 3d 20 22 64 69 73 6b 20 49 2f 4f 20    z = "disk I/O 
3ad0: 65 72 72 6f 72 22 3b 20 20 20 20 20 20 20 20 20  error";         
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3af0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3b00: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20  QLITE_CORRUPT:  
3b10: 20 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20    z = "database 
3b20: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
3b30: 6c 66 6f 72 6d 65 64 22 3b 20 20 20 20 20 20 62  lformed";      b
3b40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3b50: 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20  QLITE_FULL:     
3b60: 20 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20    z = "database 
3b70: 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22  or disk is full"
3b80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
3b90: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3ba0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20  QLITE_CANTOPEN: 
3bb0: 20 20 7a 20 3d 20 22 75 6e 61 62 6c 65 20 74 6f    z = "unable to
3bc0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
3bd0: 69 6c 65 22 3b 20 20 20 20 20 20 20 20 20 20 62  ile";          b
3be0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3bf0: 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20  QLITE_EMPTY:    
3c00: 20 20 7a 20 3d 20 22 74 61 62 6c 65 20 63 6f 6e    z = "table con
3c10: 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 3b 20  tains no data"; 
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3c30: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3c40: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20  QLITE_SCHEMA:   
3c50: 20 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20    z = "database 
3c60: 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67  schema has chang
3c70: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 62  ed";           b
3c80: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3c90: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20  QLITE_TOOBIG:   
3ca0: 20 20 7a 20 3d 20 22 53 74 72 69 6e 67 20 6f 72    z = "String or
3cb0: 20 42 4c 4f 42 20 65 78 63 65 65 64 65 64 20 73   BLOB exceeded s
3cc0: 69 7a 65 20 6c 69 6d 69 74 22 3b 20 20 20 20 62  ize limit";    b
3cd0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3ce0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
3cf0: 3a 20 7a 20 3d 20 22 63 6f 6e 73 74 72 61 69 6e  : z = "constrain
3d00: 74 20 66 61 69 6c 65 64 22 3b 20 20 20 20 20 20  t failed";      
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3d20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3d30: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20  QLITE_MISMATCH: 
3d40: 20 20 7a 20 3d 20 22 64 61 74 61 74 79 70 65 20    z = "datatype 
3d50: 6d 69 73 6d 61 74 63 68 22 3b 20 20 20 20 20 20  mismatch";      
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3d70: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3d80: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20  QLITE_MISUSE:   
3d90: 20 20 7a 20 3d 20 22 6c 69 62 72 61 72 79 20 72    z = "library r
3da0: 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75  outine called ou
3db0: 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22 3b 62  t of sequence";b
3dc0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3dd0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20  QLITE_NOLFS:    
3de0: 20 20 7a 20 3d 20 22 6c 61 72 67 65 20 66 69 6c    z = "large fil
3df0: 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69 73  e support is dis
3e00: 61 62 6c 65 64 22 3b 20 20 20 20 20 20 20 20 62  abled";        b
3e10: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3e20: 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20  QLITE_AUTH:     
3e30: 20 20 7a 20 3d 20 22 61 75 74 68 6f 72 69 7a 61    z = "authoriza
3e40: 74 69 6f 6e 20 64 65 6e 69 65 64 22 3b 20 20 20  tion denied";   
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3e60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3e70: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20  QLITE_FORMAT:   
3e80: 20 20 7a 20 3d 20 22 61 75 78 69 6c 69 61 72 79    z = "auxiliary
3e90: 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74   database format
3ea0: 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20 20 62   error";       b
3eb0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3ec0: 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20  QLITE_RANGE:    
3ed0: 20 20 7a 20 3d 20 22 62 69 6e 64 20 6f 72 20 63    z = "bind or c
3ee0: 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20  olumn index out 
3ef0: 6f 66 20 72 61 6e 67 65 22 3b 20 20 20 20 20 62  of range";     b
3f00: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3f10: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20  QLITE_NOTADB:   
3f20: 20 20 7a 20 3d 20 22 66 69 6c 65 20 69 73 20 65    z = "file is e
3f30: 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e  ncrypted or is n
3f40: 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 3b 62  ot a database";b
3f50: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
3f60: 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t:              
3f70: 20 20 7a 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65    z = "unknown e
3f80: 72 72 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20  rror";          
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3fa0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
3fb0: 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn z;.}../*.** T
3fc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
3fd0: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
3fe0: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
3ff0: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
4000: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
4010: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
4020: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
4030: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
4040: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
4050: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
4060: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
4070: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
4080: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
4090: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
40a0: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
40b0: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
40c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
40d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
40e0: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4100: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
4110: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
4120: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
4130: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
4140: 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53  (defined(HAVE_US
4150: 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
4160: 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63  LEEP).  static c
4170: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
4180: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
4190: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
41a0: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
41b0: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
41c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
41d0: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
41e0: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
41f0: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
4200: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
4210: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
4220: 4c 41 59 20 28 73 69 7a 65 6f 66 28 64 65 6c 61  LAY (sizeof(dela
4230: 79 73 29 2f 73 69 7a 65 6f 66 28 64 65 6c 61 79  ys)/sizeof(delay
4240: 73 5b 30 5d 29 29 0a 20 20 73 71 6c 69 74 65 33  s[0])).  sqlite3
4250: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
4260: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
4270: 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54  eout = db->busyT
4280: 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65  imeout;.  int de
4290: 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61  lay, prior;..  a
42a0: 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20  ssert( count>=0 
42b0: 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c  );.  if( count <
42c0: 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64   NDELAY ){.    d
42d0: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f  elay = delays[co
42e0: 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  unt];.    prior 
42f0: 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b  = totals[count];
4300: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
4310: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45  lay = delays[NDE
4320: 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f  LAY-1];.    prio
4330: 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41  r = totals[NDELA
4340: 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f  Y-1] + delay*(co
4350: 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b  unt-(NDELAY-1));
4360: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72  .  }.  if( prior
4370: 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f   + delay > timeo
4380: 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  ut ){.    delay 
4390: 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f  = timeout - prio
43a0: 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79  r;.    if( delay
43b0: 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=0 ) return 0;.
43c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
43d0: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64  leep(db->pVfs, d
43e0: 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65  elay*1000);.  re
43f0: 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
4400: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
4410: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
4420: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28  int timeout = ((
4430: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e  sqlite3 *)ptr)->
4440: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
4450: 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30  f( (count+1)*100
4460: 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  0 > timeout ){. 
4470: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4480: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
4490: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
44a0: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
44b0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
44c0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
44d0: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
44e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
44f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
4500: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
4510: 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f  failed with a lo
4520: 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  ck..** If this r
4530: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e  outine returns n
4540: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
4550: 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49  k is retried.  I
4560: 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  f it.** returns 
4570: 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  0, the operation
4580: 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20   aborts with an 
4590: 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
45a0: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
45b0: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
45c0: 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  er(BusyHandler *
45d0: 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
45e0: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
45f0: 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c  || p->xFunc==0 |
4600: 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72  | p->nBusy<0 ) r
4610: 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20  eturn 0;.  rc = 
4620: 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67  p->xFunc(p->pArg
4630: 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69  , p->nBusy);.  i
4640: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
4650: 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20  p->nBusy = -1;. 
4660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
4670: 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Busy++;.  }.  re
4680: 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a  turn rc; .}../*.
4690: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
46a0: 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61  sets the busy ca
46b0: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71  llback for an Sq
46c0: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  lite database to
46d0: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61   the.** given ca
46e0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
46f0: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
4700: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
4710: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
4720: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
4730: 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75  *db,.  int (*xBu
4740: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a  sy)(void*,int),.
4750: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
4760: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
4770: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
4780: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
4790: 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73  ler.xFunc = xBus
47a0: 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  y;.  db->busyHan
47b0: 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67  dler.pArg = pArg
47c0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
47d0: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
47e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
47f0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
4800: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4810: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
4820: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
4830: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a  RESS_CALLBACK./*
4840: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4850: 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65   sets the progre
4860: 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ss callback for 
4870: 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61  an Sqlite databa
4880: 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76  se to the.** giv
4890: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  en callback func
48a0: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69  tion with the gi
48b0: 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  ven argument. Th
48c0: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
48d0: 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69  ack will.** be i
48e0: 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70  nvoked every nOp
48f0: 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f  s opcodes..*/.vo
4900: 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72  id sqlite3_progr
4910: 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73  ess_handler(.  s
4920: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69  qlite3 *db, .  i
4930: 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28  nt nOps,.  int (
4940: 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64  *xProgress)(void
4950: 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72  *), .  void *pAr
4960: 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  g.){.  sqlite3_m
4970: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
4980: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70  utex);.  if( nOp
4990: 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  s>0 ){.    db->x
49a0: 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67  Progress = xProg
49b0: 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50  ress;.    db->nP
49c0: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70  rogressOps = nOp
49d0: 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  s;.    db->pProg
49e0: 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a  ressArg = pArg;.
49f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
4a00: 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >xProgress = 0;.
4a10: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
4a20: 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  sOps = 0;.    db
4a30: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
4a40: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
4a50: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
4a60: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
4a70: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
4a80: 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73  routine installs
4a90: 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20   a default busy 
4aa0: 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69  handler that wai
4ab0: 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70  ts for the.** sp
4ac0: 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f  ecified number o
4ad0: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  f milliseconds b
4ae0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
4af0: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
4b00: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73  3_busy_timeout(s
4b10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4b20: 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20  ms){.  if( ms>0 
4b30: 29 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54  ){.    db->busyT
4b40: 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20  imeout = ms;.   
4b50: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
4b60: 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65  ndler(db, sqlite
4b70: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
4b80: 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b  ack, (void*)db);
4b90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
4ba0: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
4bb0: 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  er(db, 0, 0);.  
4bc0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
4bd0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
4be0: 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67  ause any pending
4bf0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74   operation to st
4c00: 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65  op at its earlie
4c10: 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a  st opportunity..
4c20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
4c30: 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65  interrupt(sqlite
4c40: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31  3 *db){.  db->u1
4c50: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d  .isInterrupted =
4c60: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   1;.}.../*.** Th
4c70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  is function is e
4c80: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
4c90: 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  as sqlite3_creat
4ca0: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78  e_function(), ex
4cb0: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
4cc0: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62  is designed to b
4cd0: 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65  e called by inte
4ce0: 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64  rnal code. The d
4cf0: 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20  ifference is.** 
4d00: 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63  that if a malloc
4d10: 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69  () fails in sqli
4d20: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
4d30: 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20  ion(), an error 
4d40: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  code.** is retur
4d50: 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c  ned and the mall
4d60: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c  ocFailed flag cl
4d70: 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  eared. .*/.int s
4d80: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
4d90: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
4da0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4db0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
4dc0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
4dd0: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73  enc,.  void *pUs
4de0: 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28  erData,.  void (
4df0: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
4e00: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
4e10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
4e20: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
4e30: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
4e40: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
4e50: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
4e60: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
4e70: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
4e80: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
4e90: 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65  t nName;..  asse
4ea0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
4eb0: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
4ec0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63  ) );.  if( zFunc
4ed0: 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20  tionName==0 ||. 
4ee0: 20 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28       (xFunc && (
4ef0: 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29  xFinal || xStep)
4f00: 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46  ) || .      (!xF
4f10: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26  unc && (xFinal &
4f20: 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  & !xStep)) ||.  
4f30: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
4f40: 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70  !xFinal && xStep
4f50: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72  )) ||.      (nAr
4f60: 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c  g<-1 || nArg>SQL
4f70: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
4f80: 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28  _ARG) ||.      (
4f90: 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c  255<(nName = sql
4fa0: 69 74 65 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a  ite3Strlen(db, z
4fb0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20  FunctionName))) 
4fc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4fd0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 45  ror(db, SQLITE_E
4fe0: 52 52 4f 52 2c 20 22 62 61 64 20 70 61 72 61 6d  RROR, "bad param
4ff0: 65 74 65 72 73 22 29 3b 0a 20 20 20 20 72 65 74  eters");.    ret
5000: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
5010: 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66  ;.  }.  .#ifndef
5020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
5030: 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54  16.  /* If SQLIT
5040: 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69  E_UTF16 is speci
5050: 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f  fied as the enco
5060: 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73  ding type, trans
5070: 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74  form this.  ** t
5080: 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  o one of SQLITE_
5090: 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54  UTF16LE or SQLIT
50a0: 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20  E_UTF16BE using 
50b0: 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
50c0: 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72  UTF16NATIVE macr
50d0: 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  o. SQLITE_UTF16 
50e0: 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
50f0: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  rnally..  **.  *
5100: 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20  * If SQLITE_ANY 
5110: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64  is specified, ad
5120: 64 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73  d three versions
5130: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
5140: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73  .  ** to the has
5150: 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  h table..  */.  
5160: 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  if( enc==SQLITE_
5170: 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63  UTF16 ){.    enc
5180: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
5190: 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69  ATIVE;.  }else i
51a0: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41  f( enc==SQLITE_A
51b0: 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  NY ){.    int rc
51c0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
51d0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
51e0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
51f0: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
5200: 38 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65  8,.         pUse
5210: 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53  rData, xFunc, xS
5220: 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20  tep, xFinal);.  
5230: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5240: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
5250: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
5260: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
5270: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
5280: 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20 20  ITE_UTF16LE,.   
5290: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
52a0: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
52b0: 78 46 69 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  xFinal);.    }. 
52c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
52d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
52e0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
52f0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
5300: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
5310: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
5320: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
5330: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
5340: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
5350: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
5360: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
5370: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
5380: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
5390: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
53a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
53b0: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
53c0: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
53d0: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
53e0: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
53f0: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
5400: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
5410: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
5420: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
5430: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
5440: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
5450: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
5460: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
5470: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
5480: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 65  , nName, nArg, e
5490: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  nc, 0);.  if( p 
54a0: 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d  && p->iPrefEnc==
54b0: 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d  enc && p->nArg==
54c0: 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20  nArg ){.    if( 
54d0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
54e0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
54f0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
5500: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
5510: 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "Unable to del
5520: 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d  ete/modify user-
5530: 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20  function due to 
5540: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
5550: 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  s");.      asser
5560: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
5570: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
5580: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
55a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
55b0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
55c0: 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  ts(db);.    }.  
55d0: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
55e0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
55f0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
5600: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 65 6e 63  nName, nArg, enc
5610: 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70  , 1);.  assert(p
5620: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
5630: 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20  iled);.  if( !p 
5640: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5650: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
5660: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a    p->flags = 0;.
5670: 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75    p->xFunc = xFu
5680: 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d  nc;.  p->xStep =
5690: 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69   xStep;.  p->xFi
56a0: 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b  nalize = xFinal;
56b0: 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20  .  p->pUserData 
56c0: 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70  = pUserData;.  p
56d0: 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 3b 0a 20  ->nArg = nArg;. 
56e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
56f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
5700: 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63  te new user func
5710: 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tions..*/.int sq
5720: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
5730: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
5740: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
5750: 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  ar *zFunctionNam
5760: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
5770: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
5780: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
5790: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
57a0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
57b0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
57c0: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
57d0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
57e0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
57f0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
5800: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
5810: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74  ntext*).){.  int
5820: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
5830: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
5840: 75 74 65 78 29 3b 0a 20 20 72 63 20 3d 20 73 71  utex);.  rc = sq
5850: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
5860: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
5870: 65 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  e, nArg, enc, p,
5880: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
5890: 46 69 6e 61 6c 29 3b 0a 20 20 72 63 20 3d 20 73  Final);.  rc = s
58a0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
58b0: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
58c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
58d0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
58e0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
58f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
5900: 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  16.int sqlite3_c
5910: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
5920: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
5930: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
5940: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
5950: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
5960: 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64  eTextRep,.  void
5970: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
5980: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
5990: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
59a0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
59b0: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
59c0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
59d0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
59e0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
59f0: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
5a00: 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  ext*).){.  int r
5a10: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63  c;.  char *zFunc
5a20: 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  8;.  sqlite3_mut
5a30: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
5a40: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
5a50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5a60: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
5a70: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
5a80: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
5a90: 2c 20 2d 31 29 3b 0a 20 20 72 63 20 3d 20 73 71  , -1);.  rc = sq
5aa0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
5ab0: 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67  db, zFunc8, nArg
5ac0: 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78  , eTextRep, p, x
5ad0: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
5ae0: 6e 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nal);.  sqlite3_
5af0: 66 72 65 65 28 7a 46 75 6e 63 38 29 3b 0a 20 20  free(zFunc8);.  
5b00: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
5b10: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
5b20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5b30: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
5b40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
5b50: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ndif.../*.** Dec
5b60: 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e 63  lare that a func
5b70: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76  tion has been ov
5b80: 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69  erloaded by a vi
5b90: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
5ba0: 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  ** If the functi
5bb0: 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  on already exist
5bc0: 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 67  s as a regular g
5bd0: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20  lobal function, 
5be0: 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
5bf0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
5c00: 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f    If the functio
5c10: 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
5c20: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a  , then create.**
5c30: 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20   a new one that 
5c40: 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61 20  always throws a 
5c50: 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20  run-time error. 
5c60: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72   .**.** When vir
5c70: 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65  tual tables inte
5c80: 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  nd to provide an
5c90: 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63   overloaded func
5ca0: 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68  tion, they.** sh
5cb0: 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72  ould call this r
5cc0: 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73  outine to make s
5cd0: 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66  ure the global f
5ce0: 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a  unction exists..
5cf0: 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ** A global func
5d00: 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20  tion must exist 
5d10: 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d  in order for nam
5d20: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20  e resolution to 
5d30: 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79  work.** properly
5d40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5d50: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
5d60: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
5d70: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
5d80: 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  *zName,.  int nA
5d90: 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d  rg.){.  int nNam
5da0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
5db0: 6e 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  n(db, zName);.  
5dc0: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
5dd0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
5de0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
5df0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
5e00: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  ion(db, zName, n
5e10: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
5e20: 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29  TE_UTF8, 0)==0 )
5e30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
5e40: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d  ateFunc(db, zNam
5e50: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
5e60: 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20  UTF8,.          
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
5e80: 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e  qlite3InvalidFun
5e90: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
5ea0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
5eb0: 41 70 69 45 78 69 74 28 64 62 2c 20 53 51 4c 49  ApiExit(db, SQLI
5ec0: 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65  TE_OK);.  sqlite
5ed0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
5ee0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
5ef0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
5f00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5f10: 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  ACE./*.** Regist
5f20: 65 72 20 61 20 74 72 61 63 65 20 66 75 6e 63 74  er a trace funct
5f30: 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66  ion.  The pArg f
5f40: 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
5f50: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 74 72  ly registered tr
5f60: 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ace.** is return
5f70: 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
5f80: 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f  LL trace functio
5f90: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
5fa0: 74 72 61 63 69 6e 67 20 69 73 20 65 78 65 63 75  tracing is execu
5fb0: 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c  tes.  A non-NULL
5fc0: 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20 70  .** trace is a p
5fd0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
5fe0: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
5ff0: 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74 61 72  oked at the star
6000: 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c  t of each.** SQL
6010: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
6020: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74 72 61  oid *sqlite3_tra
6030: 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ce(sqlite3 *db, 
6040: 76 6f 69 64 20 28 2a 78 54 72 61 63 65 29 28 76  void (*xTrace)(v
6050: 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
6060: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
6070: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20    void *pOld;.  
6080: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6090: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
60a0: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72    pOld = db->pTr
60b0: 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54  aceArg;.  db->xT
60c0: 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20  race = xTrace;. 
60d0: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d   db->pTraceArg =
60e0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
60f0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
6100: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
6110: 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  n pOld;.}./*.** 
6120: 52 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69  Register a profi
6130: 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  le function.  Th
6140: 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
6150: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
6160: 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c  tered .** profil
6170: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  e function is re
6180: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
6190: 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66  A NULL profile f
61a0: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
61b0: 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20  at no profiling 
61c0: 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
61d0: 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66  non-NULL.** prof
61e0: 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ile is a pointer
61f0: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
6200: 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
6210: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
6220: 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20   of.** each SQL 
6230: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
6240: 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  s run..*/.void *
6250: 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
6260: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
6270: 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c    void (*xProfil
6280: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
6290: 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74  har*,sqlite_uint
62a0: 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
62b0: 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  g.){.  void *pOl
62c0: 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  d;.  sqlite3_mut
62d0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
62e0: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
62f0: 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20  ->pProfileArg;. 
6300: 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20   db->xProfile = 
6310: 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e  xProfile;.  db->
6320: 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20 70 41  pProfileArg = pA
6330: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
6340: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
6350: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
6360: 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Old;.}.#endif /*
6370: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
6380: 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 20 45 58 50 45  CE */../*** EXPE
6390: 52 49 4d 45 4e 54 41 4c 20 2a 2a 2a 0a 2a 2a 0a  RIMENTAL ***.**.
63a0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75  ** Register a fu
63b0: 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
63c0: 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  oked when a tran
63d0: 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73  saction comments
63e0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f  ..** If the invo
63f0: 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  ked function ret
6400: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
6410: 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62  hen the commit b
6420: 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c  ecomes a.** roll
6430: 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  back..*/.void *s
6440: 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f  qlite3_commit_ho
6450: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
6460: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
6470: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
6480: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
6490: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ase */.  int (*x
64a0: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29  Callback)(void*)
64b0: 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ,  /* Function t
64c0: 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68  o invoke on each
64d0: 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69   commit */.  voi
64e0: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
64f0: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
6500: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
6510: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
6520: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
6530: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
6540: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
6550: 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  = db->pCommitArg
6560: 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  ;.  db->xCommitC
6570: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
6580: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d  ack;.  db->pComm
6590: 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  itArg = pArg;.  
65a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
65b0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
65c0: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
65d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
65e0: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
65f0: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
6600: 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64  ime a row is upd
6610: 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65  ated,.** inserte
6620: 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69  d or deleted usi
6630: 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65  ng this database
6640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
6650: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 70  void *sqlite3_up
6660: 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  date_hook(.  sql
6670: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6680: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
6690: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
66a0: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
66b0: 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b  void (*xCallback
66c0: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72  )(void*,int,char
66d0: 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f   const *,char co
66e0: 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74  nst *,sqlite_int
66f0: 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
6700: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
6710: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
6720: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
6730: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  ){.  void *pRet;
6740: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6750: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
6760: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
6770: 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62  pUpdateArg;.  db
6780: 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  ->xUpdateCallbac
6790: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
67a0: 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20   db->pUpdateArg 
67b0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
67c0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
67d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
67e0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
67f0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
6800: 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
6810: 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
6820: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
6830: 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79  olled.** back by
6840: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
6850: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
6860: 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c  id *sqlite3_roll
6870: 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  back_hook(.  sql
6880: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6890: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
68a0: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
68b0: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
68c0: 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b  void (*xCallback
68d0: 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c  )(void*), /* Cal
68e0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
68f0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6910: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
6920: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
6930: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
6940: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6950: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6960: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f    pRet = db->pRo
6970: 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d  llbackArg;.  db-
6980: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
6990: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
69a0: 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41    db->pRollbackA
69b0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
69c0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
69d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
69e0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
69f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6a00: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
6a10: 72 65 61 74 65 20 61 20 63 6f 6e 6e 65 63 74 69  reate a connecti
6a20: 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  on to a database
6a30: 20 42 54 72 65 65 0a 2a 2a 20 64 72 69 76 65 72   BTree.** driver
6a40: 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
6a50: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
6a60: 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 61 74   file, then that
6a70: 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6f 70 65 6e   file is.** open
6a80: 65 64 20 61 6e 64 20 75 73 65 64 2e 20 20 49 66  ed and used.  If
6a90: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
6aa0: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
6ab0: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 0a 2a 2a 20  emory:" then.** 
6ac0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
6ad0: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
6ae0: 20 28 61 6e 64 20 69 73 20 74 68 75 73 20 66 6f   (and is thus fo
6af0: 72 67 6f 74 74 65 6e 20 61 73 20 73 6f 6f 6e 20  rgotten as soon 
6b00: 61 73 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  as.** the connec
6b10: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 29  tion is closed.)
6b20: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
6b30: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20  s NULL then the 
6b40: 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 61  database.** is a
6b50: 20 22 76 69 72 74 75 61 6c 22 20 64 61 74 61 62   "virtual" datab
6b60: 61 73 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e  ase for transien
6b70: 74 20 75 73 65 20 6f 6e 6c 79 20 61 6e 64 20 69  t use only and i
6b80: 73 20 64 65 6c 65 74 65 64 20 61 73 0a 2a 2a 20  s deleted as.** 
6b90: 73 6f 6f 6e 20 61 73 20 74 68 65 20 63 6f 6e 6e  soon as the conn
6ba0: 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64  ection is closed
6bb0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 69 72 74 75 61  ..**.** A virtua
6bc0: 6c 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  l database can b
6bd0: 65 20 65 69 74 68 65 72 20 61 20 64 69 73 6b 20  e either a disk 
6be0: 66 69 6c 65 20 28 74 68 61 74 20 69 73 20 61 75  file (that is au
6bf0: 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 64  tomatically.** d
6c00: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
6c10: 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 29 20  file is closed) 
6c20: 6f 72 20 69 74 20 61 6e 20 62 65 20 68 65 6c 64  or it an be held
6c30: 20 65 6e 74 69 72 65 6c 79 20 69 6e 20 6d 65 6d   entirely in mem
6c40: 6f 72 79 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e  ory,.** dependin
6c50: 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 73 20  g on the values 
6c60: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 54 45  of the SQLITE_TE
6c70: 4d 50 5f 53 54 4f 52 45 20 63 6f 6d 70 69 6c 65  MP_STORE compile
6c80: 2d 74 69 6d 65 20 6d 61 63 72 6f 20 61 6e 64 20  -time macro and 
6c90: 74 68 65 0a 2a 2a 20 64 62 2d 3e 74 65 6d 70 5f  the.** db->temp_
6ca0: 73 74 6f 72 65 20 76 61 72 69 61 62 6c 65 2c 20  store variable, 
6cb0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
6cc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
6cd0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  :.**.**   SQLITE
6ce0: 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20  _TEMP_STORE     
6cf0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20  db->temp_store  
6d00: 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74     Location of t
6d10: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
6d20: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
6d70: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
6d80: 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
6da0: 65 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  e.**   1        
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dd0: 66 69 6c 65 0a 2a 2a 20 20 20 31 20 20 20 20 20  file.**   1     
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
6e00: 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 31     memory.**   1
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
6e30: 20 20 20 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20          file.** 
6e40: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
6e50: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
6e60: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 0a             file.
6e70: 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
6e80: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
6ea0: 6d 6f 72 79 0a 2a 2a 20 20 20 32 20 20 20 20 20  mory.**   2     
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ec0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
6ed0: 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 33     memory.**   3
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ef0: 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
6f00: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a          memory.*
6f10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
6f20: 65 65 46 61 63 74 6f 72 79 28 0a 20 20 63 6f 6e  eeFactory(.  con
6f30: 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  st sqlite3 *db, 
6f40: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64         /* Main d
6f50: 61 74 61 62 61 73 65 20 77 68 65 6e 20 6f 70 65  atabase when ope
6f60: 6e 69 6e 67 20 61 75 78 20 6f 74 68 65 72 77 69  ning aux otherwi
6f70: 73 65 20 30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se 0 */.  const 
6f80: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
6f90: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
6fa0: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
6fb0: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
6fc0: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f  abase */.  int o
6fd0: 6d 69 74 4a 6f 75 72 6e 61 6c 2c 20 20 20 20 20  mitJournal,     
6fe0: 20 20 20 20 20 2f 2a 20 69 66 20 54 52 55 45 20       /* if TRUE 
6ff0: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6a 6f 75 72  then do not jour
7000: 6e 61 6c 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  nal this file */
7010: 0a 20 20 69 6e 74 20 6e 43 61 63 68 65 2c 20 20  .  int nCache,  
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7030: 48 6f 77 20 6d 61 6e 79 20 70 61 67 65 73 20 69  How many pages i
7040: 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
7050: 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
7060: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
7070: 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
7080: 74 68 72 6f 75 67 68 20 74 6f 20 76 66 73 4f 70  through to vfsOp
7090: 65 6e 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  en */.  Btree **
70a0: 70 70 42 74 72 65 65 20 20 20 20 20 20 20 20 20  ppBtree         
70b0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
70c0: 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
70d0: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
70e0: 0a 29 7b 0a 20 20 69 6e 74 20 62 74 46 6c 61 67  .){.  int btFlag
70f0: 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  s = 0;.  int rc;
7100: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
7110: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7120: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
7130: 20 61 73 73 65 72 74 28 20 70 70 42 74 72 65 65   assert( ppBtree
7140: 20 21 3d 20 30 29 3b 0a 20 20 69 66 28 20 6f 6d   != 0);.  if( om
7150: 69 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  itJournal ){.   
7160: 20 62 74 46 6c 61 67 73 20 7c 3d 20 42 54 52 45   btFlags |= BTRE
7170: 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 3b 0a  E_OMIT_JOURNAL;.
7180: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c    }.  if( db->fl
7190: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 52  ags & SQLITE_NoR
71a0: 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 62  eadlock ){.    b
71b0: 74 46 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f  tFlags |= BTREE_
71c0: 4e 4f 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d  NO_READLOCK;.  }
71d0: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
71e0: 3d 3d 30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ==0 ){.#if SQLIT
71f0: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a  E_TEMP_STORE==0.
7200: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
7210: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 6e  g */.#endif.#ifn
7220: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7230: 4d 45 4d 4f 52 59 44 42 0a 23 69 66 20 53 51 4c  MEMORYDB.#if SQL
7240: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
7250: 31 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 74 65  1.    if( db->te
7260: 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 20 7a 46  mp_store==2 ) zF
7270: 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f  ilename = ":memo
7280: 72 79 3a 22 3b 0a 23 65 6e 64 69 66 0a 23 69 66  ry:";.#endif.#if
7290: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
72a0: 52 45 3d 3d 32 0a 20 20 20 20 69 66 28 20 64 62  RE==2.    if( db
72b0: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20  ->temp_store!=1 
72c0: 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a  ) zFilename = ":
72d0: 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e 64 69 66  memory:";.#endif
72e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
72f0: 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 20 20 7a 46  _STORE==3.    zF
7300: 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f  ilename = ":memo
7310: 72 79 3a 22 3b 0a 23 65 6e 64 69 66 0a 23 65 6e  ry:";.#endif.#en
7320: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
7330: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 2a 2f 0a 20  IT_MEMORYDB */. 
7340: 20 7d 0a 0a 20 20 69 66 28 20 28 76 66 73 46 6c   }..  if( (vfsFl
7350: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
7360: 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
7370: 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c   (zFilename==0 |
7380: 7c 20 2a 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 29  | *zFilename==0)
7390: 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73   ){.    vfsFlags
73a0: 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e   = (vfsFlags & ~
73b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
73c0: 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _DB) | SQLITE_OP
73d0: 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a  EN_TEMP_DB;.  }.
73e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
73f0: 72 65 65 4f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  reeOpen(zFilenam
7400: 65 2c 20 28 73 71 6c 69 74 65 33 20 2a 29 64 62  e, (sqlite3 *)db
7410: 2c 20 70 70 42 74 72 65 65 2c 20 62 74 46 6c 61  , ppBtree, btFla
7420: 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 0a  gs, vfsFlags);..
7430: 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
7440: 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
7450: 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
7460: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
7470: 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a  size to the.  **
7480: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20   default value. 
7490: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 63  Except, if the c
74a0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4f 70 65 6e  all to BtreeOpen
74b0: 28 29 20 72 65 74 75 72 6e 65 64 20 61 20 68 61  () returned a ha
74c0: 6e 64 6c 65 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f  ndle.  ** open o
74d0: 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68  n an existing sh
74e0: 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65  ared pager-cache
74f0: 2c 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  , do not change 
7500: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
7510: 0a 20 20 2a 2a 20 73 69 7a 65 2e 0a 20 20 2a 2f  .  ** size..  */
7520: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7530: 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74  E_OK && 0==sqlit
7540: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 2a 70  e3BtreeSchema(*p
7550: 70 42 74 72 65 65 2c 20 30 2c 20 30 29 20 29 7b  pBtree, 0, 0) ){
7560: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
7570: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 2a 70  eSetCacheSize(*p
7580: 70 42 74 72 65 65 2c 20 6e 43 61 63 68 65 29 3b  pBtree, nCache);
7590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
75a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
75b0: 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  n UTF-8 encoded 
75c0: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
75d0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
75e0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
75f0: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
7600: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
7610: 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20  _errmsg(sqlite3 
7620: 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *db){.  const ch
7630: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  ar *z;.  if( !db
7640: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
7650: 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
7660: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a  ITE_NOMEM);.  }.
7670: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
7680: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
7690: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
76a0: 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
76b0: 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 29  r(SQLITE_MISUSE)
76c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
76d0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
76e0: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
76f0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
7700: 6c 65 64 20 29 3b 0a 20 20 7a 20 3d 20 28 63 68  led );.  z = (ch
7710: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
7720: 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29  e_text(db->pErr)
7730: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
7740: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
7750: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20  .  if( z==0 ){. 
7760: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72     z = sqlite3Er
7770: 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65  rStr(db->errCode
7780: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
7790: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
77a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
77b0: 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
77c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
77d0: 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  6./*.** Return U
77e0: 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e  TF-16 encoded En
77f0: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
7800: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
7810: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
7820: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
7830: 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65   void *sqlite3_e
7840: 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20  rrmsg16(sqlite3 
7850: 2a 64 62 29 7b 0a 20 20 2f 2a 20 42 65 63 61 75  *db){.  /* Becau
7860: 73 65 20 61 6c 6c 20 74 68 65 20 63 68 61 72 61  se all the chara
7870: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 74 72  cters in the str
7880: 69 6e 67 20 61 72 65 20 69 6e 20 74 68 65 20 75  ing are in the u
7890: 6e 69 63 6f 64 65 0a 20 20 2a 2a 20 72 61 6e 67  nicode.  ** rang
78a0: 65 20 30 78 30 30 2d 30 78 46 46 2c 20 69 66 20  e 0x00-0xFF, if 
78b0: 77 65 20 70 61 64 20 74 68 65 20 62 69 67 2d 65  we pad the big-e
78c0: 6e 64 69 61 6e 20 73 74 72 69 6e 67 20 77 69 74  ndian string wit
78d0: 68 20 61 20 0a 20 20 2a 2a 20 7a 65 72 6f 20 62  h a .  ** zero b
78e0: 79 74 65 2c 20 77 65 20 63 61 6e 20 6f 62 74 61  yte, we can obta
78f0: 69 6e 20 74 68 65 20 6c 69 74 74 6c 65 2d 65 6e  in the little-en
7900: 64 69 61 6e 20 73 74 72 69 6e 67 20 77 69 74 68  dian string with
7910: 0a 20 20 2a 2a 20 26 62 69 67 5f 65 6e 64 69 61  .  ** &big_endia
7920: 6e 5b 31 5d 2e 0a 20 20 2a 2f 0a 20 20 73 74 61  n[1]..  */.  sta
7930: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6f  tic const char o
7940: 75 74 4f 66 4d 65 6d 42 65 5b 5d 20 3d 20 7b 0a  utOfMemBe[] = {.
7950: 20 20 20 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27      0, 'o', 0, '
7960: 75 27 2c 20 30 2c 20 27 74 27 2c 20 30 2c 20 27  u', 0, 't', 0, '
7970: 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 6f 27 2c   ', .    0, 'o',
7980: 20 30 2c 20 27 66 27 2c 20 30 2c 20 27 20 27 2c   0, 'f', 0, ' ',
7990: 20 0a 20 20 20 20 30 2c 20 27 6d 27 2c 20 30 2c   .    0, 'm', 0,
79a0: 20 27 65 27 2c 20 30 2c 20 27 6d 27 2c 20 30 2c   'e', 0, 'm', 0,
79b0: 20 27 6f 27 2c 20 30 2c 20 27 72 27 2c 20 30 2c   'o', 0, 'r', 0,
79c0: 20 27 79 27 2c 20 30 2c 20 30 2c 20 30 0a 20 20   'y', 0, 0, 0.  
79d0: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
79e0: 74 20 63 68 61 72 20 6d 69 73 75 73 65 42 65 20  t char misuseBe 
79f0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20 27 6c  [] = {.    0, 'l
7a00: 27 2c 20 30 2c 20 27 69 27 2c 20 30 2c 20 27 62  ', 0, 'i', 0, 'b
7a10: 27 2c 20 30 2c 20 27 72 27 2c 20 30 2c 20 27 61  ', 0, 'r', 0, 'a
7a20: 27 2c 20 30 2c 20 27 72 27 2c 20 30 2c 20 27 79  ', 0, 'r', 0, 'y
7a30: 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20 20 20  ', 0, ' ', .    
7a40: 30 2c 20 27 72 27 2c 20 30 2c 20 27 6f 27 2c 20  0, 'r', 0, 'o', 
7a50: 30 2c 20 27 75 27 2c 20 30 2c 20 27 74 27 2c 20  0, 'u', 0, 't', 
7a60: 30 2c 20 27 69 27 2c 20 30 2c 20 27 6e 27 2c 20  0, 'i', 0, 'n', 
7a70: 30 2c 20 27 65 27 2c 20 30 2c 20 27 20 27 2c 20  0, 'e', 0, ' ', 
7a80: 0a 20 20 20 20 30 2c 20 27 63 27 2c 20 30 2c 20  .    0, 'c', 0, 
7a90: 27 61 27 2c 20 30 2c 20 27 6c 27 2c 20 30 2c 20  'a', 0, 'l', 0, 
7aa0: 27 6c 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20  'l', 0, 'e', 0, 
7ab0: 27 64 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20  'd', 0, ' ', .  
7ac0: 20 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27 75 27    0, 'o', 0, 'u'
7ad0: 2c 20 30 2c 20 27 74 27 2c 20 30 2c 20 27 20 27  , 0, 't', 0, ' '
7ae0: 2c 20 0a 20 20 20 20 30 2c 20 27 6f 27 2c 20 30  , .    0, 'o', 0
7af0: 2c 20 27 66 27 2c 20 30 2c 20 27 20 27 2c 20 0a  , 'f', 0, ' ', .
7b00: 20 20 20 20 30 2c 20 27 73 27 2c 20 30 2c 20 27      0, 's', 0, '
7b10: 65 27 2c 20 30 2c 20 27 71 27 2c 20 30 2c 20 27  e', 0, 'q', 0, '
7b20: 75 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 27  u', 0, 'e', 0, '
7b30: 6e 27 2c 20 30 2c 20 27 63 27 2c 20 30 2c 20 27  n', 0, 'c', 0, '
7b40: 65 27 2c 20 30 2c 20 30 2c 20 30 0a 20 20 7d 3b  e', 0, 0, 0.  };
7b50: 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ..  const void *
7b60: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
7b70: 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
7b80: 20 2a 29 28 26 6f 75 74 4f 66 4d 65 6d 42 65 5b   *)(&outOfMemBe[
7b90: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
7ba0: 56 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  VE==SQLITE_UTF16
7bb0: 4c 45 3f 31 3a 30 5d 29 3b 0a 20 20 7d 0a 20 20  LE?1:0]);.  }.  
7bc0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
7bd0: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
7be0: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
7bf0: 6e 20 28 76 6f 69 64 20 2a 29 28 26 6d 69 73 75  n (void *)(&misu
7c00: 73 65 42 65 5b 53 51 4c 49 54 45 5f 55 54 46 31  seBe[SQLITE_UTF1
7c10: 36 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54 45 5f  6NATIVE==SQLITE_
7c20: 55 54 46 31 36 4c 45 3f 31 3a 30 5d 29 3b 0a 20  UTF16LE?1:0]);. 
7c30: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
7c40: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
7c50: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
7c60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7c70: 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65   );.  z = sqlite
7c80: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
7c90: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 69 66 28 20  b->pErr);.  if( 
7ca0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  z==0 ){.    sqli
7cb0: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
7cc0: 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c  b->pErr, -1, sql
7cd0: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
7ce0: 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20 20  rrCode),.       
7cf0: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
7d00: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
7d10: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
7d20: 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
7d30: 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  pErr);.  }.  /* 
7d40: 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68  A malloc() may h
7d50: 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69  ave failed withi
7d60: 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  n the call to sq
7d70: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7d80: 31 36 28 29 0a 20 20 2a 2a 20 61 62 6f 76 65 2e  16().  ** above.
7d90: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
7da0: 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 64  case, then the d
7db0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7dc0: 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20 20  flag needs to.  
7dd0: 2a 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  ** be cleared be
7de0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
7df0: 44 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c 79  Do this directly
7e00: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61  , instead of via
7e10: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69  .  ** sqlite3Api
7e20: 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64  Exit(), to avoid
7e30: 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74   setting the dat
7e40: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72  abase handle err
7e50: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 2a 2f  or message..  */
7e60: 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  .  db->mallocFai
7e70: 6c 65 64 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  led = 0;.  sqlit
7e80: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
7e90: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
7ea0: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
7eb0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
7ec0: 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
7ed0: 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
7ee0: 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ecent error code
7ef0: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e   generated by an
7f00: 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e   SQLite routine.
7f10: 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70   If NULL is.** p
7f20: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
7f30: 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d  nction, we assum
7f40: 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  e a malloc() fai
7f50: 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74  led during sqlit
7f60: 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e  e3_open()..*/.in
7f70: 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  t sqlite3_errcod
7f80: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
7f90: 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
7fa0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
7fb0: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
7fc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7fd0: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 69  _MISUSE;.  }.  i
7fe0: 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61  f( !db || db->ma
7ff0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
8000: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8010: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74  NOMEM;.  }.  ret
8020: 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20  urn db->errCode 
8030: 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
8040: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
8050: 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66   new collating f
8060: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61  unction for data
8070: 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20  base "db".  The 
8080: 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a  name is zName.**
8090: 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e   and the encodin
80a0: 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61  g is enc..*/.sta
80b0: 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f  tic int createCo
80c0: 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
80d0: 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
80e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
80f0: 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
8100: 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
8110: 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
8120: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
8130: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
8140: 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28  ,.  void(*xDel)(
8150: 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c  void*).){.  Coll
8160: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
8170: 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74 20 6e 4e  t enc2;.  int nN
8180: 61 6d 65 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ame;.  .  assert
8190: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
81a0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
81b0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  );..  /* If SQLI
81c0: 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
81d0: 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
81e0: 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
81f0: 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
8200: 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
8210: 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
8220: 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
8230: 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
8240: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
8250: 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
8260: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
8270: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
8280: 65 6e 63 32 20 3d 20 65 6e 63 20 26 20 7e 53 51  enc2 = enc & ~SQ
8290: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
82a0: 45 44 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d  ED;.  if( enc2==
82b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a  SQLITE_UTF16 ){.
82c0: 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54      enc2 = SQLIT
82d0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
82e0: 20 7d 0a 20 20 69 66 28 20 28 65 6e 63 32 26 7e   }.  if( (enc2&~
82f0: 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  3)!=0 ){.    ret
8300: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
8310: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  E;.  }..  /* Che
8320: 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ck if this call 
8330: 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72  is removing or r
8340: 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73  eplacing an exis
8350: 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  ting collation .
8360: 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49    ** sequence. I
8370: 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20  f so, and there 
8380: 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
8390: 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20  return busy. If 
83a0: 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e  there.  ** are n
83b0: 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e  o active VMs, in
83c0: 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65  validate any pre
83d0: 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
83e0: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ents..  */.  nNa
83f0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
8400: 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  en(db, zName);. 
8410: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
8420: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
8430: 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
8440: 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66   nName, 0);.  if
8450: 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c  ( pColl && pColl
8460: 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66  ->xCmp ){.    if
8470: 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ( db->activeVdbe
8480: 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Cnt ){.      sql
8490: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
84a0: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
84b0: 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 64      "Unable to d
84c0: 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c  elete/modify col
84d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
84e0: 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74  due to active st
84f0: 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20  atements");.    
8500: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8510: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
8520: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
8530: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
8540: 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  db);..    /* If 
8550: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8560: 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65  ce pColl was cre
8570: 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79  ated directly by
8580: 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a   a call to.    *
8590: 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
85a0: 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20  _collation, and 
85b0: 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79  not generated by
85c0: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c   synthCollSeq(),
85d0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79  .    ** then any
85e0: 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20   copies made by 
85f0: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e  synthCollSeq() n
8600: 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  eed to be invali
8610: 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c  dated..    ** Al
8620: 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65  so, collation de
8630: 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53  structor - CollS
8640: 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63  eq.xDel() - func
8650: 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20  tion may need.  
8660: 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65    ** to be calle
8670: 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69  d..    */ .    i
8680: 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26  f( (pColl->enc &
8690: 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41   ~SQLITE_UTF16_A
86a0: 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b  LIGNED)==enc2 ){
86b0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
86c0: 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48  aColl = sqlite3H
86d0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f  ashFind(&db->aCo
86e0: 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  llSeq, zName, nN
86f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ame);.      int 
8700: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
8710: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
8720: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20       CollSeq *p 
8730: 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  = &aColl[j];.   
8740: 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d       if( p->enc=
8750: 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20  =pColl->enc ){. 
8760: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
8770: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
8780: 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70      p->xDel(p->p
8790: 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  User);.         
87a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
87b0: 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  xCmp = 0;.      
87c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
87d0: 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d  }.  }..  pColl =
87e0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
87f0: 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32  Seq(db, (u8)enc2
8800: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
8810: 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20  1);.  if( pColl 
8820: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 78 43  ){.    pColl->xC
8830: 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
8840: 20 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20     pColl->pUser 
8850: 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43 6f 6c  = pCtx;.    pCol
8860: 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a  l->xDel = xDel;.
8870: 20 20 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d      pColl->enc =
8880: 20 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53   enc2 | (enc & S
8890: 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
88a0: 4e 45 44 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  NED);.  }.  sqli
88b0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
88c0: 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65  ITE_OK, 0);.  re
88d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
88e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  }.../*.** This a
88f0: 72 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72  rray defines har
8900: 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f  d upper bounds o
8910: 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20  n limit values. 
8920: 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   The.** initiali
8930: 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74  zer must be kept
8940: 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68   in sync with th
8950: 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a  e SQLITE_LIMIT_*
8960: 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20  .** #defines in 
8970: 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74  sqlite3.h..*/.st
8980: 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61  atic const int a
8990: 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a  HardLimit[] = {.
89a0: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e    SQLITE_MAX_LEN
89b0: 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
89c0: 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20  X_SQL_LENGTH,.  
89d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
89e0: 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  N,.  SQLITE_MAX_
89f0: 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51  EXPR_DEPTH,.  SQ
8a00: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
8a10: 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49  D_SELECT,.  SQLI
8a20: 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a  TE_MAX_VDBE_OP,.
8a30: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e    SQLITE_MAX_FUN
8a40: 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c  CTION_ARG,.  SQL
8a50: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
8a60: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ,.  SQLITE_MAX_L
8a70: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
8a80: 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
8a90: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
8aa0: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ,.};../*.** Make
8ab0: 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c   sure the hard l
8ac0: 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f  imits are set to
8ad0: 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75   reasonable valu
8ae0: 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  es.*/.#if SQLITE
8af0: 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _MAX_LENGTH<100.
8b00: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
8b10: 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  AX_LENGTH must b
8b20: 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
8b30: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
8b40: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c  _MAX_SQL_LENGTH<
8b50: 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
8b60: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
8b70: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
8b80: 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
8b90: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
8ba0: 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d  _LENGTH>SQLITE_M
8bb0: 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f  AX_LENGTH.# erro
8bc0: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  r SQLITE_MAX_SQL
8bd0: 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74  _LENGTH must not
8be0: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
8bf0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
8c00: 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  TH.#endif.#if SQ
8c10: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
8c20: 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72  D_SELECT<2.# err
8c30: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
8c40: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75  MPOUND_SELECT mu
8c50: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32  st be at least 2
8c60: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
8c70: 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34  TE_MAX_VDBE_OP<4
8c80: 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
8c90: 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73  _MAX_VDBE_OP mus
8ca0: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30  t be at least 40
8cb0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
8cc0: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
8cd0: 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  ARG<0 || SQLITE_
8ce0: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
8cf0: 3e 31 32 37 0a 23 20 65 72 72 6f 72 20 53 51 4c  >127.# error SQL
8d00: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
8d10: 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74  _ARG must be bet
8d20: 77 65 65 6e 20 30 20 61 6e 64 20 31 32 37 0a 23  ween 0 and 127.#
8d30: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
8d40: 5f 4d 41 58 5f 41 54 54 41 43 48 3c 30 20 7c 7c  _MAX_ATTACH<0 ||
8d50: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
8d60: 43 48 3e 33 30 0a 23 20 65 72 72 6f 72 20 53 51  CH>30.# error SQ
8d70: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 20  LITE_MAX_ATTACH 
8d80: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
8d90: 30 20 61 6e 64 20 33 30 0a 23 65 6e 64 69 66 0a  0 and 30.#endif.
8da0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
8db0: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
8dc0: 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
8dd0: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
8de0: 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74  TERN_LENGTH must
8df0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
8e00: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
8e10: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
8e20: 4d 42 45 52 3c 31 0a 23 20 65 72 72 6f 72 20 53  MBER<1.# error S
8e30: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
8e40: 4c 45 5f 4e 55 4d 42 45 52 20 6d 75 73 74 20 62  LE_NUMBER must b
8e50: 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e  e at least 1.#en
8e60: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
8e70: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
8e80: 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74  a limit.  Report
8e90: 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a   the old value..
8ea0: 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64  ** If an invalid
8eb0: 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20   limit index is 
8ec0: 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74  supplied, report
8ed0: 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20   -1..** Make no 
8ee0: 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c  changes but stil
8ef0: 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64  l report the old
8f00: 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a   value if the.**
8f10: 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65   new limit is ne
8f20: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  gative..**.** A 
8f30: 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  new lower limit 
8f40: 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20  does not shrink 
8f50: 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75  existing constru
8f60: 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c  cts..** It merel
8f70: 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63  y prevents new c
8f80: 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65  onstructs that e
8f90: 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a  xceed the limit.
8fa0: 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e  ** from forming.
8fb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
8fc0: 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  limit(sqlite3 *d
8fd0: 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20  b, int limitId, 
8fe0: 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20  int newLimit){. 
8ff0: 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 20   int oldLimit;. 
9000: 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
9010: 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
9020: 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
9030: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
9040: 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
9050: 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
9060: 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
9070: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  >=0 ){.    if( n
9080: 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d  ewLimit>aHardLim
9090: 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20  it[limitId] ){. 
90a0: 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
90b0: 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
90c0: 49 64 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  Id];.    }.    d
90d0: 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
90e0: 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  d] = newLimit;. 
90f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c   }.  return oldL
9100: 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  imit;.}../*.** T
9110: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
9120: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65   the work of ope
9130: 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ning a database 
9140: 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20  on behalf of.** 
9150: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61  sqlite3_open() a
9160: 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nd sqlite3_open1
9170: 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73  6(). The databas
9180: 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c  e filename "zFil
9190: 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55  ename"  .** is U
91a0: 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f  TF-8 encoded..*/
91b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
91c0: 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73  Database(.  cons
91d0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
91e0: 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66  e, /* Database f
91f0: 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e  ilename UTF-8 en
9200: 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  coded */.  sqlit
9210: 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
9220: 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
9230: 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
9240: 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  le */.  unsigned
9250: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 2f   flags,        /
9260: 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c  * Operational fl
9270: 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
9280: 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
9290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56  /* Name of the V
92a0: 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  FS to use */.){.
92b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
92c0: 20 69 6e 74 20 72 63 3b 0a 20 20 43 6f 6c 6c 53   int rc;.  CollS
92d0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
92e0: 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
92f0: 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  1;..#ifndef SQLI
9300: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
9310: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
9320: 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
9330: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
9340: 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  rc;.#endif..  if
9350: 28 20 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  ( flags&SQLITE_O
9360: 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20  PEN_NOMUTEX ){. 
9370: 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
9380: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
9390: 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69  emove harmful bi
93a0: 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67  ts from the flag
93b0: 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
93c0: 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51   flags &=  ~( SQ
93d0: 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
93e0: 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
93f0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
9400: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20  OPEN_MAIN_DB |. 
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
9420: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
9430: 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  B | .           
9440: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
9450: 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a  TRANSIENT_DB | .
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
9470: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
9480: 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
9490: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
94a0: 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
94b0: 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  AL | .          
94c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
94d0: 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  _SUBJOURNAL | . 
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
94f0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
9500: 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20  _JOURNAL |.     
9510: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
9520: 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 0a 20 20  _OPEN_NOMUTEX.  
9530: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20             );.. 
9540: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
9550: 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72   sqlite data str
9560: 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d  ucture */.  db =
9570: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
9580: 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  ro( sizeof(sqlit
9590: 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d  e3) );.  if( db=
95a0: 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62  =0 ) goto opendb
95b0: 5f 6f 75 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  _out;.  if( sqli
95c0: 74 65 33 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  te3Config.bFullM
95d0: 75 74 65 78 20 26 26 20 69 73 54 68 72 65 61 64  utex && isThread
95e0: 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  safe ){.    db->
95f0: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
9600: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
9610: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
9620: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
9630: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
9640: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
9650: 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b  );.      db = 0;
9660: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
9670: 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
9680: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
9690: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
96a0: 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
96b0: 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e  k = 0xff;.  db->
96c0: 70 72 69 6f 72 4e 65 77 52 6f 77 69 64 20 3d 20  priorNewRowid = 
96d0: 30 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32  0;.  db->nDb = 2
96e0: 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
96f0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
9700: 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  Y;.  db->aDb = d
9710: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
9720: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64  assert( sizeof(d
9730: 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65  b->aLimit)==size
9740: 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29  of(aHardLimit) )
9750: 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61  ;.  memcpy(db->a
9760: 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69  Limit, aHardLimi
9770: 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t, sizeof(db->aL
9780: 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75  imit));.  db->au
9790: 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
97a0: 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20  db->nextAutovac 
97b0: 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74  = -1;.  db->next
97c0: 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20  Pagesize = 0;.  
97d0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
97e0: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
97f0: 73 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  s.#if SQLITE_DEF
9800: 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  AULT_FILE_FORMAT
9810: 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <4.             
9820: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67      | SQLITE_Leg
9830: 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69  acyFileFmt.#endi
9840: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
9850: 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
9860: 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  NSION.          
9870: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9880: 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65  LoadExtension.#e
9890: 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73  ndif.      ;.  s
98a0: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
98b0: 64 62 2d 3e 61 46 75 6e 63 2c 20 53 51 4c 49 54  db->aFunc, SQLIT
98c0: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
98d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68  );.  sqlite3Hash
98e0: 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  Init(&db->aCollS
98f0: 65 71 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f  eq, SQLITE_HASH_
9900: 53 54 52 49 4e 47 2c 20 30 29 3b 0a 23 69 66 6e  STRING, 0);.#ifn
9910: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9920: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
9930: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
9940: 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 53 51 4c  db->aModule, SQL
9950: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
9960: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64   0);.#endif..  d
9970: 62 2d 3e 70 56 66 73 20 3d 20 73 71 6c 69 74 65  b->pVfs = sqlite
9980: 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29  3_vfs_find(zVfs)
9990: 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 70 56 66  ;.  if( !db->pVf
99a0: 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  s ){.    rc = SQ
99b0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
99c0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
99d0: 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20  TE_MAGIC_SICK;. 
99e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
99f0: 64 62 2c 20 72 63 2c 20 22 6e 6f 20 73 75 63 68  db, rc, "no such
9a00: 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29   vfs: %s", zVfs)
9a10: 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
9a20: 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
9a30: 20 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74   Add the default
9a40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9a50: 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41  nce BINARY. BINA
9a60: 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74  RY works for bot
9a70: 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64  h UTF-8.  ** and
9a80: 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20   UTF-16, so add 
9a90: 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61  a version for ea
9aa0: 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20  ch to avoid any 
9ab0: 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a  unnecessary.  **
9ac0: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68   conversions. Th
9ad0: 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61  e only error tha
9ae0: 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65  t can occur here
9af0: 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   is a malloc() f
9b00: 61 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63  ailure..  */.  c
9b10: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
9b20: 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
9b30: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e  ITE_UTF8, 0, bin
9b40: 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
9b50: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
9b60: 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51  db, "BINARY", SQ
9b70: 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c  LITE_UTF16BE, 0,
9b80: 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
9b90: 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
9ba0: 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
9bb0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
9bc0: 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
9bd0: 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
9be0: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52  llation(db, "RTR
9bf0: 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  IM", SQLITE_UTF8
9c00: 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43  , (void*)1, binC
9c10: 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69  ollFunc, 0);.  i
9c20: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
9c30: 6c 65 64 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  led ){.    db->m
9c40: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
9c50: 47 49 43 5f 53 49 43 4b 3b 0a 20 20 20 20 67 6f  GIC_SICK;.    go
9c60: 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
9c70: 20 7d 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f   }.  db->pDfltCo
9c80: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
9c90: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49  CollSeq(db, SQLI
9ca0: 54 45 5f 55 54 46 38 2c 20 22 42 49 4e 41 52 59  TE_UTF8, "BINARY
9cb0: 22 2c 20 36 2c 20 30 29 3b 0a 20 20 61 73 73 65  ", 6, 0);.  asse
9cc0: 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  rt( db->pDfltCol
9cd0: 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  l!=0 );..  /* Al
9ce0: 73 6f 20 61 64 64 20 61 20 55 54 46 2d 38 20 63  so add a UTF-8 c
9cf0: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
9d00: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9d10: 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65 43  ce. */.  createC
9d20: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f  ollation(db, "NO
9d30: 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54  CASE", SQLITE_UT
9d40: 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c  F8, 0, nocaseCol
9d50: 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
9d60: 0a 20 20 2f 2a 20 53 65 74 20 66 6c 61 67 73 20  .  /* Set flags 
9d70: 6f 6e 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  on the built-in 
9d80: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
9d90: 63 65 73 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66  ces */.  db->pDf
9da0: 6c 74 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 53  ltColl->type = S
9db0: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52  QLITE_COLL_BINAR
9dc0: 59 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  Y;.  pColl = sql
9dd0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9de0: 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
9df0: 20 22 4e 4f 43 41 53 45 22 2c 20 36 2c 20 30 29   "NOCASE", 6, 0)
9e00: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b  ;.  if( pColl ){
9e10: 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 74 79 70 65  .    pColl->type
9e20: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e   = SQLITE_COLL_N
9e30: 4f 43 41 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  OCASE;.  }..  /*
9e40: 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e   Open the backen
9e50: 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65  d database drive
9e60: 72 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46  r */.  db->openF
9e70: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
9e80: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
9e90: 65 46 61 63 74 6f 72 79 28 64 62 2c 20 7a 46 69  eFactory(db, zFi
9ea0: 6c 65 6e 61 6d 65 2c 20 30 2c 20 53 51 4c 49 54  lename, 0, SQLIT
9eb0: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
9ec0: 53 49 5a 45 2c 20 0a 20 20 20 20 20 20 20 20 20  SIZE, .         
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45    flags | SQLITE
9ef0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 2c 0a 20  _OPEN_MAIN_DB,. 
9f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f10: 20 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61            &db->a
9f20: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66  Db[0].pBt);.  if
9f30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9f40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
9f50: 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a  ror(db, rc, 0);.
9f60: 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
9f70: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43  SQLITE_MAGIC_SIC
9f80: 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  K;.    goto open
9f90: 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62  db_out;.  }.  db
9fa0: 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61  ->aDb[0].pSchema
9fb0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
9fc0: 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  Get(db, db->aDb[
9fd0: 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61  0].pBt);.  db->a
9fe0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[1].pSchema = 
9ff0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
a000: 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20  (db, 0);...  /* 
a010: 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65  The default safe
a020: 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65  ty_level for the
a030: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
a040: 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68  s 'full'; for th
a050: 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61  e temp.  ** data
a060: 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45  base it is 'NONE
a070: 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  '. This matches 
a080: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
a090: 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f  defaults.  .  */
a0a0: 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e  .  db->aDb[0].zN
a0b0: 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
a0c0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74  db->aDb[0].safet
a0d0: 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 23 69 66  y_level = 3;.#if
a0e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a0f0: 5f 54 45 4d 50 44 42 0a 20 20 64 62 2d 3e 61 44  _TEMPDB.  db->aD
a100: 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65  b[1].zName = "te
a110: 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  mp";.  db->aDb[1
a120: 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
a130: 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62   1;.#endif..  db
a140: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
a150: 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69  _MAGIC_OPEN;.  i
a160: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
a170: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
a180: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
a190: 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61  .  /* Register a
a1a0: 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63  ll built-in func
a1b0: 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f  tions, but do no
a1c0: 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  t attempt to rea
a1d0: 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  d the.  ** datab
a1e0: 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20  ase schema yet. 
a1f0: 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20  This is delayed 
a200: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
a210: 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
a220: 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73  e.  ** is access
a230: 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
a240: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
a250: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c  TE_OK, 0);.  sql
a260: 69 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c  ite3RegisterBuil
a270: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29  tinFunctions(db)
a280: 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74  ;..  /* Load aut
a290: 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e  omatic extension
a2a0: 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74  s - extensions t
a2b0: 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  hat have been re
a2c0: 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73  gistered.  ** us
a2d0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
a2e0: 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73  automatic_extens
a2f0: 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a  ion() API..  */.
a300: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 41    (void)sqlite3A
a310: 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  utoLoadExtension
a320: 73 28 64 62 29 3b 0a 20 20 69 66 28 20 73 71 6c  s(db);.  if( sql
a330: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
a340: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a350: 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
a360: 75 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  ut;.  }..#ifdef 
a370: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
a380: 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S1.  if( !db->ma
a390: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
a3a0: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
a3b0: 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c  ite3Fts1Init(sql
a3c0: 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
a3d0: 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
a3e0: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
a3f0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a400: 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66  ENABLE_FTS2.  if
a410: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
a420: 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
a430: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65  E_OK ){.    exte
a440: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
a450: 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s2Init(sqlite3*)
a460: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
a470: 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a  e3Fts2Init(db);.
a480: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
a490: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a4a0: 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d  _FTS3.  if( !db-
a4b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
a4c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
a4d0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
a4e0: 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a  e3Fts3Init(db);.
a4f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
a500: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a510: 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e  _ICU.  if( !db->
a520: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
a530: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
a540: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
a550: 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 73  sqlite3IcuInit(s
a560: 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
a570: 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69   = sqlite3IcuIni
a580: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
a590: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
a5a0: 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20  _ENABLE_RTREE.  
a5b0: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
a5c0: 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
a5d0: 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
a5e0: 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e  = sqlite3RtreeIn
a5f0: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
a600: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72  if..  sqlite3Err
a610: 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a  or(db, rc, 0);..
a620: 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45    /* -DSQLITE_DE
a630: 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
a640: 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55  DE=1 makes EXCLU
a650: 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74  SIVE the default
a660: 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
a670: 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45  de.  -DSQLITE_DE
a680: 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
a690: 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c  DE=0 make NORMAL
a6a0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
a6b0: 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
a6c0: 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61   Doing nothing a
a6d0: 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73  t all also makes
a6e0: 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
a6f0: 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ult..  */.#ifdef
a700: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
a710: 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64  LOCKING_MODE.  d
a720: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
a730: 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
a740: 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20  _LOCKING_MODE;. 
a750: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
a760: 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33  kingMode(sqlite3
a770: 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
a780: 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20  Db[0].pBt),.    
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7a0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
a7b0: 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
a7c0: 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 6f 70 65 6e  E);.#endif..open
a7d0: 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 62  db_out:.  if( db
a7e0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a7f0: 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20  db->mutex!=0 || 
a800: 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20  isThreadsafe==0 
a810: 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67  || sqlite3Config
a820: 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29  .bFullMutex==0 )
a830: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
a840: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
a850: 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  tex);.  }.  if( 
a860: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 28 72  SQLITE_NOMEM==(r
a870: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
a880: 6f 64 65 28 64 62 29 29 20 29 7b 0a 20 20 20 20  ode(db)) ){.    
a890: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
a8a0: 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  );.    db = 0;. 
a8b0: 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b   }.  *ppDb = db;
a8c0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
a8d0: 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b  3ApiExit(0, rc);
a8e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
a8f0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
a900: 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
a910: 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e  ite3_open(.  con
a920: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
a930: 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  me, .  sqlite3 *
a940: 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75  *ppDb .){.  retu
a950: 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  rn openDatabase(
a960: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  zFilename, ppDb,
a970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a980: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
a990: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
a9a0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
a9b0: 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  E, 0);.}.int sql
a9c0: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20  ite3_open_v2(.  
a9d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
a9e0: 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62  name,   /* Datab
a9f0: 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54  ase filename (UT
aa00: 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-8) */.  sqlite
aa10: 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20  3 **ppDb,       
aa20: 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65    /* OUT: SQLite
aa30: 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20   db handle */.  
aa40: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
aa50: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
aa60: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
aa70: 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a   *zVfs        /*
aa80: 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64   Name of VFS mod
aa90: 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b  ule to use */.){
aaa0: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
aab0: 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c  tabase(filename,
aac0: 20 70 70 44 62 2c 20 66 6c 61 67 73 2c 20 7a 56   ppDb, flags, zV
aad0: 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  fs);.}..#ifndef 
aae0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
aaf0: 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  6./*.** Open a n
ab00: 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
ab10: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
ab20: 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e  e3_open16(.  con
ab30: 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61  st void *zFilena
ab40: 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  me, .  sqlite3 *
ab50: 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20  *ppDb.){.  char 
ab60: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65  const *zFilename
ab70: 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d  8;   /* zFilenam
ab80: 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46  e encoded in UTF
ab90: 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54  -8 instead of UT
aba0: 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-16 */.  sqlite
abb0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
abc0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
abd0: 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b  rt( zFilename );
abe0: 0a 20 20 61 73 73 65 72 74 28 20 70 70 44 62 20  .  assert( ppDb 
abf0: 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a  );.  *ppDb = 0;.
ac00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ac10: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72  MIT_AUTOINIT.  r
ac20: 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
ac30: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
ac40: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
ac50: 23 65 6e 64 69 66 0a 20 20 70 56 61 6c 20 3d 20  #endif.  pVal = 
ac60: 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
ac70: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  0);.  sqlite3Val
ac80: 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d  ueSetStr(pVal, -
ac90: 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51  1, zFilename, SQ
aca0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
acb0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
acc0: 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d  ;.  zFilename8 =
acd0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
ace0: 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55  t(pVal, SQLITE_U
acf0: 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  TF8);.  if( zFil
ad00: 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63  ename8 ){.    rc
ad10: 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28   = openDatabase(
ad20: 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62  zFilename8, ppDb
ad30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ad40: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
ad50: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
ad60: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
ad70: 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  TE, 0);.    asse
ad80: 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d  rt( *ppDb || rc=
ad90: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
ada0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
adb0: 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73  ITE_OK && !DbHas
adc0: 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20  Property(*ppDb, 
add0: 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  0, DB_SchemaLoad
ade0: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 45 4e 43  ed) ){.      ENC
adf0: 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45  (*ppDb) = SQLITE
ae00: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
ae10: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
ae20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
ae30: 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  EM;.  }.  sqlite
ae40: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
ae50: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ;..  return sqli
ae60: 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72 63  te3ApiExit(0, rc
ae70: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
ae80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
ae90: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
aea0: 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
aeb0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
aec0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
aed0: 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
aee0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
aef0: 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  collation(.  sql
af00: 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
af10: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
af20: 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
af30: 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
af40: 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
af50: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
af60: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
af70: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
af80: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
af90: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
afa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
afb0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
afc0: 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f  .  rc = createCo
afd0: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
afe0: 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  e, enc, pCtx, xC
aff0: 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63  ompare, 0);.  rc
b000: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
b010: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
b020: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
b030: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
b040: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b050: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
b060: 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
b070: 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
b080: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
b090: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b0a0: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
b0b0: 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a  n_v2(.  sqlite3*
b0c0: 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68   db, .  const ch
b0d0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e  ar *zName, .  in
b0e0: 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
b0f0: 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
b100: 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
b110: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
b120: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
b130: 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
b140: 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  d*).){.  int rc;
b150: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b160: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
b170: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
b180: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b190: 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43  ;.  rc = createC
b1a0: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
b1b0: 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78  me, enc, pCtx, x
b1c0: 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a  Compare, xDel);.
b1d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
b1e0: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
b1f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
b200: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
b210: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b230: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
b240: 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
b250: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
b260: 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
b270: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
b280: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
b290: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
b2a0: 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  6(.  sqlite3* db
b2b0: 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
b2c0: 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e  *zName,.  int en
b2d0: 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
b2e0: 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
b2f0: 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
b300: 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
b310: 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
b320: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b330: 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  K;.  char *zName
b340: 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  8;.  sqlite3_mut
b350: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
b360: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
b370: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b380: 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73   );.  zName8 = s
b390: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
b3a0: 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20  b, zName, -1);. 
b3b0: 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20   if( zName8 ){. 
b3c0: 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f     rc = createCo
b3d0: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
b3e0: 65 38 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78  e8, enc, pCtx, x
b3f0: 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20  Compare, 0);.   
b400: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
b410: 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
b420: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
b430: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
b440: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
b450: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
b460: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
b470: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b480: 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
b490: 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
b4a0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
b4b0: 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
b4c0: 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
b4d0: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
b4e0: 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
b4f0: 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
b500: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b510: 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
b520: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
b530: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
b540: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
b550: 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
b560: 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
b570: 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
b580: 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
b590: 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
b5a0: 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ar*).){.  sqlite
b5b0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
b5c0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
b5d0: 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
b5e0: 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
b5f0: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
b600: 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
b610: 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
b620: 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
b630: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
b640: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
b650: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b660: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
b670: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
b680: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
b690: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
b6a0: 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
b6b0: 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
b6c0: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
b6d0: 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
b6e0: 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
b6f0: 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
b700: 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
b710: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
b720: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
b730: 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
b740: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
b750: 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
b760: 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
b770: 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
b780: 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
b790: 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
b7a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
b7b0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
b7c0: 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
b7d0: 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43  ed = 0;.  db->xC
b7e0: 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43  ollNeeded16 = xC
b7f0: 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64  ollNeeded16;.  d
b800: 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
b810: 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
b820: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
b830: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
b840: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
b850: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
b860: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b870: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
b880: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b890: 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a 2f 2a  GLOBALRECOVER./*
b8a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b8b0: 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63  n is now an anac
b8c0: 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64  hronism. It used
b8d0: 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72   to be used to r
b8e0: 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a  ecover from a.**
b8f0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
b900: 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f  e, but SQLite no
b910: 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f  w does this auto
b920: 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e  matically..*/.in
b930: 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  t sqlite3_global
b940: 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a  _recover(void){.
b950: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b960: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
b970: 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
b980: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b990: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
b9a0: 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74  ection is in aut
b9b0: 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e  ocommit.** mode.
b9c0: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
b9d0: 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45   it is and FALSE
b9e0: 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f   if not.  Autoco
b9f0: 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a  mmit mode is on.
ba00: 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ** by default.  
ba10: 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69  Autocommit is di
ba20: 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49  sabled by a BEGI
ba30: 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  N statement and 
ba40: 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20  reenabled.** by 
ba50: 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20  the next COMMIT 
ba60: 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a  or ROLLBACK..**.
ba70: 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20  ******* THIS IS 
ba80: 41 4e 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20  AN EXPERIMENTAL 
ba90: 41 50 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45  API AND IS SUBJE
baa0: 43 54 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a  CT TO CHANGE ***
bab0: 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ***.*/.int sqlit
bac0: 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
bad0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
bae0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74    return db->aut
baf0: 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 23 69 66 64  oCommit;.}..#ifd
bb00: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
bb10: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
bb20: 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 73  ing routine is s
bb30: 75 62 74 69 74 75 74 65 64 20 66 6f 72 20 63 6f  ubtituted for co
bb40: 6e 73 74 61 6e 74 20 53 51 4c 49 54 45 5f 43 4f  nstant SQLITE_CO
bb50: 52 52 55 50 54 20 69 6e 0a 2a 2a 20 64 65 62 75  RRUPT in.** debu
bb60: 67 67 69 6e 67 20 62 75 69 6c 64 73 2e 20 20 54  gging builds.  T
bb70: 68 69 73 20 70 72 6f 76 69 64 65 73 20 61 20 77  his provides a w
bb80: 61 79 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ay to set a brea
bb90: 6b 70 6f 69 6e 74 20 66 6f 72 20 77 68 65 6e 0a  kpoint for when.
bba0: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  ** corruption is
bbb0: 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e   first detected.
bbc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
bbd0: 6f 72 72 75 70 74 28 76 6f 69 64 29 7b 0a 20 20  orrupt(void){.  
bbe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bbf0: 52 52 55 50 54 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RRUPT;.}.#endif.
bc00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
bc10: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75   convenience rou
bc20: 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20  tine that makes 
bc30: 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68  sure that all th
bc40: 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a  read-specific.**
bc50: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74   data for this t
bc60: 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64  hread has been d
bc70: 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a  eallocated..**.*
bc80: 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67  * SQLite no long
bc90: 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73  er uses thread-s
bca0: 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20  pecific data so 
bcb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
bcc0: 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20  now a.** no-op. 
bcd0: 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20   It is retained 
bce0: 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63  for historical c
bcf0: 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f  ompatibility..*/
bd00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68  .void sqlite3_th
bd10: 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69  read_cleanup(voi
bd20: 64 29 7b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  d){.}../*.** Ret
bd30: 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  urn meta informa
bd40: 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65  tion about a spe
bd50: 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20  cific column of 
bd60: 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
bd70: 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
bd80: 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73   in sqlite3.h (s
bd90: 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20  qlite.h.in) for 
bda0: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64  details..*/.#ifd
bdb0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
bdc0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
bdd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62  .int sqlite3_tab
bde0: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
bdf0: 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ta(.  sqlite3 *d
be00: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
be10: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
be20: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
be30: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
be40: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
be50: 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c  ase name or NULL
be60: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
be70: 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20   *zTableName,   
be80: 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20    /* Table name 
be90: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
bea0: 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20  *zColumnName,   
beb0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
bec0: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
bed0: 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20  **pzDataType,   
bee0: 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c   /* OUTPUT: Decl
bef0: 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a  ared data type *
bf00: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
bf10: 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20  *pzCollSeq,     
bf20: 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61  /* OUTPUT: Colla
bf30: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
bf40: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f  me */.  int *pNo
bf50: 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  tNull,          
bf60: 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
bf70: 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20  rue if NOT NULL 
bf80: 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74  constraint exist
bf90: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69  s */.  int *pPri
bfa0: 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20  maryKey,        
bfb0: 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
bfc0: 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72  ue if column par
bfd0: 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74  t of PK */.  int
bfe0: 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20   *pAutoinc      
bff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
c000: 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
c010: 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65  mn is auto-incre
c020: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
c030: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
c040: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c  rMsg = 0;.  Tabl
c050: 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43  e *pTab = 0;.  C
c060: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b  olumn *pCol = 0;
c070: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20  .  int iCol;..  
c080: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74  char const *zDat
c090: 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61  aType = 0;.  cha
c0a0: 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65  r const *zCollSe
c0b0: 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74  q = 0;.  int not
c0c0: 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  null = 0;.  int 
c0d0: 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a  primarykey = 0;.
c0e0: 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20    int autoinc = 
c0f0: 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  0;..  /* Ensure 
c100: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
c110: 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61  ema has been loa
c120: 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
c130: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
c140: 3e 6d 75 74 65 78 29 3b 0a 20 20 28 76 6f 69 64  >mutex);.  (void
c150: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e  )sqlite3SafetyOn
c160: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  (db);.  sqlite3B
c170: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
c180: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c190: 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73  Init(db, &zErrMs
c1a0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  g);.  sqlite3Btr
c1b0: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
c1c0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
c1d0: 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =rc ){.    goto 
c1e0: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
c1f0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
c200: 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f  table in questio
c210: 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71  n */.  pTab = sq
c220: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
c230: 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a  b, zTableName, z
c240: 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  DbName);.  if( !
c250: 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53  pTab || pTab->pS
c260: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61  elect ){.    pTa
c270: 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  b = 0;.    goto 
c280: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
c290: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f    /* Find the co
c2a0: 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69  lumn for which i
c2b0: 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65 64  nfo is requested
c2c0: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
c2d0: 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e  3IsRowid(zColumn
c2e0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69 43 6f  Name) ){.    iCo
c2f0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
c300: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30  .    if( iCol>=0
c310: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d   ){.      pCol =
c320: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
c330: 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  l];.    }.  }els
c340: 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  e{.    for(iCol=
c350: 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
c360: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
c370: 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
c380: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
c390: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
c3a0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
c3b0: 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d  Name, zColumnNam
c3c0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
c3d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
c3e0: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d   }.    if( iCol=
c3f0: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
c400: 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20       pTab = 0;. 
c410: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
c420: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
c430: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
c440: 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20  ng block stores 
c450: 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  the meta informa
c460: 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62  tion that will b
c470: 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  e returned.  ** 
c480: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e  to the caller in
c490: 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
c4a0: 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c   zDataType, zCol
c4b0: 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70  lSeq, notnull, p
c4c0: 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61  rimarykey.  ** a
c4d0: 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74  nd autoinc. At t
c4e0: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
c4f0: 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c  are two possibil
c500: 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a  ities:.  ** .  *
c510: 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70 65  *     1. The spe
c520: 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  cified column na
c530: 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22  me was rowid", "
c540: 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f  oid" or "_rowid_
c550: 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61  " .  **        a
c560: 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65  nd there is no e
c570: 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
c580: 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a  ed IPK column. .
c590: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e    **.  **     2.
c5a0: 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   The table is no
c5b0: 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  t a view and the
c5c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65   column name ide
c5d0: 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a  ntified an .  **
c5e0: 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74          explicit
c5f0: 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  ly declared colu
c600: 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e  mn. Copy meta in
c610: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a  formation from *
c620: 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  pCol..  */ .  if
c630: 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44  ( pCol ){.    zD
c640: 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e  ataType = pCol->
c650: 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c  zType;.    zColl
c660: 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  Seq = pCol->zCol
c670: 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d  l;.    notnull =
c680: 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d   pCol->notNull!=
c690: 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  0;.    primaryke
c6a0: 79 20 20 3d 20 70 43 6f 6c 2d 3e 69 73 50 72 69  y  = pCol->isPri
c6b0: 6d 4b 65 79 21 3d 30 3b 0a 20 20 20 20 61 75 74  mKey!=0;.    aut
c6c0: 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b  oinc = pTab->iPK
c6d0: 65 79 3d 3d 69 43 6f 6c 20 26 26 20 70 54 61 62  ey==iCol && pTab
c6e0: 2d 3e 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c  ->autoInc;.  }el
c6f0: 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70  se{.    zDataTyp
c700: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
c710: 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20     primarykey = 
c720: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43  1;.  }.  if( !zC
c730: 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43  ollSeq ){.    zC
c740: 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59  ollSeq = "BINARY
c750: 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75  ";.  }..error_ou
c760: 74 3a 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  t:.  (void)sqlit
c770: 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b  e3SafetyOff(db);
c780: 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74  ..  /* Whether t
c790: 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  he function call
c7a0: 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61   succeeded or fa
c7b0: 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75  iled, set the ou
c7c0: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a  tput parameters.
c7d0: 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72    ** to whatever
c7e0: 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75   their local cou
c7f0: 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69  nterparts contai
c800: 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  n. If an error d
c810: 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74  id occur,.  ** t
c820: 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65  his has the effe
c830: 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c  ct of zeroing al
c840: 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  l output paramet
c850: 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
c860: 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a  pzDataType ) *pz
c870: 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61  DataType = zData
c880: 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f  Type;.  if( pzCo
c890: 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53  llSeq ) *pzCollS
c8a0: 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20  eq = zCollSeq;. 
c8b0: 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20   if( pNotNull ) 
c8c0: 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e  *pNotNull = notn
c8d0: 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d  ull;.  if( pPrim
c8e0: 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61  aryKey ) *pPrima
c8f0: 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b  ryKey = primaryk
c900: 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69  ey;.  if( pAutoi
c910: 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d  nc ) *pAutoinc =
c920: 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28   autoinc;..  if(
c930: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26   SQLITE_OK==rc &
c940: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73  & !pTab ){.    s
c950: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
c960: 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73  Msg);.    zErrMs
c970: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
c980: 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20  tf(db, "no such 
c990: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73  table column: %s
c9a0: 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  .%s", zTableName
c9b0: 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d  ,.        zColum
c9c0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  nName);.    rc =
c9d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
c9e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
c9f0: 72 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d  r(db, rc, (zErrM
ca00: 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72  sg?"%s":0), zErr
ca10: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Msg);.  sqlite3_
ca20: 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
ca30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
ca40: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
ca50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ca60: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
ca70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
ca80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  endif../*.** Sle
ca90: 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
caa0: 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
cab0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
cac0: 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20  e slept..*/.int 
cad0: 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e  sqlite3_sleep(in
cae0: 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  t ms){.  sqlite3
caf0: 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e  _vfs *pVfs;.  in
cb00: 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73  t rc;.  pVfs = s
cb10: 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
cb20: 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d  0);.  if( pVfs==
cb30: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
cb40: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
cb50: 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69  n works in milli
cb60: 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65  seconds, but the
cb70: 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c   underlying OsSl
cb80: 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20  eep() .  ** API 
cb90: 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64  uses microsecond
cba0: 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30 30  s. Hence the 100
cbb0: 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  0's..  */.  rc =
cbc0: 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70   (sqlite3OsSleep
cbd0: 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f  (pVfs, 1000*ms)/
cbe0: 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
cbf0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61  rc;.}../*.** Ena
cc00: 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
cc10: 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75  he extended resu
cc20: 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74  lt codes..*/.int
cc30: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
cc40: 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73  d_result_codes(s
cc50: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
cc60: 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74 65  onoff){.  sqlite
cc70: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
cc80: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
cc90: 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20  errMask = onoff 
cca0: 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30  ? 0xffffffff : 0
ccb0: 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  xff;.  sqlite3_m
ccc0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ccd0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
cce0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ccf0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78  .** Invoke the x
cd00: 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68  FileControl meth
cd10: 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  od on a particul
cd20: 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ar database..*/.
cd30: 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  int sqlite3_file
cd40: 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  _control(sqlite3
cd50: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
cd60: 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f   *zDbName, int o
cd70: 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
cd80: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
cd90: 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69  E_ERROR;.  int i
cda0: 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  Db;.  sqlite3_mu
cdb0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
cdc0: 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 4e  tex);.  if( zDbN
cdd0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 44  ame==0 ){.    iD
cde0: 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  b = 0;.  }else{.
cdf0: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
ce00: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
ce10: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
ce20: 72 63 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44 62  rcmp(db->aDb[iDb
ce30: 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  ].zName, zDbName
ce40: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
ce50: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 44    }.  }.  if( iD
ce60: 62 3c 64 62 2d 3e 6e 44 62 20 29 7b 0a 20 20 20  b<db->nDb ){.   
ce70: 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
ce80: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
ce90: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 72 65  t;.    if( pBtre
cea0: 65 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  e ){.      Pager
ceb0: 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20   *pPager;.      
cec0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
ced0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
cee0: 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
cef0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 20  );.      pPager 
cf00: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
cf10: 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ger(pBtree);.   
cf20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
cf30: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 64  r!=0 );.      fd
cf40: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
cf50: 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
cf60: 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30     assert( fd!=0
cf70: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 64   );.      if( fd
cf80: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
cf90: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cfa0: 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
cfb0: 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20  fd, op, pArg);. 
cfc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
cfd0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
cfe0: 42 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Btree);.    }.  
cff0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
d000: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
d010: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
d020: 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74     .}../*.** Int
d030: 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65  erface to the te
d040: 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  sting logic..*/.
d050: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  int sqlite3_test
d060: 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c  _control(int op,
d070: 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20   ...){.  int rc 
d080: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
d090: 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
d0a0: 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20  _TEST.  va_list 
d0b0: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
d0c0: 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
d0d0: 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a  ( op ){..    /*.
d0e0: 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20      ** Save the 
d0f0: 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
d100: 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a   the PRNG..    *
d110: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
d120: 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
d130: 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SAVE: {.      sq
d140: 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61  lite3PrngSaveSta
d150: 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
d160: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
d170: 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20  .    ** Restore 
d180: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
d190: 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73   PRNG to the las
d1a0: 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73  t state saved us
d1b0: 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f  ing.    ** PRNG_
d1c0: 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53  SAVE.  If PRNG_S
d1d0: 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65  AVE has never be
d1e0: 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64  fore been called
d1f0: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
d200: 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b  is verb acts lik
d210: 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20  e PRNG_RESET..  
d220: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
d230: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
d240: 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  NG_RESTORE: {.  
d250: 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
d260: 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20  estoreState();. 
d270: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d280: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
d290: 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20   Reset the PRNG 
d2a0: 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e  back to its unin
d2b0: 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e  itialized state.
d2c0: 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a    The next call.
d2d0: 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
d2e0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77  3_randomness() w
d2f0: 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50  ill reseed the P
d300: 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67  RNG using a sing
d310: 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  le call.    ** t
d320: 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  o the xRandomnes
d330: 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  s method of the 
d340: 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20  default VFS..   
d350: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
d360: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
d370: 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20  G_RESET: {.     
d380: 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 65   sqlite3PrngRese
d390: 74 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  tState();.      
d3a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
d3b0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
d3c0: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
d3d0: 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73  l(BITVEC_TEST, s
d3e0: 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20  ize, program).  
d3f0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20    **.    ** Run 
d400: 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61  a test against a
d410: 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f   Bitvec object o
d420: 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f  f size.  The pro
d430: 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20  gram argument.  
d440: 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79    ** is an array
d450: 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
d460: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65  t defines the te
d470: 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f  st.  Return -1 o
d480: 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  n a.    ** memor
d490: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
d4a0: 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73  or, 0 on success
d4b0: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  , or non-zero fo
d4c0: 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  r an error..    
d4d0: 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74  ** See the sqlit
d4e0: 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
d4f0: 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  est() for additi
d500: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
d510: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
d520: 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
d530: 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b  L_BITVEC_TEST: {
d540: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
d550: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
d560: 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f  .      int *aPro
d570: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  g = va_arg(ap, i
d580: 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt*);.      rc =
d590: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
d5a0: 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50  iltinTest(sz, aP
d5b0: 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rog);.      brea
d5c0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
d5d0: 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
d5e0: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45  _test_control(BE
d5f0: 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
d600: 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29  S, xBegin, xEnd)
d610: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
d620: 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f  egister hooks to
d630: 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74   call to indicat
d640: 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29  e which malloc()
d650: 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a   failures .    *
d660: 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20  * are benign..  
d670: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
d680: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45  LITE_TESTCTRL_BE
d690: 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
d6a0: 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64  S: {.      typed
d6b0: 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66  ef void (*void_f
d6c0: 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a  unction)(void);.
d6d0: 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
d6e0: 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e  ion xBenignBegin
d6f0: 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e  ;.      void_fun
d700: 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64  ction xBenignEnd
d710: 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42  ;.      xBenignB
d720: 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70  egin = va_arg(ap
d730: 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  , void_function)
d740: 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45  ;.      xBenignE
d750: 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  nd = va_arg(ap, 
d760: 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
d770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e        sqlite3Ben
d780: 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78  ignMallocHooks(x
d790: 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65  BenignBegin, xBe
d7a0: 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20  nignEnd);.      
d7b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
d7c0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
d7d0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d7e0: 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
d7f0: 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  T */.  return rc
d800: 3b 0a 7d 0a                                      ;.}.