首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Function Auxiliary Data

代码语言:javascript
复制
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)接口返回一个指向由应用程序定义函数的第n个参数值的sqlite3_set_auxdata(C,N,P,X)函数关联的元数据的指针。对于最左边的函数参数,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;如果元数据已被丢弃,则返回P. 在每次调用sqlite3_set_auxdata(C,N,P,X)(其中X不为NULL)之后,当元数据被丢弃时,SQLite将仅使用参数P调用析构函数X. SQLite随时可以随时丢弃元数据,包括:

  • 当相应的功能参数改变时,或者
  • 当为sql语句或者sqlite3_reset()或sqlite3_finalize()调用时
  • 当sqlite3_set_auxdata()再次在同一个参数上调用时,或者
  • 在原始sqlite3_set_auxdata()调用期间发生内存分配错误时。

特别注意最后一个项目符号。sqlite3_set_auxdata(C,N,P,X)中的析构函数X可能会在sqlite3_set_auxdata()接口甚至返回之前立即调用。因此,sqlite3_set_auxdata()应该在函数实现结束时被调用,并且函数实现在调用sqlite3_set_auxdata()之后不应该使用P.

实际上,元数据在函数调用之间保留,这些函数参数是编译时常量,包括文字值和参数以及由相同的表达式构成的表达式。

这些接口的N参数值应该是非负的。未来的增强可能会利用负N值来定义新的函数缓存行为。

这些例程必须从运行SQL函数的同一个线程中调用。

扫码关注腾讯云开发者

领取腾讯云代金券