Add initialization functions for internal usage in libsqlite3.so.

--- /ext/misc/carray.c
+++ /ext/misc/carray.c
@@ -383,16 +383,8 @@
 
 #endif /* SQLITE_OMIT_VIRTUALTABLE */
 
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_carray_init(
-  sqlite3 *db, 
-  char **pzErrMsg, 
-  const sqlite3_api_routines *pApi
-){
+int sqlite3CarrayInit(sqlite3 *db){
   int rc = SQLITE_OK;
-  SQLITE_EXTENSION_INIT2(pApi);
 #ifndef SQLITE_OMIT_VIRTUALTABLE
   rc = sqlite3_create_module(db, "carray", &carrayModule, 0);
 #ifdef SQLITE_TEST
@@ -404,3 +396,18 @@
 #endif /* SQLITE_OMIT_VIRTUALTABLE */
   return rc;
 }
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_carray_init(
+  sqlite3 *db, 
+  char **pzErrMsg, 
+  const sqlite3_api_routines *pApi
+){
+  SQLITE_EXTENSION_INIT2(pApi);
+  (void)pzErrMsg;  /* Unused parameter */
+  return sqlite3CarrayInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/completion.c
+++ /ext/misc/completion.c
@@ -483,12 +483,13 @@
   return rc;
 }
 
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
 #ifdef _WIN32
 __declspec(dllexport)
 #endif
 int sqlite3_completion_init(
-  sqlite3 *db, 
-  char **pzErrMsg, 
+  sqlite3 *db,
+  char **pzErrMsg,
   const sqlite3_api_routines *pApi
 ){
   int rc = SQLITE_OK;
@@ -499,3 +500,4 @@
 #endif
   return rc;
 }
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/csv.c
+++ /ext/misc/csv.c
@@ -928,6 +928,22 @@
 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) */
 
 
+int sqlite3CsvInit(sqlite3 *db){
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+  int rc;
+  rc = sqlite3_create_module(db, "csv", &CsvModule, 0);
+#ifdef SQLITE_TEST
+  if( rc==SQLITE_OK ){
+    rc = sqlite3_create_module(db, "csv_wr", &CsvModuleFauxWrite, 0);
+  }
+#endif
+  return rc;
+#else
+  return SQLITE_OK;
+#endif
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
 #ifdef _WIN32
 __declspec(dllexport)
 #endif
@@ -941,17 +957,8 @@
   char **pzErrMsg, 
   const sqlite3_api_routines *pApi
 ){
-#ifndef SQLITE_OMIT_VIRTUALTABLE	
-  int rc;
   SQLITE_EXTENSION_INIT2(pApi);
-  rc = sqlite3_create_module(db, "csv", &CsvModule, 0);
-#ifdef SQLITE_TEST
-  if( rc==SQLITE_OK ){
-    rc = sqlite3_create_module(db, "csv_wr", &CsvModuleFauxWrite, 0);
-  }
-#endif
-  return rc;
-#else
-  return SQLITE_OK;
-#endif
+  (void)pzErrMsg;  /* Unused parameter */
+  return sqlite3CsvInit(db);
 }
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/dbdata.c
+++ /ext/misc/dbdata.c
@@ -803,7 +803,7 @@
 /*
 ** Invoke this routine to register the "sqlite_dbdata" virtual table module
 */
-static int sqlite3DbdataRegister(sqlite3 *db){
+int sqlite3DbdataRegister(sqlite3 *db){
   static sqlite3_module dbdata_module = {
     0,                            /* iVersion */
     0,                            /* xCreate */
@@ -838,6 +838,7 @@
   return rc;
 }
 
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
 #ifdef _WIN32
 __declspec(dllexport)
 #endif
@@ -849,3 +850,4 @@
   SQLITE_EXTENSION_INIT2(pApi);
   return sqlite3DbdataRegister(db);
 }
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/eval.c
+++ /ext/misc/eval.c
@@ -102,6 +102,20 @@
 }
 
 
