void *sqlite3_get_auxdata(sqlite3_context*, int N); void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*));
这些函数可供(非聚合)SQL 函数使用,以将辅助数据与参数值相关联。 如果在查询执行期间将相同参数值传递给同一 SQL 函数的多个调用,在某些情况下,关联的辅助数据可能会被保留。 这在正则表达式匹配函数中很有用。 编译后的正则表达式可以存储为与模式字符串关联的辅助数据。 然后,只要模式字符串保持不变,就可以在同一函数的多个调用中重复使用编译后的正则表达式。
sqlite3_get_auxdata(C,N) 接口返回指向由 sqlite3_set_auxdata(C,N,P,X) 函数与应用程序定义函数的第 N 个参数值关联的辅助数据的指针。 N 为最左边的函数参数为零。 如果函数参数没有关联的辅助数据,则 sqlite3_get_auxdata(C,N) 接口将返回一个 NULL 指针。
sqlite3_set_auxdata(C,N,P,X) 接口将 P 存储为应用程序定义函数的第 N 个参数的辅助数据。 随后对 sqlite3_get_auxdata(C,N) 的调用将返回最近一次 sqlite3_set_auxdata(C,N,P,X) 调用的 P,如果辅助数据仍然有效,或者返回 NULL,如果辅助数据已被丢弃。 在每次调用 sqlite3_set_auxdata(C,N,P,X) 之后,其中 X 不为 NULL,SQLite 将使用参数 P 确切地调用一次析构函数 X,当辅助数据被丢弃时。 SQLite 可以随时丢弃辅助数据,包括
特别注意最后两点。 sqlite3_set_auxdata(C,N,P,X) 中的析构函数 X 可能会立即被调用,甚至在 sqlite3_set_auxdata() 接口返回之前。 因此,sqlite3_set_auxdata() 应该在函数实现的末尾附近调用,并且函数实现不应该在 sqlite3_set_auxdata() 被调用后使用 P。 此外,如果在 sqlite3_set_auxdata() 调用期间发生内存不足的情况,或者如果函数是在查询规划期间而不是在查询执行期间计算的,则在相应的 sqlite3_set_auxdata() 调用之后立即发生的 sqlite3_get_auxdata() 调用仍然可能返回 NULL。
在实践中,辅助数据在函数调用的函数参数之间保留,这些参数是编译时常量,包括文字值和 参数 以及由相同值组成的表达式。
这些接口的 N 参数的值应该是非负数。 将来的增强可能会利用负数 N 值来定义新的函数缓存行为。
这些例程必须从运行 SQL 函数的相同线程中调用。