[GENERAL] Enum on-disk format
I'm trying to better understand the internals of Postgres, and I'm looking at the enum type. The docs say that an enum value is stored on disk as 4 bytes. But enum_send() returns a bytea representing the actual text of the value and not the index of that value. So what step am I missing here? Also, is there a way to see the raw data for the tuple on a page? I was using pageinspect to try to figure out what was happening on the disk. The get_raw_page function returns the entire page and heap_page_items will allow me to find the substring that represents a given tuple. But the rows were much wider than I thought they would be, 28 bytes + 2 byte spacer to store 4 bytes of data. Is there any way to see which bytes of an item pointer actually map to columns in a table? And where can I find more info on how Postgres stores tuples? Scott Bailey -- Sent via pgsql-general mailing list (pgsql-general@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general
Re: [GENERAL] Enum on-disk format
Scott Bailey writes: > I'm trying to better understand the internals of Postgres, and I'm > looking at the enum type. The docs say that an enum value is stored on > disk as 4 bytes. But enum_send() returns a bytea representing the actual > text of the value and not the index of that value. So what step am I > missing here? The wire format isn't necessarily the on-disk format. In this case we concluded that the internal OID value wouldn't be of any use to clients. > Also, is there a way to see the raw data for the tuple on a page? Try contrib/pageinspect, and read http://developer.postgresql.org/pgdocs/postgres/storage-page-layout.html regards, tom lane -- Sent via pgsql-general mailing list (pgsql-general@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general
Re: [GENERAL] Enum on-disk format
Tom Lane wrote: Scott Bailey writes: I'm trying to better understand the internals of Postgres, and I'm looking at the enum type. The docs say that an enum value is stored on disk as 4 bytes. But enum_send() returns a bytea representing the actual text of the value and not the index of that value. So what step am I missing here? The wire format isn't necessarily the on-disk format. In this case we concluded that the internal OID value wouldn't be of any use to clients. Also, is there a way to see the raw data for the tuple on a page? Try contrib/pageinspect, and read http://developer.postgresql.org/pgdocs/postgres/storage-page-layout.html regards, tom lane Thanks Tom that did the trick. The only I/O functions I'm aware of are send, recv, in and out. What controls converting from/to wire and on-disk formats? And why is wire format little endian and disk big endian? And for posterity, here's how to get to the raw tuple data. SELECT substring(page, lp_off + t_hoff + 1, lp_len - t_hoff) AS tuple_data, sub.* FROM ( SELECT (heap_page_items(page)).*, page FROM ( SELECT get_raw_page('test', 0) page ) s ) sub -- Sent via pgsql-general mailing list (pgsql-general@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general
Re: [GENERAL] Enum on-disk format
On ons, 2009-11-18 at 22:33 -0800, Scott Bailey wrote: > The only I/O functions I'm aware of are > send, recv, in and out. What controls converting from/to wire and > on-disk formats? send and recv > And why is wire format little endian and disk big endian? The wire format is network order (which is big endian), the disk format is whatever your CPU uses. -- Sent via pgsql-general mailing list (pgsql-general@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general