+int sqlite3EvalInit(sqlite3 *db){
+  int rc = SQLITE_OK;
+  rc = sqlite3_create_function(db, "eval", 1,
+                               SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
+                               sqlEvalFunc, 0, 0);
+  if( rc==SQLITE_OK ){
+    rc = sqlite3_create_function(db, "eval", 2,
+                                 SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
+                                 sqlEvalFunc, 0, 0);
+  }
+  return rc;
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
 #ifdef _WIN32
 __declspec(dllexport)
 #endif
@@ -110,16 +124,8 @@
   char **pzErrMsg, 
   const sqlite3_api_routines *pApi
 ){
-  int rc = SQLITE_OK;
   SQLITE_EXTENSION_INIT2(pApi);
   (void)pzErrMsg;  /* Unused parameter */
-  rc = sqlite3_create_function(db, "eval", 1, 
-                               SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
-                               sqlEvalFunc, 0, 0);
-  if( rc==SQLITE_OK ){
-    rc = sqlite3_create_function(db, "eval", 2,
-                                 SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
-                                 sqlEvalFunc, 0, 0);
-  }
-  return rc;
+  return sqlite3EvalInit(db);
 }
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/fileio.c
+++ /ext/misc/fileio.c
@@ -340,7 +340,7 @@
 ** This function does the work for the writefile() UDF. Refer to 
 ** header comments at the top of this file for details.
 */
-static int writeFile(
+static int writeFileContents(
   sqlite3_context *pCtx,          /* Context to return bytes written in */
   const char *zFile,              /* File to write */
   sqlite3_value *pData,           /* Data to write */
@@ -480,10 +480,10 @@
     mtime = sqlite3_value_int64(argv[3]);
   }
 
-  res = writeFile(context, zFile, argv[1], mode, mtime);
+  res = writeFileContents(context, zFile, argv[1], mode, mtime);
   if( res==1 && errno==ENOENT ){
     if( makeDirectory(zFile)==SQLITE_OK ){
-      res = writeFile(context, zFile, argv[1], mode, mtime);
+      res = writeFileContents(context, zFile, argv[1], mode, mtime);
     }
   }
 
@@ -970,18 +970,9 @@
 # define fsdirRegister(x) SQLITE_OK
 #endif
 
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_fileio_init(
-  sqlite3 *db, 
-  char **pzErrMsg, 
-  const sqlite3_api_routines *pApi
-){
+int sqlite3FileioInit(sqlite3 *db){
   int rc = SQLITE_OK;
-  SQLITE_EXTENSION_INIT2(pApi);
-  (void)pzErrMsg;  /* Unused parameter */
-  rc = sqlite3_create_function(db, "readfile", 1, 
+  rc = sqlite3_create_function(db, "readfile", 1,
                                SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
                                readfileFunc, 0, 0);
   if( rc==SQLITE_OK ){
@@ -998,3 +989,18 @@
   }
   return rc;
 }
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_fileio_init(
+  sqlite3 *db, 
+  char **pzErrMsg, 
+  const sqlite3_api_routines *pApi
+){
+  SQLITE_EXTENSION_INIT2(pApi);
+  (void)pzErrMsg;  /* Unused parameter */
+  return sqlite3FileioInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/ieee754.c
+++ /ext/misc/ieee754.c
@@ -110,6 +110,20 @@
 }
 
 
+int sqlite3IeeeInit(sqlite3 *db){
+  int rc = SQLITE_OK;
+  rc = sqlite3_create_function(db, "ieee754", 1,
+                               SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
+                               ieee754func, 0, 0);
+  if( rc==SQLITE_OK ){
+    rc = sqlite3_create_function(db, "ieee754", 2,
+                                 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
+                                 ieee754func, 0, 0);
+  }
+  return rc;
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
 #ifdef _WIN32
 __declspec(dllexport)
 #endif
@@ -118,16 +132,8 @@
   char **pzErrMsg, 
   const sqlite3_api_routines *pApi
 ){
-  int rc = SQLITE_OK;
   SQLITE_EXTENSION_INIT2(pApi);
   (void)pzErrMsg;  /* Unused parameter */
-  rc = sqlite3_create_function(db, "ieee754", 1, 
-                               SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
-                               ieee754func, 0, 0);
-  if( rc==SQLITE_OK ){
-    rc = sqlite3_create_function(db, "ieee754", 2,
-                                 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
-                                 ieee754func, 0, 0);
-  }
-  return rc;
+  return sqlite3IeeeInit(db);
 }
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/regexp.c
+++ /ext/misc/regexp.c
@@ -740,10 +740,18 @@
   }
 }
 
+int sqlite3RegexpInit(sqlite3 *db){
+  int rc = SQLITE_OK;
+  rc = sqlite3_create_function(db, "regexp", 2, SQLITE_UTF8|SQLITE_INNOCUOUS,
+                               0, re_sql_func, 0, 0);
+  return rc;
+}
+
 /*
 ** Invoke this routine to register the regexp() function with the
 ** SQLite database connection.
 */
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
 #ifdef _WIN32
 __declspec(dllexport)
 #endif
@@ -752,9 +760,8 @@
   char **pzErrMsg, 
   const sqlite3_api_routines *pApi
 ){
-  int rc = SQLITE_OK;
   SQLITE_EXTENSION_INIT2(pApi);
-  rc = sqlite3_create_function(db, "regexp", 2, SQLITE_UTF8|SQLITE_INNOCUOUS,
-                               0, re_sql_func, 0, 0);
-  return rc;
+  (void)pzErrMsg;  /* Unused parameter */
+  return sqlite3RegexpInit(db);
 }
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/sha1.c
+++ /ext/misc/sha1.c
@@ -175,7 +175,7 @@
 }
 
 /* Compute a string using sqlite3_vsnprintf() and hash it */
