fix LEB128 integer decoding of negative numbers smaller than -134217728 (-2^27)
Due to mismatch of data types of result value and the zero constant/literal, smaller numbers were decoded wrongly:
-134217728 → -134217728
-134217729 → -1
-134217730 → -2
Limits of the current implementation:
relpipe-in-cli --relation "velká_čísla" --attribute "číslo" integer --record -9223372036854775808 --record 9223372036854775807 | relpipe-out-tabular
velká_čísla:
╭──────────────────────╮
│ číslo (integer) │
├──────────────────────┤
│ -9223372036854775808 │
│ 9223372036854775807 │
╰──────────────────────╯
Record count: 2
i.e. +2^63 and -(2^63-1)
--- a/include/relpipe/reader/handlers/RelationalReaderBaseHandler.h Sat Nov 27 23:15:16 2021 +0100
+++ b/include/relpipe/reader/handlers/RelationalReaderBaseHandler.h Mon Nov 29 19:30:52 2021 +0100
@@ -32,6 +32,7 @@
public:
virtual ~RelationalReaderBaseHandler() = default;
+ // TODO: const relpipe::common::type::StringX name
virtual void startRelation(string_t name, std::vector<AttributeMetadata> attributes) = 0;
virtual void endOfPipe() = 0;
--- a/src/types/IntegerDataTypeReader.h Sat Nov 27 23:15:16 2021 +0100
+++ b/src/types/IntegerDataTypeReader.h Mon Nov 29 19:30:52 2021 +0100
@@ -56,6 +56,7 @@
}
integer_t readValue(std::istream &input) override {
+ static const integer_t ZERO = 0;
integer_t value = 0;
integer_t shift = 0;
octet_t octet;
@@ -66,7 +67,7 @@
} while (octet >= 128);
if ((shift < (sizeof (integer_t) * 8)) && (octet & 0x40))
- value |= (~0 << shift);
+ value |= (~ZERO << shift);
return value;
}