On 03/06/2017 10:13 PM, Peter Eisentraut wrote:
On 3/3/17 09:03, Tomas Vondra wrote:
Attached is v2, fixing both issues.

I wonder if

+   bytea      *raw_page = PG_GETARG_BYTEA_P(0);

+       uargs->page = VARDATA(raw_page);

is expected to work reliably, without copying the argument to a
different memory context.

I think it would be better not to maintain so much duplicate code
between bt_page_items(text, int) and bt_page_items(bytea).  How about
just redefining bt_page_items(text, int) as an SQL-language function
calling bt_page_items(get_raw_page($1, $2))?

Maybe. We can also probably share the code at the C level, so I'll look into that.

For page_checksum(), the checksums are internally unsigned, so maybe
return type int on the SQL level, so that there is no confusion about
the sign?

That ship already sailed, I'm afraid. We already have checksum in the page_header() output, and it's defined as smallint there. So using int here would be inconsistent.

A similar issue is that get_raw_page() uses int for block number, while internally it's uint32. That often requires a fair amount of gymnastics on large tables.

I'm not against changing either of those bits - using int for checksums and bigint for block numbers, but I think it should be a separate patch.


Tomas Vondra                  http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:

Reply via email to