-static void hash_step_vformat(
+static void sha1_hash_step_vformat(
   SHA1Context *p,                 /* Add content to this context */
   const char *zFormat,
   ...
@@ -306,7 +306,7 @@
     nCol = sqlite3_column_count(pStmt);
     z = sqlite3_sql(pStmt);
     n = (int)strlen(z);
-    hash_step_vformat(&cx,"S%d:",n);
+    sha1_hash_step_vformat(&cx,"S%d:",n);
     hash_step(&cx,(unsigned char*)z,n);
 
     /* Compute a hash over the result of the query */
@@ -349,14 +349,14 @@
           case SQLITE_TEXT: {
             int n2 = sqlite3_column_bytes(pStmt, i);
             const unsigned char *z2 = sqlite3_column_text(pStmt, i);
-            hash_step_vformat(&cx,"T%d:",n2);
+            sha1_hash_step_vformat(&cx,"T%d:",n2);
             hash_step(&cx, z2, n2);
             break;
           }
           case SQLITE_BLOB: {
             int n2 = sqlite3_column_bytes(pStmt, i);
             const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
-            hash_step_vformat(&cx,"B%d:",n2);
+            sha1_hash_step_vformat(&cx,"B%d:",n2);
             hash_step(&cx, z2, n2);
             break;
           }
@@ -370,6 +370,20 @@
 }
 
 
+int sqlite3ShaInit(sqlite3 *db){
+  int rc = SQLITE_OK;
+  rc = sqlite3_create_function(db, "sha1", 1,
+                       SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
+                               0, sha1Func, 0, 0);
+  if( rc==SQLITE_OK ){
+    rc = sqlite3_create_function(db, "sha1_query", 1,
+                                 SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
+                                 sha1QueryFunc, 0, 0);
+  }
+  return rc;
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
 #ifdef _WIN32
 __declspec(dllexport)
 #endif
@@ -378,16 +392,8 @@
   char **pzErrMsg,
   const sqlite3_api_routines *pApi
 ){
-  int rc = SQLITE_OK;
   SQLITE_EXTENSION_INIT2(pApi);
   (void)pzErrMsg;  /* Unused parameter */
-  rc = sqlite3_create_function(db, "sha1", 1, 
-                       SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
-                               0, sha1Func, 0, 0);
-  if( rc==SQLITE_OK ){
-    rc = sqlite3_create_function(db, "sha1_query", 1, 
-                                 SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
-                                 sha1QueryFunc, 0, 0);
-  }
-  return rc;
+  return sqlite3ShaInit(db);
 }
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/shathree.c
+++ /ext/misc/shathree.c
@@ -527,7 +527,7 @@
 /* Compute a string using sqlite3_vsnprintf() with a maximum length
 ** of 50 bytes and add it to the hash.
 */
-static void hash_step_vformat(
+static void sha3_hash_step_vformat(
   SHA3Context *p,                 /* Add content to this context */
   const char *zFormat,
   ...
@@ -622,7 +622,7 @@
     nCol = sqlite3_column_count(pStmt);
     z = sqlite3_sql(pStmt);
     n = (int)strlen(z);
-    hash_step_vformat(&cx,"S%d:",n);
+    sha3_hash_step_vformat(&cx,"S%d:",n);
     SHA3Update(&cx,(unsigned char*)z,n);
 
     /* Compute a hash over the result of the query */
@@ -665,14 +665,14 @@
           case SQLITE_TEXT: {
             int n2 = sqlite3_column_bytes(pStmt, i);
             const unsigned char *z2 = sqlite3_column_text(pStmt, i);
-            hash_step_vformat(&cx,"T%d:",n2);
+            sha3_hash_step_vformat(&cx,"T%d:",n2);
             SHA3Update(&cx, z2, n2);
             break;
           }
           case SQLITE_BLOB: {
             int n2 = sqlite3_column_bytes(pStmt, i);
             const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
-            hash_step_vformat(&cx,"B%d:",n2);
+            sha3_hash_step_vformat(&cx,"B%d:",n2);
             SHA3Update(&cx, z2, n2);
             break;
           }
@@ -685,17 +685,8 @@
 }
 
 
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_shathree_init(
-  sqlite3 *db,
-  char **pzErrMsg,
-  const sqlite3_api_routines *pApi
-){
+int sqlite3ShathreeInit(sqlite3 *db){
   int rc = SQLITE_OK;
-  SQLITE_EXTENSION_INIT2(pApi);
-  (void)pzErrMsg;  /* Unused parameter */
   rc = sqlite3_create_function(db, "sha3", 1,
                       SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
                       0, sha3Func, 0, 0);
@@ -716,3 +707,18 @@
   }
   return rc;
 }
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_shathree_init(
+  sqlite3 *db,
+  char **pzErrMsg,
+  const sqlite3_api_routines *pApi
+){
+  SQLITE_EXTENSION_INIT2(pApi);
+  (void)pzErrMsg;  /* Unused parameter */
+  return sqlite3ShathreeInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/sqlar.c
+++ /ext/misc/sqlar.c
@@ -14,6 +14,8 @@
 ** for working with sqlar archives and used by the shell tool's built-in
 ** sqlar support.
 */
+#ifdef SQLITE_HAVE_ZLIB
+
 #include "sqlite3ext.h"
 SQLITE_EXTENSION_INIT1
 #include <zlib.h>
@@ -101,6 +103,20 @@
 }
 
 
+int sqlite3SqlarInit(sqlite3 *db){
+  int rc = SQLITE_OK;
+  rc = sqlite3_create_function(db, "sqlar_compress", 1,
+                               SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
+                               sqlarCompressFunc, 0, 0);
+  if( rc==SQLITE_OK ){
+    rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
+                                 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
+                                 sqlarUncompressFunc, 0, 0);
+  }
+  return rc;
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
 #ifdef _WIN32
 __declspec(dllexport)
 #endif
@@ -109,16 +125,10 @@
   char **pzErrMsg, 
   const sqlite3_api_routines *pApi
 ){
-  int rc = SQLITE_OK;
   SQLITE_EXTENSION_INIT2(pApi);
   (void)pzErrMsg;  /* Unused parameter */
-  rc = sqlite3_create_function(db, "sqlar_compress", 1, 
-                               SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
-                               sqlarCompressFunc, 0, 0);
-  if( rc==SQLITE_OK ){
-    rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
-                                 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
-                                 sqlarUncompressFunc, 0, 0);
-  }
-  return rc;
+  return sqlite3SqlarInit(db);
 }
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
+
+#endif /* SQLITE_HAVE_ZLIB */
--- /ext/misc/totype.c
+++ /ext/misc/totype.c
@@ -491,17 +491,8 @@
 #pragma warning(default: 4748)
 #endif
 
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_totype_init(
-  sqlite3 *db,
-  char **pzErrMsg,
-  const sqlite3_api_routines *pApi
-){
+int sqlite3TotypeInit(sqlite3 *db){
   int rc = SQLITE_OK;
-  SQLITE_EXTENSION_INIT2(pApi);
-  (void)pzErrMsg;  /* Unused parameter */
   rc = sqlite3_create_function(db, "tointeger", 1,
         SQLITE_UTF8 | SQLITE_DETERMINISTIC | SQLITE_INNOCUOUS, 0,
         tointegerFunc, 0, 0);
@@ -512,3 +503,18 @@
   }
   return rc;
 }
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_totype_init(
+  sqlite3 *db,
+  char **pzErrMsg,
+  const sqlite3_api_routines *pApi
+){
+  SQLITE_EXTENSION_INIT2(pApi);
+  (void)pzErrMsg;  /* Unused parameter */
+  return sqlite3TotypeInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/uint.c
+++ /ext/misc/uint.c
@@ -78,6 +78,11 @@
   return (nKey1 - i) - (nKey2 - j);
 }
 
