Fix alignment handling of int64-based types, and of name
authorChristoph Berg <[email protected]>
Wed, 16 Mar 2022 16:54:53 +0000 (17:54 +0100)
committerChristoph Berg <[email protected]>
Wed, 16 Mar 2022 16:54:53 +0000 (17:54 +0100)
Values were generally aligned to sizeof(type), but that is wrong, the
correct handling is __alignof(type). The problem manifests in practice
for int64, where sizeof(int64) is 8, but __alignof(int64) is 4 on 32-bit
platforms.

Independently, "name" was aligned to int32, but it's actually
char-aligned.

decode.c
expected/datatypes_3.out

index ad5f1c64c057a5faecf12e574aeca2c4c6474ae2..5785aae52411651e3fcc398ee67016df8d63a85b 100644 (file)
--- a/decode.c
+++ b/decode.c
@@ -640,7 +640,7 @@ j2date(int jd, int *year, int *month, int *day)
 static int
 decode_smallint(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 {
-       const char *new_buffer = (const char *) TYPEALIGN(sizeof(int16), (uintptr_t) buffer);
+       const char *new_buffer = (const char *) SHORTALIGN(buffer);
        unsigned int delta = (unsigned int) ((uintptr_t) new_buffer - (uintptr_t) buffer);
 
        if (buff_size < delta)
@@ -662,7 +662,7 @@ decode_smallint(const char *buffer, unsigned int buff_size, unsigned int *out_si
 static int
 decode_int(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 {
-       const char *new_buffer = (const char *) TYPEALIGN(sizeof(int32), (uintptr_t) buffer);
+       const char *new_buffer = (const char *) INTALIGN(buffer);
        unsigned int delta = (unsigned int) ((uintptr_t) new_buffer - (uintptr_t) buffer);
 
        if (buff_size < delta)
@@ -683,7 +683,7 @@ decode_int(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 static int
 decode_bigint(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 {
-       const char *new_buffer = (const char *) TYPEALIGN(sizeof(int64), (uintptr_t) buffer);
+       const char *new_buffer = (const char *) LONGALIGN(buffer);
        unsigned int delta = (unsigned int) ((uintptr_t) new_buffer - (uintptr_t) buffer);
 
        if (buff_size < delta)
@@ -704,7 +704,7 @@ decode_bigint(const char *buffer, unsigned int buff_size, unsigned int *out_size
 static int
 decode_time(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 {
-       const char *new_buffer = (const char *) TYPEALIGN(sizeof(int64), (uintptr_t) buffer);
+       const char *new_buffer = (const char *) LONGALIGN(buffer);
        unsigned int delta = (unsigned int) ((uintptr_t) new_buffer - (uintptr_t) buffer);
        int64           timestamp,
                                timestamp_sec;
@@ -733,7 +733,7 @@ decode_time(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 static int
 decode_timetz(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 {
-       const char *new_buffer = (const char *) TYPEALIGN(sizeof(int64), (uintptr_t) buffer);
+       const char *new_buffer = (const char *) LONGALIGN(buffer);
        unsigned int delta = (unsigned int) ((uintptr_t) new_buffer - (uintptr_t) buffer);
        int64           timestamp,
                                timestamp_sec;
@@ -766,7 +766,7 @@ decode_timetz(const char *buffer, unsigned int buff_size, unsigned int *out_size
 static int
 decode_date(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 {
-       const char *new_buffer = (const char *) TYPEALIGN(sizeof(int32), (uintptr_t) buffer);
+       const char *new_buffer = (const char *) INTALIGN(buffer);
        unsigned int delta = (unsigned int) ((uintptr_t) new_buffer - (uintptr_t) buffer);
        int32           jd,
                                year,
@@ -796,7 +796,7 @@ decode_date(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 static int
 decode_timestamp(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 {
-       const char *new_buffer = (const char *) TYPEALIGN(sizeof(int64), (uintptr_t) buffer);
+       const char *new_buffer = (const char *) LONGALIGN(buffer);
        unsigned int delta = (unsigned int) ((uintptr_t) new_buffer - (uintptr_t) buffer);
        int64           timestamp,
                                timestamp_sec;
@@ -846,7 +846,7 @@ decode_timestamp(const char *buffer, unsigned int buff_size, unsigned int *out_s
 static int
 decode_float4(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 {
-       const char *new_buffer = (const char *) TYPEALIGN(sizeof(float), (uintptr_t) buffer);
+       const char *new_buffer = (const char *) INTALIGN(buffer);
        unsigned int delta = (unsigned int) ((uintptr_t) new_buffer - (uintptr_t) buffer);
 
        if (buff_size < delta)
@@ -867,7 +867,7 @@ decode_float4(const char *buffer, unsigned int buff_size, unsigned int *out_size
 static int
 decode_float8(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 {
-       const char *new_buffer = (const char *) TYPEALIGN(sizeof(double), (uintptr_t) buffer);
+       const char *new_buffer = (const char *) DOUBLEALIGN(buffer);
        unsigned int delta = (unsigned int) ((uintptr_t) new_buffer - (uintptr_t) buffer);
 
        if (buff_size < delta)
@@ -907,7 +907,7 @@ static int
 decode_macaddr(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 {
        unsigned char macaddr[6];
-       const char *new_buffer = (const char *) TYPEALIGN(sizeof(int32), (uintptr_t) buffer);
+       const char *new_buffer = (const char *) INTALIGN(buffer);
        unsigned int delta = (unsigned int) ((uintptr_t) new_buffer - (uintptr_t) buffer);
 
        if (buff_size < delta)
@@ -943,20 +943,11 @@ decode_bool(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 static int
 decode_name(const char *buffer, unsigned int buff_size, unsigned int *out_size)
 {
-       const char *new_buffer = (const char *) TYPEALIGN(sizeof(uint32), (uintptr_t) buffer);
-       unsigned int delta = (unsigned int) ((uintptr_t) new_buffer - (uintptr_t) buffer);
-
-       if (buff_size < delta)
-               return -1;
-
-       buff_size -= delta;
-       buffer = new_buffer;
-
        if (buff_size < NAMEDATALEN)
-               return -2;
+               return -1;
 
        CopyAppendEncode(buffer, strnlen(buffer, NAMEDATALEN));
-       *out_size = NAMEDATALEN + delta;
+       *out_size = NAMEDATALEN;
        return 0;
 }
 
@@ -1365,8 +1356,7 @@ DecodeOidBinary(const char *buffer,
                unsigned int *processed_size,
                Oid *result)
 {
-       const char         *new_buffer =
-               (const char*)TYPEALIGN(sizeof(Oid), (uintptr_t)buffer);
+       const char         *new_buffer = (const char *) INTALIGN(buffer);
        unsigned int    delta =
                (unsigned int)((uintptr_t)new_buffer - (uintptr_t)buffer);
 
index 0d910f749a444e633b5d7aadbbd8ffa6e3d99fab..cfbdc95dd905e4b3925bb20caacdbdf76b2ea8f3 100644 (file)
@@ -892,11 +892,11 @@ Block    0 ********************************************************
 
 <Data> -----
  Item   1 -- Length:   36  Offset: 8156 (0x1fdc)  Flags: NORMAL
-Error: unable to decode a tuple, callback #1 returned -2. Partial data: 
+COPY: 00:00:00.000000-00:00
  Item   2 -- Length:   36  Offset: 8120 (0x1fb8)  Flags: NORMAL
 COPY: 23:59:59.000000-00:00
  Item   3 -- Length:   36  Offset: 8084 (0x1f94)  Flags: NORMAL
-Error: unable to decode a tuple, callback #1 returned -2. Partial data: 
+COPY: 24:00:00.000000-00:00
  Item   4 -- Length:   24  Offset: 8060 (0x1f7c)  Flags: NORMAL
 COPY: \N