我正在尝试加载regexp.c扩展名以将REGEXP运算符添加到sqlite中。我做了什么:
在VS2015中创建测试项目
#include <stdio.h>
#include "stdafx.h"
#include "sqlite3.h"
const char* SQL = "SELECT load_extension('sqlite3.obj', 'sqlite3_regexp_init');";
int main(int argc, char **argv) {
sqlite3 *db = 0; // the hande of connection object to db
char *err = 0;
char *errMsg = "unable to load extension";
// open connection
if (sqlite3_open("my_cosy_database.dblite", &db))
fprintf(stderr, "Error during opening/creation DB: %s\n", sqlite3_errmsg(db));
/*else if (sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, 0))
{
fprintf(stderr, "Cannot enable extensions loading: %s\n", sqlite3_errmsg(db));
}*/
else if (sqlite3_enable_load_extension(db, 1))
{
fprintf(stderr, "Cannot enable extensions loading: %s\n", sqlite3_errmsg(db));
}
// execute SQL
else if (sqlite3_load_extension(db, "sqlite3.obj", "sqlite3_regexp_init", &errMsg))
{
fprintf(stderr, "Cannot load sqlite3_regexp_init extension: %s\n", sqlite3_errmsg(db));
}
else if (sqlite3_exec(db, SQL, callback, 0, &err))
{
fprintf(stderr, "Ошибка SQL: %sn", err);
sqlite3_free(err);
}
// close connection
sqlite3_close(db);
return 0;
}
Official documentation说:“出于安全原因,默认情况下会关闭扩展加载。为了使用C语言或SQL扩展加载函数,必须首先使用sqlite3_db_config启用扩展加载(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION,1,NULL)应用程序中的C语言API。“所以这就是我所做的。问题是我每次调用sqlite3_load_extension或sqlite3_exec时都得到。注释sqlite3_enable_load_extension和未注释的sqlite3_db_config会出现同样的问题。我不知道是什么导致了这个异常,并且没有明确的C api用法示例(即使在'Using Sqlite'一书中)。我能找到的一件事是引起这种异常的陈述:“( pCtx-&gt; pFunc-&gt; xSFunc)(pCtx,pCtx-&gt; argc,pCtx-&gt; argv); / IMP:R-24505-23230 * /“在SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe p / VDBE * /)。
所以,请帮助。