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_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 little endian,或 UTF-16 big endian,分别。sqlite3_result_text64() 接口将应用程序定义函数的返回值设置为第五个(也是最后一个)参数指定编码的文本字符串,该参数必须是SQLITE_UTF8、SQLITE_UTF16、SQLITE_UTF16BE或SQLITE_UTF16LE 之一. SQLite 从 sqlite3_result_text* 接口的第二个参数中获取来自应用程序的文本结果。如果 sqlite3_result_text* 接口的第三个参数为负,则 SQLite 从第二个参数到第一个零字符获取结果文本。如果 sqlite3_result_text* 接口的第三个参数是非负数,那么第二个参数指向的文本的字节数(不是字符数)将作为应用程序定义的函数结果。如果第三个参数是非负数,那么它必须是 NUL 终止符出现的字符串中的字节偏移量(如果字符串以 NUL 终止)。如果任何 NUL 字符出现在字符串中的字节偏移量小于第三个参数的值,那么生成的字符串将包含嵌入的 NUL,并且对具有嵌入的 NUL 的字符串进行运算的表达式的结果是未定义的。如果 sqlite3_result_text* 接口或 sqlite3_result_blob 的第 4 个参数是非 NULL 指针,则 SQLite 在使用完该结果后调用该函数作为文本或 BLOB 结果的析构函数。如果 sqlite3_result_text* 接口或 sqlite3_result_blob 的第 4 个参数是特殊常量 SQLITE_STATIC,则 SQLite 假定文本或 BLOB 结果在常量空间中,并且不会复制参数的内容,也不会在内容上调用析构函数完成使用该结果。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)一样,除了它还将宿主语言指针 P 或类型 T 与该 NULL 值相关联,以便指针可以 使用sqlite3_value_pointer()在应用程序定义的 SQL 函数中检索。如果 D 参数不为 NULL,则它是指向 P 参数的析构函数的指针。当 SQLite 以 P 结束时,SQLite 以 P 作为其唯一参数调用 D。T 参数应该是静态字符串,最好是字符串文字。sqlite3_result_pointer() 例程是为 SQLite 3.20.0 添加的指针传递接口的一部分。
如果这些例程是从与包含接收sqlite3_context指针的应用程序定义函数的线程不同的线程中调用的,则结果是未定义的。