小巧、快速、可靠。
三者选其二。

SQLite C 接口

设置 SQL 函数的结果

void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*));
void sqlite3_result_blob64(sqlite3_context*,const void*,
                           sqlite3_uint64,void(*)(void*));
void sqlite3_result_double(sqlite3_context*, double);
void sqlite3_result_error(sqlite3_context*, const char*, int);
void sqlite3_result_error16(sqlite3_context*, const void*, int);
void sqlite3_result_error_toobig(sqlite3_context*);
void sqlite3_result_error_nomem(sqlite3_context*);
void sqlite3_result_error_code(sqlite3_context*, int);
void sqlite3_result_int(sqlite3_context*, int);
void sqlite3_result_int64(sqlite3_context*, sqlite3_int64);
void sqlite3_result_null(sqlite3_context*);
void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*));
void sqlite3_result_text64(sqlite3_context*, const char*,sqlite3_uint64,
                           void(*)(void*), unsigned char encoding);
void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*));
void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*));
void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*));
void sqlite3_result_value(sqlite3_context*, sqlite3_value*);
void sqlite3_result_pointer(sqlite3_context*, void*,const char*,void(*)(void*));
void sqlite3_result_zeroblob(sqlite3_context*, int n);
int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n);

这些例程由实现 SQL 函数和聚合函数的 xFunc 或 xFinal 回调使用。有关更多信息,请参阅 sqlite3_create_function()sqlite3_create_function16()

这些函数的工作方式与用于将值绑定到准备好的语句中的主机参数的 参数绑定 函数系列非常相似。有关更多信息,请参阅 SQL 参数 文档。

sqlite3_result_blob() 接口将应用程序定义函数的结果设置为 BLOB,其内容由第二个参数指向,长度为 N 字节,其中 N 是第三个参数。

sqlite3_result_zeroblob(C,N) 和 sqlite3_result_zeroblob64(C,N) 接口将应用程序定义函数的结果设置为包含所有零字节且大小为 N 字节的 BLOB。

sqlite3_result_double() 接口将应用程序定义函数的结果设置为由其第二个参数指定的浮点值。

sqlite3_result_error() 和 sqlite3_result_error16() 函数会导致实现的 SQL 函数抛出异常。SQLite 使用 sqlite3_result_error() 或 sqlite3_result_error16() 的第二个参数指向的字符串作为错误消息的文本。SQLite 将来自 sqlite3_result_error() 的错误消息字符串解释为 UTF-8。SQLite 使用与 sqlite3_bind_text16() 相同的 字节序确定规则 将来自 sqlite3_result_error16() 的字符串解释为 UTF-16。如果 sqlite3_result_error() 或 sqlite3_result_error16() 的第三个参数为负,则 SQLite 将第一个零字符之前的所有文本作为错误消息。如果 sqlite3_result_error() 或 sqlite3_result_error16() 的第三个参数为非负,则 SQLite 将从第二个参数中取指定字节数(不是字符数)作为错误消息。sqlite3_result_error() 和 sqlite3_result_error16() 例程在返回之前会对错误消息文本进行私有复制。因此,调用函数可以在返回后释放或修改文本,而不会造成任何损害。sqlite3_result_error_code() 函数更改了由函数中的错误导致的 SQLite 返回的错误代码。默认情况下,错误代码为 SQLITE_ERROR。对 sqlite3_result_error() 或 sqlite3_result_error16() 的后续调用会将错误代码重置为 SQLITE_ERROR。

sqlite3_result_error_toobig() 接口会导致 SQLite 抛出错误,指示字符串或 BLOB 太长而无法表示。

sqlite3_result_error_nomem() 接口会导致 SQLite 抛出错误,指示内存分配失败。

sqlite3_result_int() 接口将应用程序定义函数的返回值设置为第二个参数中给定的 32 位有符号整数值。sqlite3_result_int64() 接口将应用程序定义函数的返回值设置为第二个参数中给定的 64 位有符号整数值。

sqlite3_result_null() 接口将应用程序定义函数的返回值设置为 NULL。

