/ Hex Artifact Content
Login

Artifact 21807e7bff6176030ac14ebf49c8a85479349689:


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