void *sqlite3_aggregate_context(sqlite3_context*, int nBytes);
聚合 SQL 函数的实现使用此例程为存储其状态分配内存。
对于特定聚合函数,第一次调用 sqlite3_aggregate_context(C,N) 例程时,SQLite 会分配 N 字节的内存,将该内存清零,并返回指向新内存的指针。对于同一聚合函数实例的第二次及后续调用 sqlite3_aggregate_context(),将返回相同的缓冲区。Sqlite3_aggregate_context() 通常在每次调用 xStep 回调时调用一次,然后在调用 xFinal 回调时最后调用一次。当没有行匹配聚合查询时,聚合函数实现的 xStep() 回调永远不会被调用,而 xFinal() 恰好被调用一次。在这些情况下,sqlite3_aggregate_context() 可能会从 xFinal() 内部首次被调用。
如果 N 小于或等于零,或者发生内存分配错误,则第一次调用 sqlite3_aggregate_context(C,N) 例程时会返回 NULL 指针。
sqlite3_aggregate_context(C,N) 分配的空间量由第一次成功调用时的 N 参数确定。在同一聚合函数实例中,在后续任何对 sqlite3_aggregate_context() 的调用中更改 N 的值都不会调整内存分配的大小。在 xFinal 回调中,习惯上在对 sqlite3_aggregate_context(C,N) 的调用中将 N 设置为 0,以便不会发生毫无意义的内存分配。
聚合查询结束时,SQLite 会自动释放 sqlite3_aggregate_context() 分配的内存。
第一个参数必须是实现聚合函数的 xStep 或 xFinal 回调例程的第一个参数 SQL 函数上下文 的副本。
此例程必须在运行聚合 SQL 函数的同一线程中调用。