sqlite3_result_text()、sqlite3_result_text16()、sqlite3_result_text16le() 和 sqlite3_result_text16be() 接口将应用程序定义函数的返回值设置为文本字符串,分别表示为 UTF-8、UTF-16 本地字节序、UTF-16 小端序或 UTF-16 大端序。sqlite3_result_text64() 接口将应用程序定义函数的返回值设置为以第五个(也是最后一个)参数指定的编码的文本字符串,该参数必须是 SQLITE_UTF8SQLITE_UTF16SQLITE_UTF16BESQLITE_UTF16LE 之一。SQLite 从 sqlite3_result_text* 接口的第二个参数中获取应用程序的文本结果。如果 sqlite3_result_text* 接口(除了 sqlite3_result_text64())的第三个参数为负,则 SQLite 会通过搜索第二个参数中的第一个零字符来自己计算字符串长度。如果 sqlite3_result_text* 接口的第三个参数为非负,则将第二个参数指向的文本中指定字节数(不是字符数)作为应用程序定义函数结果。如果第三个参数为非负,则它必须是字符串中 NUL 终止符将出现的位置的字节偏移量。如果字符串中出现的任何 NUL 字符的字节偏移量小于第三个参数的值,则生成的字符串将包含嵌入的 NUL,并且对包含嵌入的 NUL 的字符串进行操作的表达式的结果是未定义的。如果 sqlite3_result_text* 接口或 sqlite3_result_blob 的第四个参数是非空指针,则 SQLite 在使用完文本或 BLOB 结果后会调用该函数作为该结果的析构函数。如果 sqlite3_result_text* 接口或 sqlite3_result_blob 的第四个参数是特殊常量 SQLITE_STATIC,则 SQLite 假设文本或 BLOB 结果位于常量空间中,并且在使用完该结果后不会复制参数的内容,也不会对内容调用析构函数。如果 sqlite3_result_text* 接口或 sqlite3_result_blob 的第四个参数是特殊常量 SQLITE_TRANSIENT,则 SQLite 会在返回之前将结果复制到从 sqlite3_malloc() 获得的空间中。

对于 sqlite3_result_text16()、sqlite3_result_text16le() 和 sqlite3_result_text16be() 例程,以及对于 sqlite3_result_text64()(当编码不是 UTF8 时),如果输入 UTF16 以字节序标记 (BOM,U+FEFF) 开头,则 BOM 会从字符串中删除,并且字符串的其余部分将根据 BOM 指定的字节序进行解释。BOM 在文本开头的字节序会覆盖接口过程指定的字节序。例如,如果 sqlite3_result_text16le() 被调用时,其文本以字节 0xfe、0xff(大端字节序标记)开头,那么输入的前两个字节会被跳过,并且其余输入会被解释为 UTF16BE 文本。

对于输入到 sqlite3_result_text16()、sqlite3_result_text16be()、sqlite3_result_text16le() 和 sqlite3_result_text64() 例程的 UTF16 文本,如果文本包含无效的 UTF16 字符,则无效字符可能会被转换为 Unicode 替换字符 U+FFFD。

sqlite3_result_value() 接口将应用程序定义函数的结果设置为由第二个参数指定的 未受保护的 sqlite3_value 对象的副本。sqlite3_result_value() 接口会复制 sqlite3_value,以便参数中指定的 sqlite3_value 可以在 sqlite3_result_value() 返回后更改或释放,而不会造成任何损害。在需要 未受保护的 sqlite3_value 对象的地方,始终可以使用 受保护的 sqlite3_value 对象,因此两种类型的 sqlite3_value 对象都可以与此接口一起使用。

sqlite3_result_pointer(C,P,T,D) 接口将结果设置为 SQL NULL 值,就像 sqlite3_result_null(C) 一样,只是它还会将类型为 T 的主机语言指针 P 与该 NULL 值相关联,以便可以使用 sqlite3_value_pointer()应用程序定义的 SQL 函数 中检索该指针。如果 D 参数不是 NULL,则它是 P 参数的析构函数的指针。当 SQLite 完成对 P 的使用时,SQLite 会使用 P 作为其唯一参数调用 D。T 参数应该是一个静态字符串,最好是一个字符串字面量。sqlite3_result_pointer() 例程是 SQLite 3.20.0 新增的 指针传递接口 的一部分。

如果这些例程是在与包含接收 sqlite3_context 指针的应用程序定义函数的线程不同的线程中调用,则结果未定义。

另请参阅 对象常量函数 列表。