fix LEB128 integer decoding of negative numbers smaller than -134217728 (-2^27) v_0 v0.18
authorFrantišek Kučera <franta-hg@frantovo.cz>
Mon, 29 Nov 2021 19:30:52 +0100
branchv_0
changeset 52 d22e9274fcad
parent 51 a42e6992897c
child 53 2dcf2ef638a6
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)
include/relpipe/reader/handlers/RelationalReaderBaseHandler.h
src/types/IntegerDataTypeReader.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<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;
 	}