Страница 1 из 1

функция isc_info_sql_records()

Добавлено: 04 фев 2005, 07:37
ivan1982
Вопрос наверное прежде всего к разработчикам.
Прочитал в исходниках PHP5, что функция ibase_num_rows(), возвращающая количество выбранных записей, может возвращать неверные значения из-за некорректной работы isc_info_sql_records().
Планируется ли исправление в последующих версиях FireBird?

Добавлено: 04 фев 2005, 16:42
dimitr
Ни о каких багах, связанных с возвращаемым кол-вом записей, разработчики не знают. Прежде чем просить исправления, привел бы авторов PHP5 с примером глюка, тогда будем разбираться.

Добавлено: 04 фев 2005, 17:14
kdv
скорее, он имел в виду что info_sql_records НЕ возвращает количество выбранных записей. Хотя бы потому, что количество выбранных всегда известно клиенту, потому что он их и выбирает. А вот количество записей, которые БУДУТ выбраны запросом, в большинстве случаев неизвестно, как минимум по причине версионности. То есть, пока сервер их не выдал клиенту, их число узнать не представляется возможным.

Добавлено: 05 фев 2005, 11:06
dimitr
Насколько я в курсе, кол-во выбранных записей все же возвращается, причем правильно, в isc_info_req_select_count.

А насчет общего кол-ва записей недофетченного курсора - тут ты прав, сервер в большинстве случаев такой информацией не обладает. И шибко сомневаюсь, что должен.

Добавлено: 07 фев 2005, 08:04
ivan1982
текст коментария к функции ibase_num_rows. PHP5.
/**
* As this function relies on the InterBase API function isc_dsql_sql_info()
* which has a couple of limitations (which I hope will be fixed in future
* releases of Firebird), this function is fairly useless. I'm leaving it
* in place for people who can live with the limitations, which I only
* found out about after I had implemented it anyway.
*
* Currently, there's no way to determine how many rows can be fetched from
* a cursor. The only number that _can_ be determined is the number of rows
* that have already been pre-fetched by the client library.
* This implies the following:
* - num_rows() always returns zero before the first fetch;
* - num_rows() for SELECT ... FOR UPDATE is broken -> never returns a
* higher number than the number of records fetched so far (no pre-fetch);
* - the result of num_rows() for other statements is merely a lower bound
* on the number of records => calling ibase_num_rows() again after a couple
* of fetches will most likely return a new (higher) figure for large result
* sets.
*/
Получается, что я могу получить общее количество записей только, когда профетчу все?

Добавлено: 07 фев 2005, 09:17
kdv
какой ты догадливый :-) а я о чем писал?