![]() |
|
|||
WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Внедрения совокупных функций SQL используют этот установленный
порядок, чтобы ассигновать память для хранения их состояния. В первый раз sqlite3_aggregate_context(C,N) вызывают для конкретной
агрегатной функции, SQLite ассигнует N байт памяти,
и возвращает указатель на новую память. На вторых и последующих вызовах
sqlite3_aggregate_context() для того же самого случая агрегатной функции,
возвращен тот же самый буфер. Sqlite3_aggregate_context()
обычно вызывают однажды для каждого вызова xStep
и затем один раз, когда вызван xFinal. Когда никакие строки
не соответствуют агрегатному запросу, отзыв xStep()
внедрения агрегатной функции никогда не вызывают, и xFinal()
вызывают точно однажды. В тех случаях sqlite3_aggregate_context()
мог бы быть вызван впервые из xFinal(). sqlite3_aggregate_context(C,N) вернет NULL при первом вызове, если N
меньше или равен нолю, или если ошибка распределения памяти происходит. Сумма места, выделенного sqlite3_aggregate_context(C,N),
определяется параметром N при первом успешном вызове. Изменение
N в любом последующем обращении к sqlite3_aggregate_context()
в том же самом случае агрегатной функции не изменит размеры выделения памяти.
В отзыве xFinal нормально установить N=0 в вызове
sqlite3_aggregate_context(C,N), чтобы никакие бессмысленные выделения
памяти не происходили. SQLite автоматически освобождает память, ассигнованную
sqlite3_aggregate_context(), когда агрегатный запрос заканчивается. Первый параметр должен быть копией
контекста функции SQL,
который является первым параметром отзыва xStep или xFinal, который
осуществляет агрегатную функцию. Это нужно вызвать от того же самого потока, в котором работает
совокупная функция SQL.
Choose any three.
SQLite C Interface
Получите контекст агрегатной функции
void *sqlite3_aggregate_context(sqlite3_context*, int nBytes);