Enhance the sqlite3_load_extension() API so that the first parameter (the "db"
parameter) can be NULL.  An extension that is not associated with any 
database connection remains loaded for the life of the process.

FossilOrigin-Name: 3a461043898a77b14ffc12b5e332b3d65a8dca1d
diff --git a/manifest b/manifest
index 98076dc..ff5f50c 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sthe\svfsstat.c\sloadable\sextension\s-\sa\sVFS\sshim\sthat\smeasures\sthe\samount\nof\sI/O,\sand\san\seponymous\svirtual\stable\sthat\sis\sused\sto\sextract\sand\sview\nthe\smeasurements.
-D 2016-05-28T14:53:48.676
+C Enhance\sthe\ssqlite3_load_extension()\sAPI\sso\sthat\sthe\sfirst\sparameter\s(the\s"db"\nparameter)\scan\sbe\sNULL.\s\sAn\sextension\sthat\sis\snot\sassociated\swith\sany\s\ndatabase\sconnection\sremains\sloaded\sfor\sthe\slife\sof\sthe\sprocess.
+D 2016-05-28T15:03:06.118
 F Makefile.in f59e0763ff448719fc1bd25513882b0567286317
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 306d73e854b1a92ea06e5d1e637faa5c44de53c7
@@ -344,7 +344,7 @@
 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08
 F src/insert.c 8f4e9fcbd8e95e85f15647ba8b413b18d556ec2b
 F src/legacy.c 75d3023be8f0d2b99d60f905090341a03358c58e
-F src/loadext.c 8b3a73f0624c5f7cadbd5cb89940783bee1d39a6
+F src/loadext.c f2316d5ccd905d86260392fb8d2b5fd67335ed77
 F src/main.c 405d13e3a4f7c5add9fb27702ae70ed0a6e32cca
 F src/malloc.c 1443d1ad95d67c21d77af7ae3f44678252f0efec
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
@@ -381,7 +381,7 @@
 F src/resolve.c cca3aa77b95706df5d635a2141a4d1de60ae6598
 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
 F src/select.c a0c4abf54bc6bd3a9c77a36ef3d1676045706cb2
-F src/shell.c 14ff7f660530a52b117d110ba3390b7b2eb719b6
+F src/shell.c c80b8d562b66d27172b0e98333f2f27876d8b4aa
 F src/sqlite.h.in 9984129d86243424b765fcb3f147c697bd20bb54
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 98f72cbfe00169c39089115427d06ea05fe4b4a2
@@ -1496,7 +1496,10 @@
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 71087c12bc75a82f5d1051600a442ef6efc5e899
-R 3d452eed48a36d85ceafabad1e13a1b0
+P 0987487dd4ebfcf66ddeec8ceca47775216a0887
+R e12f783957b755fbf23064ac37b7305b
+T *branch * persistent-extensions
+T *sym-persistent-extensions *
+T -sym-trunk *
 U drh
-Z 226f41fb99617919dc67fcf97f9a5431
+Z 7c91f0eea3a925fa49de1662b44330b3
diff --git a/manifest.uuid b/manifest.uuid
index 4270f95..3d28105 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-0987487dd4ebfcf66ddeec8ceca47775216a0887
\ No newline at end of file
+3a461043898a77b14ffc12b5e332b3d65a8dca1d
\ No newline at end of file
diff --git a/src/loadext.c b/src/loadext.c
index f881d99..32be3e6 100644
--- a/src/loadext.c
+++ b/src/loadext.c
@@ -437,7 +437,7 @@
   const char *zProc,    /* Entry point.  Use "sqlite3_extension_init" if 0 */
   char **pzErrMsg       /* Put error message here if not 0 */
 ){
-  sqlite3_vfs *pVfs = db->pVfs;
+  sqlite3_vfs *pVfs = db ? db->pVfs : sqlite3_vfs_find(0);
   void *handle;
   int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*);
   char *zErrmsg = 0;
@@ -468,7 +468,7 @@
   ** sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, 0)
   ** to turn on extension loading.
   */
-  if( (db->flags & SQLITE_LoadExtension)==0 ){
+  if( db && (db->flags & SQLITE_LoadExtension)==0 ){
     if( pzErrMsg ){
       *pzErrMsg = sqlite3_mprintf("not authorized");
     }
@@ -558,17 +558,18 @@
   }
 
   /* Append the new shared library handle to the db->aExtension array. */
-  aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1));
-  if( aHandle==0 ){
-    return SQLITE_NOMEM_BKPT;
+  if( db ){
+    aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1));
+    if( aHandle==0 ){
+      return SQLITE_NOMEM_BKPT;
+    }
+    if( db->nExtension>0 ){
+      memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension);
+    }
+    sqlite3DbFree(db, db->aExtension);
+    db->aExtension = aHandle;
+    db->aExtension[db->nExtension++] = handle;
   }
-  if( db->nExtension>0 ){
-    memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension);
-  }
-  sqlite3DbFree(db, db->aExtension);
-  db->aExtension = aHandle;
-
-  db->aExtension[db->nExtension++] = handle;
   return SQLITE_OK;
 }
 int sqlite3_load_extension(
@@ -578,6 +579,7 @@
   char **pzErrMsg       /* Put error message here if not 0 */
 ){
   int rc;
+  if( db==0 ) return sqlite3LoadExtension(0, zFile, zProc, pzErrMsg);
   sqlite3_mutex_enter(db->mutex);
   rc = sqlite3LoadExtension(db, zFile, zProc, pzErrMsg);
   rc = sqlite3ApiExit(db, rc);
diff --git a/src/shell.c b/src/shell.c
index 5148177..4559d47 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -3755,7 +3755,7 @@
     }
     zFile = azArg[1];
     zProc = nArg>=3 ? azArg[2] : 0;
-    open_db(p, 0);
+    /*    open_db(p, 0); */
     rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
     if( rc!=SQLITE_OK ){
       utf8_printf(stderr, "Error: %s\n", zErrMsg);