/ Hex Artifact Content
Login

Artifact f26b22f7c84153c9d5dbd7c240848823c6e6b6dc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 36 20 4a 75 6e 65 20  /*.** 2006 June 
0010: 37 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  7.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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: 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f  .** This file co
0180: 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65 64  ntains code used
0190: 20 74 6f 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20   to dynamically 
01a0: 6c 6f 61 64 20 65 78 74 65 6e 73 69 6f 6e 73 20  load extensions 
01b0: 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c 69  into.** the SQLi
01c0: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 0a  te library..*/..
01d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 43  #ifndef SQLITE_C
01e0: 4f 52 45 0a 20 20 23 64 65 66 69 6e 65 20 53 51  ORE.  #define SQ
01f0: 4c 49 54 45 5f 43 4f 52 45 20 31 20 20 2f 2a 20  LITE_CORE 1  /* 
0200: 44 69 73 61 62 6c 65 20 74 68 65 20 41 50 49 20  Disable the API 
0210: 72 65 64 65 66 69 6e 69 74 69 6f 6e 20 69 6e 20  redefinition in 
0220: 73 71 6c 69 74 65 33 65 78 74 2e 68 20 2a 2f 0a  sqlite3ext.h */.
0230: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
0240: 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 23  "sqlite3ext.h".#
0250: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0260: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0270: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
0280: 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 23 69  de <ctype.h>..#i
0290: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
02a0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
02b0: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 41 50 49  ../*.** Some API
02c0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 6f 6d   routines are om
02d0: 69 74 74 65 64 20 77 68 65 6e 20 76 61 72 69 6f  itted when vario
02e0: 75 73 20 66 65 61 74 75 72 65 73 20 61 72 65 0a  us features are.
02f0: 2a 2a 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  ** excluded from
0300: 20 61 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69   a build of SQLi
0310: 74 65 2e 20 20 53 75 62 73 74 69 74 75 74 65 20  te.  Substitute 
0320: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a  a NULL pointer.*
0330: 2a 20 66 6f 72 20 61 6e 79 20 6d 69 73 73 69 6e  * for any missin
0340: 67 20 41 50 49 73 2e 0a 2a 2f 0a 23 69 66 6e 64  g APIs..*/.#ifnd
0350: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0360: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
0370: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
0380: 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
0390: 65 5f 6e 61 6d 65 20 20 20 30 0a 23 20 64 65 66  e_name   0.# def
03a0: 69 6e 65 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ine sqlite3_colu
03b0: 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65  mn_database_name
03c0: 31 36 20 30 0a 23 20 64 65 66 69 6e 65 20 73 71  16 0.# define sq
03d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
03e0: 6c 65 5f 6e 61 6d 65 20 20 20 20 20 20 30 0a 23  le_name      0.#
03f0: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f   define sqlite3_
0400: 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
0410: 65 31 36 20 20 20 20 30 0a 23 20 64 65 66 69 6e  e16    0.# defin
0420: 65 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  e sqlite3_column
0430: 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 20 20 20 20  _origin_name    
0440: 20 30 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69   0.# define sqli
0450: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
0460: 6e 5f 6e 61 6d 65 31 36 20 20 20 30 0a 23 20 64  n_name16   0.# d
0470: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f 74 61  efine sqlite3_ta
0480: 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
0490: 61 74 61 20 20 30 0a 23 65 6e 64 69 66 0a 0a 23  ata  0.#endif..#
04a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
04b0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
04c0: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  # define sqlite3
04d0: 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 20  _set_authorizer 
04e0: 20 20 20 20 20 20 20 20 30 0a 23 65 6e 64 69 66          0.#endif
04f0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
0500: 4f 4d 49 54 5f 55 54 46 31 36 0a 23 20 64 65 66  OMIT_UTF16.# def
0510: 69 6e 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ine sqlite3_bind
0520: 5f 74 65 78 74 31 36 20 20 20 20 20 20 20 20 20  _text16         
0530: 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 73 71     0.# define sq
0540: 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
0550: 6e 65 65 64 65 64 31 36 20 20 20 20 20 30 0a 23  needed16     0.#
0560: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f   define sqlite3_
0570: 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31  column_decltype1
0580: 36 20 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  6      0.# defin
0590: 65 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  e sqlite3_column
05a0: 5f 6e 61 6d 65 31 36 20 20 20 20 20 20 20 20 20  _name16         
05b0: 20 30 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69   0.# define sqli
05c0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
05d0: 36 20 20 20 20 20 20 20 20 20 20 30 0a 23 20 64  6          0.# d
05e0: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f 63 6f  efine sqlite3_co
05f0: 6d 70 6c 65 74 65 31 36 20 20 20 20 20 20 20 20  mplete16        
0600: 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
0610: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
0620: 6f 6c 6c 61 74 69 6f 6e 31 36 20 20 20 20 20 30  ollation16     0
0630: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
0640: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
0650: 6e 31 36 20 20 20 20 20 20 30 0a 23 20 64 65 66  n16      0.# def
0660: 69 6e 65 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ine sqlite3_errm
0670: 73 67 31 36 20 20 20 20 20 20 20 20 20 20 20 20  sg16            
0680: 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 73 71     0.# define sq
0690: 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20 20 20 20  lite3_open16    
06a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
06b0: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f   define sqlite3_
06c0: 70 72 65 70 61 72 65 31 36 20 20 20 20 20 20 20  prepare16       
06d0: 20 20 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e         0.# defin
06e0: 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  e sqlite3_prepar
06f0: 65 31 36 5f 76 32 20 20 20 20 20 20 20 20 20 20  e16_v2          
0700: 20 30 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69   0.# define sqli
0710: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
0720: 31 36 20 20 20 20 20 20 20 20 20 30 0a 23 20 64  16         0.# d
0730: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f 72 65  efine sqlite3_re
0740: 73 75 6c 74 5f 74 65 78 74 31 36 20 20 20 20 20  sult_text16     
0750: 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
0760: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
0770: 65 78 74 31 36 62 65 20 20 20 20 20 20 20 20 30  ext16be        0
0780: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
0790: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c  3_result_text16l
07a0: 65 20 20 20 20 20 20 20 20 30 0a 23 20 64 65 66  e        0.# def
07b0: 69 6e 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ine sqlite3_valu
07c0: 65 5f 74 65 78 74 31 36 20 20 20 20 20 20 20 20  e_text16        
07d0: 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 73 71     0.# define sq
07e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
07f0: 31 36 62 65 20 20 20 20 20 20 20 20 20 30 0a 23  16be         0.#
0800: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f   define sqlite3_
0810: 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 20 20  value_text16le  
0820: 20 20 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e         0.# defin
0830: 65 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  e sqlite3_column
0840: 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36  _database_name16
0850: 20 30 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69   0.# define sqli
0860: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
0870: 5f 6e 61 6d 65 31 36 20 20 20 20 30 0a 23 20 64  _name16    0.# d
0880: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f 63 6f  efine sqlite3_co
0890: 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
08a0: 31 36 20 20 20 30 0a 23 65 6e 64 69 66 0a 0a 23  16   0.#endif..#
08b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
08c0: 54 5f 43 4f 4d 50 4c 45 54 45 0a 23 20 64 65 66  T_COMPLETE.# def
08d0: 69 6e 65 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70  ine sqlite3_comp
08e0: 6c 65 74 65 20 30 0a 23 20 64 65 66 69 6e 65 20  lete 0.# define 
08f0: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
0900: 31 36 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66  16 0.#endif..#if
0910: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0920: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
0930: 4b 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  K.# define sqlit
0940: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
0950: 6c 65 72 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69  ler 0.#endif..#i
0960: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
0970: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 23 20  _VIRTUALTABLE.# 
0980: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f 63  define sqlite3_c
0990: 72 65 61 74 65 5f 6d 6f 64 75 6c 65 20 30 0a 23  reate_module 0.#
09a0: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f   define sqlite3_
09b0: 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32  create_module_v2
09c0: 20 30 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69   0.# define sqli
09d0: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
09e0: 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   0.#endif..#ifde
09f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
0a00: 41 52 45 44 5f 43 41 43 48 45 0a 23 20 64 65 66  ARED_CACHE.# def
0a10: 69 6e 65 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  ine sqlite3_enab
0a20: 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20  le_shared_cache 
0a30: 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  0.#endif..#ifdef
0a40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
0a50: 43 45 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  CE.# define sqli
0a60: 74 65 33 5f 70 72 6f 66 69 6c 65 20 20 20 20 20  te3_profile     
0a70: 20 20 30 0a 23 20 64 65 66 69 6e 65 20 73 71 6c    0.# define sql
0a80: 69 74 65 33 5f 74 72 61 63 65 20 20 20 20 20 20  ite3_trace      
0a90: 20 20 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66     0.#endif..#if
0aa0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0ab0: 47 45 54 5f 54 41 42 4c 45 0a 23 20 64 65 66 69  GET_TABLE.# defi
0ac0: 6e 65 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f  ne sqlite3_free_
0ad0: 74 61 62 6c 65 20 20 20 20 30 0a 23 20 64 65 66  table    0.# def
0ae0: 69 6e 65 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  ine sqlite3_get_
0af0: 74 61 62 6c 65 20 20 20 20 20 30 0a 23 65 6e 64  table     0.#end
0b00: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
0b10: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
0b20: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f  #define sqlite3_
0b30: 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 20 30  bind_zeroblob  0
0b40: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0b50: 5f 62 6c 6f 62 5f 62 79 74 65 73 20 20 20 20 20  _blob_bytes     
0b60: 30 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  0.#define sqlite
0b70: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 20 20 20 20  3_blob_close    
0b80: 20 30 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74   0.#define sqlit
0b90: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 20 20 20 20  e3_blob_open    
0ba0: 20 20 30 0a 23 64 65 66 69 6e 65 20 73 71 6c 69    0.#define sqli
0bb0: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 20 20  te3_blob_read   
0bc0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 73 71 6c     0.#define sql
0bd0: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20  ite3_blob_write 
0be0: 20 20 20 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a      0.#endif../*
0bf0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
0c00: 67 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  g structure cont
0c10: 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
0c20: 20 61 6c 6c 20 53 51 4c 69 74 65 20 41 50 49 20   all SQLite API 
0c30: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 20 41 20 70  routines..** A p
0c40: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73  ointer to this s
0c50: 74 72 75 63 74 75 72 65 20 69 73 20 70 61 73 73  tructure is pass
0c60: 65 64 20 69 6e 74 6f 20 65 78 74 65 6e 73 69 6f  ed into extensio
0c70: 6e 73 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ns when they are
0c80: 0a 2a 2a 20 6c 6f 61 64 65 64 20 73 6f 20 74 68  .** loaded so th
0c90: 61 74 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  at the extension
0ca0: 20 63 61 6e 20 6d 61 6b 65 20 63 61 6c 6c 73 20   can make calls 
0cb0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 53 51  back into the SQ
0cc0: 4c 69 74 65 0a 2a 2a 20 6c 69 62 72 61 72 79 2e  Lite.** library.
0cd0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 64 64 69  .**.** When addi
0ce0: 6e 67 20 6e 65 77 20 41 50 49 73 2c 20 61 64 64  ng new APIs, add
0cf0: 20 74 68 65 6d 20 74 6f 20 74 68 65 20 62 6f 74   them to the bot
0d00: 74 6f 6d 20 6f 66 20 74 68 69 73 20 73 74 72 75  tom of this stru
0d10: 63 74 75 72 65 0a 2a 2a 20 69 6e 20 6f 72 64 65  cture.** in orde
0d20: 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 62 61  r to preserve ba
0d30: 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
0d40: 69 6c 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 45 78 74  ility..**.** Ext
0d50: 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 75 73 65  ensions that use
0d60: 20 6e 65 77 65 72 20 41 50 49 73 20 73 68 6f 75   newer APIs shou
0d70: 6c 64 20 66 69 72 73 74 20 63 61 6c 6c 20 74 68  ld first call th
0d80: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 69 62  e.** sqlite3_lib
0d90: 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29  version_number()
0da0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
0db0: 61 74 20 74 68 65 20 41 50 49 20 74 68 65 79 0a  at the API they.
0dc0: 2a 2a 20 69 6e 74 65 6e 64 20 74 6f 20 75 73 65  ** intend to use
0dd0: 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 62 79   is supported by
0de0: 20 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 45   the library.  E
0df0: 78 74 65 6e 73 69 6f 6e 73 20 73 68 6f 75 6c 64  xtensions should
0e00: 0a 2a 2a 20 61 6c 73 6f 20 63 68 65 63 6b 20 74  .** also check t
0e10: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
0e20: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
0e30: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  the function is.
0e40: 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 20 62 65 66 6f  ** not NULL befo
0e50: 72 65 20 63 61 6c 6c 69 6e 67 20 69 74 2e 0a 2a  re calling it..*
0e60: 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
0e70: 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 73 71 6c  api_routines sql
0e80: 69 74 65 33 41 70 69 73 20 3d 20 7b 0a 20 20 73  ite3Apis = {.  s
0e90: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
0ea0: 5f 63 6f 6e 74 65 78 74 2c 0a 20 20 73 71 6c 69  _context,.  sqli
0eb0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
0ec0: 75 6e 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 62  unt,.  sqlite3_b
0ed0: 69 6e 64 5f 62 6c 6f 62 2c 0a 20 20 73 71 6c 69  ind_blob,.  sqli
0ee0: 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 2c  te3_bind_double,
0ef0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
0f00: 69 6e 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 62  int,.  sqlite3_b
0f10: 69 6e 64 5f 69 6e 74 36 34 2c 0a 20 20 73 71 6c  ind_int64,.  sql
0f20: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 2c 0a  ite3_bind_null,.
0f30: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
0f40: 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 2c 0a  arameter_count,.
0f50: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
0f60: 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 2c 0a  arameter_index,.
0f70: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
0f80: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 0a 20  arameter_name,. 
0f90: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
0fa0: 78 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  xt,.  sqlite3_bi
0fb0: 6e 64 5f 74 65 78 74 31 36 2c 0a 20 20 73 71 6c  nd_text16,.  sql
0fc0: 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 2c  ite3_bind_value,
0fd0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  .  sqlite3_busy_
0fe0: 68 61 6e 64 6c 65 72 2c 0a 20 20 73 71 6c 69 74  handler,.  sqlit
0ff0: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 2c  e3_busy_timeout,
1000: 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .  sqlite3_chang
1010: 65 73 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c  es,.  sqlite3_cl
1020: 6f 73 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63  ose,.  sqlite3_c
1030: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 2c  ollation_needed,
1040: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  .  sqlite3_colla
1050: 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 2c 0a 20  tion_needed16,. 
1060: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1070: 62 6c 6f 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f  blob,.  sqlite3_
1080: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 2c 0a 20 20  column_bytes,.  
1090: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
10a0: 79 74 65 73 31 36 2c 0a 20 20 73 71 6c 69 74 65  ytes16,.  sqlite
10b0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 2c 0a  3_column_count,.
10c0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
10d0: 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 2c 0a  _database_name,.
10e0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
10f0: 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36  _database_name16
1100: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,.  sqlite3_colu
1110: 6d 6e 5f 64 65 63 6c 74 79 70 65 2c 0a 20 20 73  mn_decltype,.  s
1120: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
1130: 63 6c 74 79 70 65 31 36 2c 0a 20 20 73 71 6c 69  cltype16,.  sqli
1140: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
1150: 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  e,.  sqlite3_col
1160: 75 6d 6e 5f 69 6e 74 2c 0a 20 20 73 71 6c 69 74  umn_int,.  sqlit
1170: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 2c  e3_column_int64,
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .  sqlite3_colum
1190: 6e 5f 6e 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65  n_name,.  sqlite
11a0: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 2c  3_column_name16,
11b0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .  sqlite3_colum
11c0: 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 2c 0a 20  n_origin_name,. 
11d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
11e0: 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 2c 0a 20  origin_name16,. 
11f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1200: 74 61 62 6c 65 5f 6e 61 6d 65 2c 0a 20 20 73 71  table_name,.  sq
1210: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
1220: 6c 65 5f 6e 61 6d 65 31 36 2c 0a 20 20 73 71 6c  le_name16,.  sql
1230: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1240: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,.  sqlite3_colu
1250: 6d 6e 5f 74 65 78 74 31 36 2c 0a 20 20 73 71 6c  mn_text16,.  sql
1260: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
1270: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,.  sqlite3_colu
1280: 6d 6e 5f 76 61 6c 75 65 2c 0a 20 20 73 71 6c 69  mn_value,.  sqli
1290: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 2c  te3_commit_hook,
12a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c  .  sqlite3_compl
12b0: 65 74 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63  ete,.  sqlite3_c
12c0: 6f 6d 70 6c 65 74 65 31 36 2c 0a 20 20 73 71 6c  omplete16,.  sql
12d0: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
12e0: 61 74 69 6f 6e 2c 0a 20 20 73 71 6c 69 74 65 33  ation,.  sqlite3
12f0: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
1300: 6e 31 36 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63  n16,.  sqlite3_c
1310: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 2c 0a  reate_function,.
1320: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1330: 5f 66 75 6e 63 74 69 6f 6e 31 36 2c 0a 20 20 73  _function16,.  s
1340: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f  qlite3_create_mo
1350: 64 75 6c 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f  dule,.  sqlite3_
1360: 64 61 74 61 5f 63 6f 75 6e 74 2c 0a 20 20 73 71  data_count,.  sq
1370: 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 2c  lite3_db_handle,
1380: 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  .  sqlite3_decla
1390: 72 65 5f 76 74 61 62 2c 0a 20 20 73 71 6c 69 74  re_vtab,.  sqlit
13a0: 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  e3_enable_shared
13b0: 5f 63 61 63 68 65 2c 0a 20 20 73 71 6c 69 74 65  _cache,.  sqlite
13c0: 33 5f 65 72 72 63 6f 64 65 2c 0a 20 20 73 71 6c  3_errcode,.  sql
13d0: 69 74 65 33 5f 65 72 72 6d 73 67 2c 0a 20 20 73  ite3_errmsg,.  s
13e0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 2c  qlite3_errmsg16,
13f0: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 2c  .  sqlite3_exec,
1400: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72  .  sqlite3_expir
1410: 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ed,.  sqlite3_fi
1420: 6e 61 6c 69 7a 65 2c 0a 20 20 73 71 6c 69 74 65  nalize,.  sqlite
1430: 33 5f 66 72 65 65 2c 0a 20 20 73 71 6c 69 74 65  3_free,.  sqlite
1440: 33 5f 66 72 65 65 5f 74 61 62 6c 65 2c 0a 20 20  3_free_table,.  
1450: 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
1460: 63 6f 6d 6d 69 74 2c 0a 20 20 73 71 6c 69 74 65  commit,.  sqlite
1470: 33 5f 67 65 74 5f 61 75 78 64 61 74 61 2c 0a 20  3_get_auxdata,. 
1480: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62   sqlite3_get_tab
1490: 6c 65 2c 0a 20 20 30 2c 20 20 20 20 20 2f 2a 20  le,.  0,     /* 
14a0: 57 61 73 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62  Was sqlite3_glob
14b0: 61 6c 5f 72 65 63 6f 76 65 72 28 29 2c 20 62 75  al_recover(), bu
14c0: 74 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  t that function 
14d0: 69 73 20 64 65 70 72 65 63 61 74 65 64 20 2a 2f  is deprecated */
14e0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  .  sqlite3_inter
14f0: 72 75 70 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f  rupt,.  sqlite3_
1500: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
1510: 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 6c 69 62  d,.  sqlite3_lib
1520: 76 65 72 73 69 6f 6e 2c 0a 20 20 73 71 6c 69 74  version,.  sqlit
1530: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  e3_libversion_nu
1540: 6d 62 65 72 2c 0a 20 20 73 71 6c 69 74 65 33 5f  mber,.  sqlite3_
1550: 6d 61 6c 6c 6f 63 2c 0a 20 20 73 71 6c 69 74 65  malloc,.  sqlite
1560: 33 5f 6d 70 72 69 6e 74 66 2c 0a 20 20 73 71 6c  3_mprintf,.  sql
1570: 69 74 65 33 5f 6f 70 65 6e 2c 0a 20 20 73 71 6c  ite3_open,.  sql
1580: 69 74 65 33 5f 6f 70 65 6e 31 36 2c 0a 20 20 73  ite3_open16,.  s
1590: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 2c 0a  qlite3_prepare,.
15a0: 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
15b0: 65 31 36 2c 0a 20 20 73 71 6c 69 74 65 33 5f 70  e16,.  sqlite3_p
15c0: 72 6f 66 69 6c 65 2c 0a 20 20 73 71 6c 69 74 65  rofile,.  sqlite
15d0: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
15e0: 65 72 2c 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  er,.  sqlite3_re
15f0: 61 6c 6c 6f 63 2c 0a 20 20 73 71 6c 69 74 65 33  alloc,.  sqlite3
1600: 5f 72 65 73 65 74 2c 0a 20 20 73 71 6c 69 74 65  _reset,.  sqlite
1610: 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 2c 0a 20  3_result_blob,. 
1620: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1630: 64 6f 75 62 6c 65 2c 0a 20 20 73 71 6c 69 74 65  double,.  sqlite
1640: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 2c 0a  3_result_error,.
1650: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1660: 5f 65 72 72 6f 72 31 36 2c 0a 20 20 73 71 6c 69  _error16,.  sqli
1670: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 2c 0a  te3_result_int,.
1680: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1690: 5f 69 6e 74 36 34 2c 0a 20 20 73 71 6c 69 74 65  _int64,.  sqlite
16a0: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 2c 0a 20  3_result_null,. 
16b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
16c0: 74 65 78 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f  text,.  sqlite3_
16d0: 72 65 73 75 6c 74 5f 74 65 78 74 31 36 2c 0a 20  result_text16,. 
16e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
16f0: 74 65 78 74 31 36 62 65 2c 0a 20 20 73 71 6c 69  text16be,.  sqli
1700: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31  te3_result_text1
1710: 36 6c 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 72  6le,.  sqlite3_r
1720: 65 73 75 6c 74 5f 76 61 6c 75 65 2c 0a 20 20 73  esult_value,.  s
1730: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
1740: 68 6f 6f 6b 2c 0a 20 20 73 71 6c 69 74 65 33 5f  hook,.  sqlite3_
1750: 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 2c 0a  set_authorizer,.
1760: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
1770: 78 64 61 74 61 2c 0a 20 20 73 71 6c 69 74 65 33  xdata,.  sqlite3
1780: 5f 73 6e 70 72 69 6e 74 66 2c 0a 20 20 73 71 6c  _snprintf,.  sql
1790: 69 74 65 33 5f 73 74 65 70 2c 0a 20 20 73 71 6c  ite3_step,.  sql
17a0: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
17b0: 6e 5f 6d 65 74 61 64 61 74 61 2c 0a 20 20 73 71  n_metadata,.  sq
17c0: 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
17d0: 61 6e 75 70 2c 0a 20 20 73 71 6c 69 74 65 33 5f  anup,.  sqlite3_
17e0: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 2c 0a 20  total_changes,. 
17f0: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 2c 0a   sqlite3_trace,.
1800: 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66    sqlite3_transf
1810: 65 72 5f 62 69 6e 64 69 6e 67 73 2c 0a 20 20 73  er_bindings,.  s
1820: 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f  qlite3_update_ho
1830: 6f 6b 2c 0a 20 20 73 71 6c 69 74 65 33 5f 75 73  ok,.  sqlite3_us
1840: 65 72 5f 64 61 74 61 2c 0a 20 20 73 71 6c 69 74  er_data,.  sqlit
1850: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 2c 0a 20  e3_value_blob,. 
1860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
1870: 79 74 65 73 2c 0a 20 20 73 71 6c 69 74 65 33 5f  ytes,.  sqlite3_
1880: 76 61 6c 75 65 5f 62 79 74 65 73 31 36 2c 0a 20  value_bytes16,. 
1890: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
18a0: 6f 75 62 6c 65 2c 0a 20 20 73 71 6c 69 74 65 33  ouble,.  sqlite3
18b0: 5f 76 61 6c 75 65 5f 69 6e 74 2c 0a 20 20 73 71  _value_int,.  sq
18c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
18d0: 34 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  4,.  sqlite3_val
18e0: 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 2c  ue_numeric_type,
18f0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1900: 5f 74 65 78 74 2c 0a 20 20 73 71 6c 69 74 65 33  _text,.  sqlite3
1910: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 2c 0a 20  _value_text16,. 
1920: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
1930: 65 78 74 31 36 62 65 2c 0a 20 20 73 71 6c 69 74  ext16be,.  sqlit
1940: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
1950: 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  e,.  sqlite3_val
1960: 75 65 5f 74 79 70 65 2c 0a 20 20 73 71 6c 69 74  ue_type,.  sqlit
1970: 65 33 5f 76 6d 70 72 69 6e 74 66 2c 0a 20 20 2f  e3_vmprintf,.  /
1980: 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69  *.  ** The origi
1990: 6e 61 6c 20 41 50 49 20 73 65 74 20 65 6e 64 73  nal API set ends
19a0: 20 68 65 72 65 2e 20 20 41 6c 6c 20 65 78 74 65   here.  All exte
19b0: 6e 73 69 6f 6e 73 20 63 61 6e 20 63 61 6c 6c 20  nsions can call 
19c0: 61 6e 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  any.  ** of the 
19d0: 41 50 49 73 20 61 62 6f 76 65 20 70 72 6f 76 69  APIs above provi
19e0: 64 65 64 20 74 68 61 74 20 74 68 65 20 70 6f 69  ded that the poi
19f0: 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nter is not NULL
1a00: 2e 20 20 42 75 74 0a 20 20 2a 2a 20 62 65 66 6f  .  But.  ** befo
1a10: 72 65 20 63 61 6c 6c 69 6e 67 20 41 50 49 73 20  re calling APIs 
1a20: 74 68 61 74 20 66 6f 6c 6c 6f 77 2c 20 65 78 74  that follow, ext
1a30: 65 6e 73 69 6f 6e 20 73 68 6f 75 6c 64 20 63 68  ension should ch
1a40: 65 63 6b 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  eck the.  ** sql
1a50: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
1a60: 6e 75 6d 62 65 72 28 29 20 74 6f 20 6d 61 6b 65  number() to make
1a70: 20 73 75 72 65 20 74 68 65 79 20 61 72 65 20 64   sure they are d
1a80: 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a  ealing with.  **
1a90: 20 61 20 6c 69 62 72 61 72 79 20 74 68 61 74 20   a library that 
1aa0: 69 73 20 6e 65 77 20 65 6e 6f 75 67 68 20 74 6f  is new enough to
1ab0: 20 73 75 70 70 6f 72 74 20 74 68 61 74 20 41 50   support that AP
1ac0: 49 2e 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  I..  ***********
1ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20  **************. 
1b10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6f 76   */.  sqlite3_ov
1b20: 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 2c  erload_function,
1b30: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 64 64 65  ..  /*.  ** Adde
1b40: 64 20 61 66 74 65 72 20 33 2e 33 2e 31 33 0a 20  d after 3.3.13. 
1b50: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 70 72   */.  sqlite3_pr
1b60: 65 70 61 72 65 5f 76 32 2c 0a 20 20 73 71 6c 69  epare_v2,.  sqli
1b70: 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32  te3_prepare16_v2
1b80: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61  ,.  sqlite3_clea
1b90: 72 5f 62 69 6e 64 69 6e 67 73 2c 0a 0a 20 20 2f  r_bindings,..  /
1ba0: 2a 0a 20 20 2a 2a 20 41 64 64 65 64 20 66 6f 72  *.  ** Added for
1bb0: 20 33 2e 34 2e 31 0a 20 20 2a 2f 0a 20 20 73 71   3.4.1.  */.  sq
1bc0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64  lite3_create_mod
1bd0: 75 6c 65 5f 76 32 2c 0a 0a 20 20 2f 2a 0a 20 20  ule_v2,..  /*.  
1be0: 2a 2a 20 41 64 64 65 64 20 66 6f 72 20 33 2e 35  ** Added for 3.5
1bf0: 2e 30 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  .0.  */.  sqlite
1c00: 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 2c  3_bind_zeroblob,
1c10: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  .  sqlite3_blob_
1c20: 62 79 74 65 73 2c 0a 20 20 73 71 6c 69 74 65 33  bytes,.  sqlite3
1c30: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 2c 0a 20 20 73  _blob_close,.  s
1c40: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
1c50: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  ,.  sqlite3_blob
1c60: 5f 72 65 61 64 2c 0a 20 20 73 71 6c 69 74 65 33  _read,.  sqlite3
1c70: 5f 62 6c 6f 62 5f 77 72 69 74 65 2c 0a 20 20 73  _blob_write,.  s
1c80: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
1c90: 6c 6c 61 74 69 6f 6e 5f 76 32 2c 0a 20 20 73 71  llation_v2,.  sq
1ca0: 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
1cb0: 6f 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 6d 65  ol,.  sqlite3_me
1cc0: 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 2c 0a  mory_highwater,.
1cd0: 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79    sqlite3_memory
1ce0: 5f 75 73 65 64 2c 0a 23 69 66 64 65 66 20 53 51  _used,.#ifdef SQ
1cf0: 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a  LITE_MUTEX_NOOP.
1d00: 20 20 30 2c 20 0a 20 20 30 2c 20 0a 20 20 30 2c    0, .  0, .  0,
1d10: 0a 20 20 30 2c 0a 20 20 30 2c 0a 23 65 6c 73 65  .  0,.  0,.#else
1d20: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1d30: 5f 61 6c 6c 6f 63 2c 0a 20 20 73 71 6c 69 74 65  _alloc,.  sqlite
1d40: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 2c 0a 20  3_mutex_enter,. 
1d50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
1d60: 72 65 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ree,.  sqlite3_m
1d70: 75 74 65 78 5f 6c 65 61 76 65 2c 0a 20 20 73 71  utex_leave,.  sq
1d80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 2c  lite3_mutex_try,
1d90: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1da0: 33 5f 6f 70 65 6e 5f 76 32 2c 0a 20 20 73 71 6c  3_open_v2,.  sql
1db0: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
1dc0: 6f 72 79 2c 0a 20 20 73 71 6c 69 74 65 33 5f 72  ory,.  sqlite3_r
1dd0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
1de0: 6d 2c 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  m,.  sqlite3_res
1df0: 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67  ult_error_toobig
1e00: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65  ,.  sqlite3_slee
1e10: 70 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 6f 66  p,.  sqlite3_sof
1e20: 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c 0a 20 20  t_heap_limit,.  
1e30: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1e40: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ,.  sqlite3_vfs_
1e50: 72 65 67 69 73 74 65 72 2c 0a 20 20 73 71 6c 69  register,.  sqli
1e60: 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
1e70: 65 72 2c 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  er,..  /*.  ** A
1e80: 64 64 65 64 20 66 6f 72 20 33 2e 35 2e 38 0a 20  dded for 3.5.8. 
1e90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 74 68   */.  sqlite3_th
1ea0: 72 65 61 64 73 61 66 65 2c 0a 20 20 73 71 6c 69  readsafe,.  sqli
1eb0: 74 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62  te3_result_zerob
1ec0: 6c 6f 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f 72  lob,.  sqlite3_r
1ed0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
1ee0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  ,.  sqlite3_test
1ef0: 5f 63 6f 6e 74 72 6f 6c 2c 0a 20 20 73 71 6c 69  _control,.  sqli
1f00: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 2c 0a  te3_randomness,.
1f10: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1f20: 74 5f 64 62 5f 68 61 6e 64 6c 65 2c 0a 7d 3b 0a  t_db_handle,.};.
1f30: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1f40: 6f 20 6c 6f 61 64 20 61 6e 20 53 51 4c 69 74 65  o load an SQLite
1f50: 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61   extension libra
1f60: 72 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ry contained in 
1f70: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 7a 46 69 6c  the file.** zFil
1f80: 65 2e 20 20 54 68 65 20 65 6e 74 72 79 20 70 6f  e.  The entry po
1f90: 69 6e 74 20 69 73 20 7a 50 72 6f 63 2e 20 20 7a  int is zProc.  z
1fa0: 50 72 6f 63 20 6d 61 79 20 62 65 20 30 20 69 6e  Proc may be 0 in
1fb0: 20 77 68 69 63 68 20 63 61 73 65 20 61 0a 2a 2a   which case a.**
1fc0: 20 64 65 66 61 75 6c 74 20 65 6e 74 72 79 20 70   default entry p
1fd0: 6f 69 6e 74 20 6e 61 6d 65 20 28 73 71 6c 69 74  oint name (sqlit
1fe0: 65 33 5f 65 78 74 65 6e 73 69 6f 6e 5f 69 6e 69  e3_extension_ini
1ff0: 74 29 20 69 73 20 75 73 65 64 2e 20 20 55 73 65  t) is used.  Use
2000: 0a 2a 2a 20 6f 66 20 74 68 65 20 64 65 66 61 75  .** of the defau
2010: 6c 74 20 6e 61 6d 65 20 69 73 20 72 65 63 6f 6d  lt name is recom
2020: 6d 65 6e 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  mended..**.** Re
2030: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
2040: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 53 51  n success and SQ
2050: 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 73 6f  LITE_ERROR if so
2060: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
2070: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
2080: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64  error occurs and
2090: 20 70 7a 45 72 72 4d 73 67 20 69 73 20 6e 6f 74   pzErrMsg is not
20a0: 20 30 2c 20 74 68 65 6e 20 66 69 6c 6c 20 2a 70   0, then fill *p
20b0: 7a 45 72 72 4d 73 67 20 77 69 74 68 20 0a 2a 2a  zErrMsg with .**
20c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
20d0: 65 78 74 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ext.  The callin
20e0: 67 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  g function shoul
20f0: 64 20 66 72 65 65 20 74 68 69 73 20 6d 65 6d 6f  d free this memo
2100: 72 79 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67  ry.** by calling
2110: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
2120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2130: 71 6c 69 74 65 33 4c 6f 61 64 45 78 74 65 6e 73  qlite3LoadExtens
2140: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
2150: 64 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db,          /* 
2160: 4c 6f 61 64 20 74 68 65 20 65 78 74 65 6e 73 69  Load the extensi
2170: 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 64 61 74  on into this dat
2180: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2190: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
21a0: 20 2a 7a 46 69 6c 65 2c 20 20 20 20 2f 2a 20 4e   *zFile,    /* N
21b0: 61 6d 65 20 6f 66 20 74 68 65 20 73 68 61 72 65  ame of the share
21c0: 64 20 6c 69 62 72 61 72 79 20 63 6f 6e 74 61 69  d library contai
21d0: 6e 69 6e 67 20 65 78 74 65 6e 73 69 6f 6e 20 2a  ning extension *
21e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
21f0: 7a 50 72 6f 63 2c 20 20 20 20 2f 2a 20 45 6e 74  zProc,    /* Ent
2200: 72 79 20 70 6f 69 6e 74 2e 20 20 55 73 65 20 22  ry point.  Use "
2210: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 73 69 6f  sqlite3_extensio
2220: 6e 5f 69 6e 69 74 22 20 69 66 20 30 20 2a 2f 0a  n_init" if 0 */.
2230: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
2240: 67 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 65  g       /* Put e
2250: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65 72  rror message her
2260: 65 20 69 66 20 6e 6f 74 20 30 20 2a 2f 0a 29 7b  e if not 0 */.){
2270: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2280: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
2290: 0a 20 20 76 6f 69 64 20 2a 68 61 6e 64 6c 65 3b  .  void *handle;
22a0: 0a 20 20 69 6e 74 20 28 2a 78 49 6e 69 74 29 28  .  int (*xInit)(
22b0: 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
22c0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
22d0: 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
22e0: 63 68 61 72 20 2a 7a 45 72 72 6d 73 67 20 3d 20  char *zErrmsg = 
22f0: 30 3b 0a 20 20 76 6f 69 64 20 2a 2a 61 48 61 6e  0;.  void **aHan
2300: 64 6c 65 3b 0a 0a 20 20 2f 2a 20 54 69 63 6b 65  dle;..  /* Ticke
2310: 74 20 23 31 38 36 33 2e 20 20 54 6f 20 61 76 6f  t #1863.  To avo
2320: 69 64 20 61 20 63 72 65 61 74 69 6e 67 20 73 65  id a creating se
2330: 63 75 72 69 74 79 20 70 72 6f 62 6c 65 6d 73 20  curity problems 
2340: 66 6f 72 20 6f 6c 64 65 72 0a 20 20 2a 2a 20 61  for older.  ** a
2350: 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 68 61 74  pplications that
2360: 20 72 65 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20   relink against 
2370: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
2380: 66 20 53 51 4c 69 74 65 2c 20 74 68 65 0a 20 20  f SQLite, the.  
2390: 2a 2a 20 61 62 69 6c 69 74 79 20 74 6f 20 72 75  ** ability to ru
23a0: 6e 20 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  n load_extension
23b0: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 62   is turned off b
23c0: 79 20 64 65 66 61 75 6c 74 2e 20 20 4f 6e 65 0a  y default.  One.
23d0: 20 20 2a 2a 20 6d 75 73 74 20 63 61 6c 6c 20 73    ** must call s
23e0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
23f0: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 74  ad_extension() t
2400: 6f 20 74 75 72 6e 20 6f 6e 20 65 78 74 65 6e 73  o turn on extens
2410: 69 6f 6e 0a 20 20 2a 2a 20 6c 6f 61 64 69 6e 67  ion.  ** loading
2420: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 79 6f 75  .  Otherwise you
2430: 20 67 65 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69   get the followi
2440: 6e 67 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20  ng error..  */. 
2450: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
2460: 26 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  & SQLITE_LoadExt
2470: 65 6e 73 69 6f 6e 29 3d 3d 30 20 29 7b 0a 20 20  ension)==0 ){.  
2480: 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29    if( pzErrMsg )
2490: 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73  {.      *pzErrMs
24a0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
24b0: 6e 74 66 28 22 6e 6f 74 20 61 75 74 68 6f 72 69  ntf("not authori
24c0: 7a 65 64 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zed");.    }.   
24d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
24e0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
24f0: 20 7a 50 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20   zProc==0 ){.   
2500: 20 7a 50 72 6f 63 20 3d 20 22 73 71 6c 69 74 65   zProc = "sqlite
2510: 33 5f 65 78 74 65 6e 73 69 6f 6e 5f 69 6e 69 74  3_extension_init
2520: 22 3b 0a 20 20 7d 0a 0a 20 20 68 61 6e 64 6c 65  ";.  }..  handle
2530: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 6c 4f 70   = sqlite3OsDlOp
2540: 65 6e 28 70 56 66 73 2c 20 7a 46 69 6c 65 29 3b  en(pVfs, zFile);
2550: 0a 20 20 69 66 28 20 68 61 6e 64 6c 65 3d 3d 30  .  if( handle==0
2560: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 7a 45 72   ){.    if( pzEr
2570: 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 63 68  rMsg ){.      ch
2580: 61 72 20 7a 45 72 72 5b 32 35 36 5d 3b 0a 20 20  ar zErr[256];.  
2590: 20 20 20 20 7a 45 72 72 5b 73 69 7a 65 6f 66 28      zErr[sizeof(
25a0: 7a 45 72 72 29 2d 31 5d 20 3d 20 27 5c 30 27 3b  zErr)-1] = '\0';
25b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
25c0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
25d0: 45 72 72 29 2d 31 2c 20 7a 45 72 72 2c 20 0a 20  Err)-1, zErr, . 
25e0: 20 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65           "unable
25f0: 20 74 6f 20 6f 70 65 6e 20 73 68 61 72 65 64 20   to open shared 
2600: 6c 69 62 72 61 72 79 20 5b 25 73 5d 22 2c 20 7a  library [%s]", z
2610: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  File);.      sql
2620: 69 74 65 33 4f 73 44 6c 45 72 72 6f 72 28 70 56  ite3OsDlError(pV
2630: 66 73 2c 20 73 69 7a 65 6f 66 28 7a 45 72 72 29  fs, sizeof(zErr)
2640: 2d 31 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20  -1, zErr);.     
2650: 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
2660: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
2670: 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20   zErr);.    }.  
2680: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2690: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 78 49 6e  ERROR;.  }.  xIn
26a0: 69 74 20 3d 20 28 69 6e 74 28 2a 29 28 73 71 6c  it = (int(*)(sql
26b0: 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
26c0: 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
26d0: 6f 75 74 69 6e 65 73 2a 29 29 0a 20 20 20 20 20  outines*)).     
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
26f0: 6c 69 74 65 33 4f 73 44 6c 53 79 6d 28 70 56 66  lite3OsDlSym(pVf
2700: 73 2c 20 68 61 6e 64 6c 65 2c 20 7a 50 72 6f 63  s, handle, zProc
2710: 29 3b 0a 20 20 69 66 28 20 78 49 6e 69 74 3d 3d  );.  if( xInit==
2720: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 7a 45  0 ){.    if( pzE
2730: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 63  rrMsg ){.      c
2740: 68 61 72 20 7a 45 72 72 5b 32 35 36 5d 3b 0a 20  har zErr[256];. 
2750: 20 20 20 20 20 7a 45 72 72 5b 73 69 7a 65 6f 66       zErr[sizeof
2760: 28 7a 45 72 72 29 2d 31 5d 20 3d 20 27 5c 30 27  (zErr)-1] = '\0'
2770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2780: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2790: 7a 45 72 72 29 2d 31 2c 20 7a 45 72 72 2c 0a 20  zErr)-1, zErr,. 
27a0: 20 20 20 20 20 20 20 20 20 22 6e 6f 20 65 6e 74           "no ent
27b0: 72 79 20 70 6f 69 6e 74 20 5b 25 73 5d 20 69 6e  ry point [%s] in
27c0: 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 20   shared library 
27d0: 5b 25 73 5d 22 2c 20 7a 50 72 6f 63 2c 7a 46 69  [%s]", zProc,zFi
27e0: 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
27f0: 65 33 4f 73 44 6c 45 72 72 6f 72 28 70 56 66 73  e3OsDlError(pVfs
2800: 2c 20 73 69 7a 65 6f 66 28 7a 45 72 72 29 2d 31  , sizeof(zErr)-1
2810: 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 2a  , zErr);.      *
2820: 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
2830: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
2840: 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Err);.      sqli
2850: 74 65 33 4f 73 44 6c 43 6c 6f 73 65 28 70 56 66  te3OsDlClose(pVf
2860: 73 2c 20 68 61 6e 64 6c 65 29 3b 0a 20 20 20 20  s, handle);.    
2870: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  }.    return SQL
2880: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
2890: 73 65 20 69 66 28 20 78 49 6e 69 74 28 64 62 2c  se if( xInit(db,
28a0: 20 26 7a 45 72 72 6d 73 67 2c 20 26 73 71 6c 69   &zErrmsg, &sqli
28b0: 74 65 33 41 70 69 73 29 20 29 7b 0a 20 20 20 20  te3Apis) ){.    
28c0: 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a  if( pzErrMsg ){.
28d0: 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
28e0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
28f0: 66 28 22 65 72 72 6f 72 20 64 75 72 69 6e 67 20  f("error during 
2900: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 3a 20  initialization: 
2910: 25 73 22 2c 20 7a 45 72 72 6d 73 67 29 3b 0a 20  %s", zErrmsg);. 
2920: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2930: 5f 66 72 65 65 28 7a 45 72 72 6d 73 67 29 3b 0a  _free(zErrmsg);.
2940: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 6c 43      sqlite3OsDlC
2950: 6c 6f 73 65 28 70 56 66 73 2c 20 68 61 6e 64 6c  lose(pVfs, handl
2960: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
2970: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2980: 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
2990: 65 20 6e 65 77 20 73 68 61 72 65 64 20 6c 69 62  e new shared lib
29a0: 72 61 72 79 20 68 61 6e 64 6c 65 20 74 6f 20 74  rary handle to t
29b0: 68 65 20 64 62 2d 3e 61 45 78 74 65 6e 73 69 6f  he db->aExtensio
29c0: 6e 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 64 62  n array. */.  db
29d0: 2d 3e 6e 45 78 74 65 6e 73 69 6f 6e 2b 2b 3b 0a  ->nExtension++;.
29e0: 20 20 61 48 61 6e 64 6c 65 20 3d 20 73 71 6c 69    aHandle = sqli
29f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
2a00: 64 62 2c 20 73 69 7a 65 6f 66 28 68 61 6e 64 6c  db, sizeof(handl
2a10: 65 29 2a 64 62 2d 3e 6e 45 78 74 65 6e 73 69 6f  e)*db->nExtensio
2a20: 6e 29 3b 0a 20 20 69 66 28 20 61 48 61 6e 64 6c  n);.  if( aHandl
2a30: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
2a40: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2a50: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6e  .  }.  if( db->n
2a60: 45 78 74 65 6e 73 69 6f 6e 3e 30 20 29 7b 0a 20  Extension>0 ){. 
2a70: 20 20 20 6d 65 6d 63 70 79 28 61 48 61 6e 64 6c     memcpy(aHandl
2a80: 65 2c 20 64 62 2d 3e 61 45 78 74 65 6e 73 69 6f  e, db->aExtensio
2a90: 6e 2c 20 73 69 7a 65 6f 66 28 68 61 6e 64 6c 65  n, sizeof(handle
2aa0: 29 2a 28 64 62 2d 3e 6e 45 78 74 65 6e 73 69 6f  )*(db->nExtensio
2ab0: 6e 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  n-1));.  }.  sql
2ac0: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 45  ite3_free(db->aE
2ad0: 78 74 65 6e 73 69 6f 6e 29 3b 0a 20 20 64 62 2d  xtension);.  db-
2ae0: 3e 61 45 78 74 65 6e 73 69 6f 6e 20 3d 20 61 48  >aExtension = aH
2af0: 61 6e 64 6c 65 3b 0a 0a 20 20 64 62 2d 3e 61 45  andle;..  db->aE
2b00: 78 74 65 6e 73 69 6f 6e 5b 64 62 2d 3e 6e 45 78  xtension[db->nEx
2b10: 74 65 6e 73 69 6f 6e 2d 31 5d 20 3d 20 68 61 6e  tension-1] = han
2b20: 64 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  dle;.  return SQ
2b30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
2b40: 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
2b50: 6e 73 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  nsion(.  sqlite3
2b60: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 2f   *db,          /
2b70: 2a 20 4c 6f 61 64 20 74 68 65 20 65 78 74 65 6e  * Load the exten
2b80: 73 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 64  sion into this d
2b90: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2ba0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
2bb0: 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20 2f 2a  ar *zFile,    /*
2bc0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 68 61   Name of the sha
2bd0: 72 65 64 20 6c 69 62 72 61 72 79 20 63 6f 6e 74  red library cont
2be0: 61 69 6e 69 6e 67 20 65 78 74 65 6e 73 69 6f 6e  aining extension
2bf0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2c00: 20 2a 7a 50 72 6f 63 2c 20 20 20 20 2f 2a 20 45   *zProc,    /* E
2c10: 6e 74 72 79 20 70 6f 69 6e 74 2e 20 20 55 73 65  ntry point.  Use
2c20: 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 73   "sqlite3_extens
2c30: 69 6f 6e 5f 69 6e 69 74 22 20 69 66 20 30 20 2a  ion_init" if 0 *
2c40: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
2c50: 4d 73 67 20 20 20 20 20 20 20 2f 2a 20 50 75 74  Msg       /* Put
2c60: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68   error message h
2c70: 65 72 65 20 69 66 20 6e 6f 74 20 30 20 2a 2f 0a  ere if not 0 */.
2c80: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
2c90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2ca0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
2cb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 61   rc = sqlite3Loa
2cc0: 64 45 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a  dExtension(db, z
2cd0: 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 70 7a 45  File, zProc, pzE
2ce0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
2cf0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
2d00: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
2d10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2d20: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
2d30: 65 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  e when the datab
2d40: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
2d50: 73 20 63 6c 6f 73 69 6e 67 20 69 6e 20 6f 72 64  s closing in ord
2d60: 65 72 0a 2a 2a 20 74 6f 20 63 6c 65 61 6e 20 75  er.** to clean u
2d70: 70 20 6c 6f 61 64 65 64 20 65 78 74 65 6e 73 69  p loaded extensi
2d80: 6f 6e 73 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ons.*/.void sqli
2d90: 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f  te3CloseExtensio
2da0: 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ns(sqlite3 *db){
2db0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
2dc0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2dd0: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
2de0: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ) );.  for(i=0; 
2df0: 69 3c 64 62 2d 3e 6e 45 78 74 65 6e 73 69 6f 6e  i<db->nExtension
2e00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
2e10: 74 65 33 4f 73 44 6c 43 6c 6f 73 65 28 64 62 2d  te3OsDlClose(db-
2e20: 3e 70 56 66 73 2c 20 64 62 2d 3e 61 45 78 74 65  >pVfs, db->aExte
2e30: 6e 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20  nsion[i]);.  }. 
2e40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
2e50: 2d 3e 61 45 78 74 65 6e 73 69 6f 6e 29 3b 0a 7d  ->aExtension);.}
2e60: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  ../*.** Enable o
2e70: 72 20 64 69 73 61 62 6c 65 20 65 78 74 65 6e 73  r disable extens
2e80: 69 6f 6e 20 6c 6f 61 64 69 6e 67 2e 20 20 45 78  ion loading.  Ex
2e90: 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20  tension loading 
2ea0: 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 0a 2a  is disabled by.*
2eb0: 2a 20 64 65 66 61 75 6c 74 20 73 6f 20 61 73 20  * default so as 
2ec0: 6e 6f 74 20 74 6f 20 6f 70 65 6e 20 73 65 63 75  not to open secu
2ed0: 72 69 74 79 20 68 6f 6c 65 73 20 69 6e 20 6f 6c  rity holes in ol
2ee0: 64 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  der applications
2ef0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f00: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
2f10: 65 6e 73 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  ension(sqlite3 *
2f20: 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
2f30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2f40: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
2f50: 3b 0a 20 20 69 66 28 20 6f 6e 6f 66 66 20 29 7b  ;.  if( onoff ){
2f60: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
2f70: 3d 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  = SQLITE_LoadExt
2f80: 65 6e 73 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b  ension;.  }else{
2f90: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  .    db->flags &
2fa0: 3d 20 7e 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78  = ~SQLITE_LoadEx
2fb0: 74 65 6e 73 69 6f 6e 3b 0a 20 20 7d 0a 20 20 73  tension;.  }.  s
2fc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2fd0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
2fe0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ff0: 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
3000: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
3010: 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f  _EXTENSION */../
3020: 2a 0a 2a 2a 20 54 68 65 20 61 75 74 6f 2d 65 78  *.** The auto-ex
3030: 74 65 6e 73 69 6f 6e 20 63 6f 64 65 20 61 64 64  tension code add
3040: 65 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ed regardless of
3050: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
3060: 65 78 74 65 6e 73 69 6f 6e 0a 2a 2a 20 6c 6f 61  extension.** loa
3070: 64 69 6e 67 20 69 73 20 73 75 70 70 6f 72 74 65  ding is supporte
3080: 64 2e 20 20 57 65 20 6e 65 65 64 20 61 20 64 75  d.  We need a du
3090: 6d 6d 79 20 73 71 6c 69 74 65 33 41 70 69 73 20  mmy sqlite3Apis 
30a0: 70 6f 69 6e 74 65 72 20 66 6f 72 20 74 68 61 74  pointer for that
30b0: 0a 2a 2a 20 63 6f 64 65 20 69 66 20 72 65 67 75  .** code if regu
30c0: 6c 61 72 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f  lar extension lo
30d0: 61 64 69 6e 67 20 69 73 20 6e 6f 74 20 61 76 61  ading is not ava
30e0: 69 6c 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73  ilable.  This is
30f0: 20 74 68 61 74 0a 2a 2a 20 64 75 6d 6d 79 20 70   that.** dummy p
3100: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 64 65  ointer..*/.#ifde
3110: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
3120: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 63 6f 6e  AD_EXTENSION.con
3130: 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
3140: 6f 75 74 69 6e 65 73 20 73 71 6c 69 74 65 33 41  outines sqlite3A
3150: 70 69 73 20 3d 20 7b 20 30 20 7d 3b 0a 23 65 6e  pis = { 0 };.#en
3160: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
3170: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74  following object
3180: 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74 20   holds the list 
3190: 6f 66 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  of automatically
31a0: 20 6c 6f 61 64 65 64 0a 2a 2a 20 65 78 74 65 6e   loaded.** exten
31b0: 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sions..**.** Thi
31c0: 73 20 6c 69 73 74 20 69 73 20 73 68 61 72 65 64  s list is shared
31d0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e   across threads.
31e0: 20 20 54 68 65 20 53 51 4c 49 54 45 5f 4d 55 54    The SQLITE_MUT
31f0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
3200: 0a 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 62  .** mutex must b
3210: 65 20 68 65 6c 64 20 77 68 69 6c 65 20 61 63 63  e held while acc
3220: 65 73 73 69 6e 67 20 74 68 69 73 20 6c 69 73 74  essing this list
3230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
3240: 63 74 20 7b 0a 20 20 69 6e 74 20 6e 45 78 74 3b  ct {.  int nExt;
3250: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3260: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3270: 61 45 78 74 5b 5d 20 2a 2f 20 20 20 20 20 20 20  aExt[] */       
3280: 20 20 20 0a 20 20 76 6f 69 64 20 2a 2a 61 45 78     .  void **aEx
3290: 74 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  t;     /* Pointe
32a0: 72 73 20 74 6f 20 74 68 65 20 65 78 74 65 6e 73  rs to the extens
32b0: 69 6f 6e 20 69 6e 69 74 20 66 75 6e 63 74 69 6f  ion init functio
32c0: 6e 73 20 2a 2f 0a 7d 20 61 75 74 6f 65 78 74 20  ns */.} autoext 
32d0: 3d 20 7b 20 30 2c 20 30 20 7d 3b 0a 0a 0a 2f 2a  = { 0, 0 };.../*
32e0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 73  .** Register a s
32f0: 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64  tatically linked
3300: 20 65 78 74 65 6e 73 69 6f 6e 20 74 68 61 74 20   extension that 
3310: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
3320: 0a 2a 2a 20 6c 6f 61 64 65 64 20 62 79 20 65 76  .** loaded by ev
3330: 65 72 79 20 6e 65 77 20 64 61 74 61 62 61 73 65  ery new database
3340: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
3350: 69 6e 74 20 73 71 6c 69 74 65 33 5f 61 75 74 6f  int sqlite3_auto
3360: 5f 65 78 74 65 6e 73 69 6f 6e 28 76 6f 69 64 20  _extension(void 
3370: 2a 78 49 6e 69 74 29 7b 0a 20 20 69 6e 74 20 69  *xInit){.  int i
3380: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3390: 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
33a0: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d  3_mutex *mutex =
33b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
33c0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
33d0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
33e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
33f0: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a  x_enter(mutex);.
3400: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 75 74    for(i=0; i<aut
3410: 6f 65 78 74 2e 6e 45 78 74 3b 20 69 2b 2b 29 7b  oext.nExt; i++){
3420: 0a 20 20 20 20 69 66 28 20 61 75 74 6f 65 78 74  .    if( autoext
3430: 2e 61 45 78 74 5b 69 5d 3d 3d 78 49 6e 69 74 20  .aExt[i]==xInit 
3440: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
3450: 66 28 20 69 3d 3d 61 75 74 6f 65 78 74 2e 6e 45  f( i==autoext.nE
3460: 78 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  xt ){.    int nB
3470: 79 74 65 20 3d 20 28 61 75 74 6f 65 78 74 2e 6e  yte = (autoext.n
3480: 45 78 74 2b 31 29 2a 73 69 7a 65 6f 66 28 61 75  Ext+1)*sizeof(au
3490: 74 6f 65 78 74 2e 61 45 78 74 5b 30 5d 29 3b 0a  toext.aExt[0]);.
34a0: 20 20 20 20 76 6f 69 64 20 2a 2a 61 4e 65 77 3b      void **aNew;
34b0: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
34c0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 75 74 6f  te3_realloc(auto
34d0: 65 78 74 2e 61 45 78 74 2c 20 6e 42 79 74 65 29  ext.aExt, nByte)
34e0: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
34f0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
3500: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
3510: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
3520: 75 74 6f 65 78 74 2e 61 45 78 74 20 3d 20 61 4e  utoext.aExt = aN
3530: 65 77 3b 0a 20 20 20 20 20 20 61 75 74 6f 65 78  ew;.      autoex
3540: 74 2e 61 45 78 74 5b 61 75 74 6f 65 78 74 2e 6e  t.aExt[autoext.n
3550: 45 78 74 5d 20 3d 20 78 49 6e 69 74 3b 0a 20 20  Ext] = xInit;.  
3560: 20 20 20 20 61 75 74 6f 65 78 74 2e 6e 45 78 74      autoext.nExt
3570: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
3580: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
3590: 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 61 73  ave(mutex);.  as
35a0: 73 65 72 74 28 20 28 72 63 26 30 78 66 66 29 3d  sert( (rc&0xff)=
35b0: 3d 72 63 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  =rc );.  return 
35c0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  rc;.}../*.** Res
35d0: 65 74 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  et the automatic
35e0: 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69   extension loadi
35f0: 6e 67 20 6d 65 63 68 61 6e 69 73 6d 2e 0a 2a 2f  ng mechanism..*/
3600: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 72 65  .void sqlite3_re
3610: 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69  set_auto_extensi
3620: 6f 6e 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  on(void){.  sqli
3630: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
3640: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
3650: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
3660: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
3670: 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  R);.  sqlite3_mu
3680: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29  tex_enter(mutex)
3690: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
36a0: 28 61 75 74 6f 65 78 74 2e 61 45 78 74 29 3b 0a  (autoext.aExt);.
36b0: 20 20 61 75 74 6f 65 78 74 2e 61 45 78 74 20 3d    autoext.aExt =
36c0: 20 30 3b 0a 20 20 61 75 74 6f 65 78 74 2e 6e 45   0;.  autoext.nE
36d0: 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  xt = 0;.  sqlite
36e0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
36f0: 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  tex);.}../*.** L
3700: 6f 61 64 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69  oad all automati
3710: 63 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f  c extensions..*/
3720: 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 75 74 6f  .int sqlite3Auto
3730: 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 73  LoadExtensions(s
3740: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
3750: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 67 6f 20 3d  nt i;.  int go =
3760: 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   1;.  int rc = S
3770: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
3780: 28 2a 78 49 6e 69 74 29 28 73 71 6c 69 74 65 33  (*xInit)(sqlite3
3790: 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
37a0: 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
37b0: 6e 65 73 2a 29 3b 0a 0a 20 20 69 66 28 20 61 75  nes*);..  if( au
37c0: 74 6f 65 78 74 2e 6e 45 78 74 3d 3d 30 20 29 7b  toext.nExt==0 ){
37d0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 6d 6f 6e 20 63  .    /* Common c
37e0: 61 73 65 3a 20 65 61 72 6c 79 20 6f 75 74 20 77  ase: early out w
37f0: 69 74 68 6f 75 74 20 65 76 65 72 79 20 68 61 76  ithout every hav
3800: 69 6e 67 20 74 6f 20 61 63 71 75 69 72 65 20 61  ing to acquire a
3810: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 72 65   mutex */.    re
3820: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3830: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 67    }.  for(i=0; g
3840: 6f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  o; i++){.    cha
3850: 72 20 2a 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a  r *zErrmsg = 0;.
3860: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
3870: 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  x *mutex = sqlit
3880: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
3890: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
38a0: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
38b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
38c0: 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ter(mutex);.    
38d0: 69 66 28 20 69 3e 3d 61 75 74 6f 65 78 74 2e 6e  if( i>=autoext.n
38e0: 45 78 74 20 29 7b 0a 20 20 20 20 20 20 78 49 6e  Ext ){.      xIn
38f0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f  it = 0;.      go
3900: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
3910: 0a 20 20 20 20 20 20 78 49 6e 69 74 20 3d 20 28  .      xInit = (
3920: 69 6e 74 28 2a 29 28 73 71 6c 69 74 65 33 2a 2c  int(*)(sqlite3*,
3930: 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
3940: 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
3950: 73 2a 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  s*)).           
3960: 20 20 20 61 75 74 6f 65 78 74 2e 61 45 78 74 5b     autoext.aExt[
3970: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  i];.    }.    sq
3980: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
3990: 65 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66  e(mutex);.    if
39a0: 28 20 78 49 6e 69 74 20 26 26 20 78 49 6e 69 74  ( xInit && xInit
39b0: 28 64 62 2c 20 26 7a 45 72 72 6d 73 67 2c 20 26  (db, &zErrmsg, &
39c0: 73 71 6c 69 74 65 33 41 70 69 73 29 20 29 7b 0a  sqlite3Apis) ){.
39d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
39e0: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52  or(db, SQLITE_ER
39f0: 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ROR,.           
3a00: 20 22 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65   "automatic exte
3a10: 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 66 61  nsion loading fa
3a20: 69 6c 65 64 3a 20 25 73 22 2c 20 7a 45 72 72 6d  iled: %s", zErrm
3a30: 73 67 29 3b 0a 20 20 20 20 20 20 67 6f 20 3d 20  sg);.      go = 
3a40: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  0;.      rc = SQ
3a50: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
3a60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
3a70: 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  Errmsg);.    }. 
3a80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
3a90: 7d 0a                                            }.