# HG changeset patch # User František Kučera # Date 1638210652 -3600 # Node ID d22e9274fcade1cb16c1b09a25c1182e58b488b9 # Parent a42e6992897c13dbdc487d1b0c3cc350e3ca9d08 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) diff -r a42e6992897c -r d22e9274fcad include/relpipe/reader/handlers/RelationalReaderBaseHandler.h --- 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 attributes) = 0; virtual void endOfPipe() = 0; diff -r a42e6992897c -r d22e9274fcad src/types/IntegerDataTypeReader.h --- 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; }