+int sqlite3UintInit(sqlite3 *db){
+  return sqlite3_create_collation(db, "UINT", SQLITE_UTF8, 0, uintCollFunc);
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
 #ifdef _WIN32
 __declspec(dllexport)
 #endif
@@ -88,5 +93,6 @@
 ){
   SQLITE_EXTENSION_INIT2(pApi);
   (void)pzErrMsg;  /* Unused parameter */
-  return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc);
+  return sqlite3UintInit(db);
 }
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/uuid.c
+++ /ext/misc/uuid.c
@@ -206,21 +206,12 @@
   sqlite3_result_blob(context, pBlob, 16, SQLITE_TRANSIENT);
 }
 
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_uuid_init(
-  sqlite3 *db,
-  char **pzErrMsg,
-  const sqlite3_api_routines *pApi
-){
+int sqlite3UuidInit(sqlite3 *db){
   int rc = SQLITE_OK;
-  SQLITE_EXTENSION_INIT2(pApi);
-  (void)pzErrMsg;  /* Unused parameter */
   rc = sqlite3_create_function(db, "uuid", 0, SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
                                sqlite3UuidFunc, 0, 0);
   if( rc==SQLITE_OK ){
-    rc = sqlite3_create_function(db, "uuid_str", 1, 
+    rc = sqlite3_create_function(db, "uuid_str", 1,
                        SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
                        0, sqlite3UuidStrFunc, 0, 0);
   }
@@ -231,3 +222,18 @@
   }
   return rc;
 }
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_uuid_init(
+  sqlite3 *db,
+  char **pzErrMsg,
+  const sqlite3_api_routines *pApi
+){
+  SQLITE_EXTENSION_INIT2(pApi);
+  (void)pzErrMsg;  /* Unused parameter */
+  return sqlite3UuidInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/zipfile.c
+++ /ext/misc/zipfile.c
@@ -24,6 +24,8 @@
 **    *  No support for zip64 extensions
 **    *  Only the "inflate/deflate" (zlib) compression method is supported
 */
+#ifdef SQLITE_HAVE_ZLIB
+
 #include "sqlite3ext.h"
 SQLITE_EXTENSION_INIT1
 #include <stdio.h>
@@ -2137,7 +2139,7 @@
 /*
 ** Register the "zipfile" virtual table.
 */
-static int zipfileRegister(sqlite3 *db){
+int sqlite3ZipfileInit(sqlite3 *db){
   static sqlite3_module zipfileModule = {
     1,                         /* iVersion */
     zipfileConnect,            /* xCreate */
@@ -2171,9 +2173,10 @@
   return rc;
 }
 #else         /* SQLITE_OMIT_VIRTUALTABLE */
-# define zipfileRegister(x) SQLITE_OK
+# define sqlite3ZipfileInit(x) SQLITE_OK
 #endif
 
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
 #ifdef _WIN32
 __declspec(dllexport)
 #endif
@@ -2184,5 +2187,8 @@
 ){
   SQLITE_EXTENSION_INIT2(pApi);
   (void)pzErrMsg;  /* Unused parameter */
-  return zipfileRegister(db);
+  return sqlite3ZipfileInit(db);
 }
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
+
+#endif /* SQLITE_HAVE_ZLIB */
