Binary encoding of timetz type

Started by Ruslanabout 5 years ago4 messagesgeneral
Jump to latest
#1Ruslan
ruslan@walkmind.com

Hi folks,

Apologies if it's the wrong place to ask. I have a question for postgres
developers.

I wrote parser for COPY binary encoding. Everything is great but one thing
worries me. It seems like the time offset field has reversed digit sign.
I'm referring to this function

https://github.com/postgres/postgres/blob/REL_13_STABLE/src/backend/utils/adt/date.c#L2150-L2159

COPY response for value *'13:37:00-0300'::timetz* gives me binary
0x0000000b69d1d70000002a30. And value *'13:37:00+0300'::timetz* is encoded
as 0x0000000b69d1d700ffffd5d0.

0xffffd5d0 is -10800 for signed integer and 0x00002a30 is 10800.

I reverse the sign in my code but feeling that I'm missing something is
nagging me. Please advise.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ruslan (#1)
Re: Binary encoding of timetz type

Ruslan <ruslan@d19i00d0skgddi.cloudfront.net> writes:

I wrote parser for COPY binary encoding. Everything is great but one thing
worries me. It seems like the time offset field has reversed digit sign.
I'm referring to this function

https://github.com/postgres/postgres/blob/REL_13_STABLE/src/backend/utils/adt/date.c#L2150-L2159

Reversed compared to what? The code you quote is clearly sending the
internal representation as-is.

There's a lot of confusion in the world about whether positive timezone
offsets correspond to being east or west of Greenwich (not helped any
by the fact that there are relevant standards using both interpretations).
I think that our internal form uses positive-is-west, a/k/a POSIX rules,
but I'm too lazy to go check right now.

regards, tom lane

#3Merlin Moncure
mmoncure@gmail.com
In reply to: Ruslan (#1)
Re: Binary encoding of timetz type

On Tue, Mar 16, 2021 at 1:31 PM Ruslan <ruslan@walkmind.com> wrote:

Hi folks,

Apologies if it's the wrong place to ask. I have a question for postgres developers.

I wrote parser for COPY binary encoding. Everything is great but one thing worries me. It seems like the time offset field has reversed digit sign. I'm referring to this function

https://github.com/postgres/postgres/blob/REL_13_STABLE/src/backend/utils/adt/date.c#L2150-L2159

COPY response for value '13:37:00-0300'::timetz gives me binary 0x0000000b69d1d70000002a30. And value '13:37:00+0300'::timetz is encoded as 0x0000000b69d1d700ffffd5d0.

0xffffd5d0 is -10800 for signed integer and 0x00002a30 is 10800.

I reverse the sign in my code but feeling that I'm missing something is nagging me. Please advise.

Check out libpqtypes -- it has client side send/receive functions for
binary format you can crib from.

https://github.com/pgagarinov/libpqtypes/blob/master/source/src/datetime.c

merlin

#4Kenneth Marshall
ktm@rice.edu
In reply to: Merlin Moncure (#3)
Re: Binary encoding of timetz type

On Mon, Mar 22, 2021 at 08:11:55PM -0500, Merlin Moncure wrote:

Check out libpqtypes -- it has client side send/receive functions for
binary format you can crib from.

https://github.com/pgagarinov/libpqtypes/blob/master/source/src/datetime.c

merlin

Hi,

I just wanted to +1 the libpqtypes. An excellent piece of work.

Regards,
Ken