diff --git a/iotdb-client/client-cpp/src/main/Column.cpp b/iotdb-client/client-cpp/src/main/Column.cpp index 203fcefd8d9a5..906a78968ed2c 100644 --- a/iotdb-client/client-cpp/src/main/Column.cpp +++ b/iotdb-client/client-cpp/src/main/Column.cpp @@ -152,6 +152,18 @@ int32_t IntColumn::getInt(int32_t position) const { return values_[position + arrayOffset_]; } +int64_t IntColumn::getLong(int32_t position) const { + return values_[position + arrayOffset_]; +} + +float IntColumn::getFloat(int32_t position) const { + return values_[position + arrayOffset_]; +} + +double IntColumn::getDouble(int32_t position) const { + return values_[position + arrayOffset_]; +} + std::vector IntColumn::getInts() const { return values_; } @@ -204,6 +216,10 @@ float FloatColumn::getFloat(int32_t position) const { return values_[position + arrayOffset_]; } +double FloatColumn::getDouble(int32_t position) const { + return values_[position + arrayOffset_]; +} + std::vector FloatColumn::getFloats() const { return values_; } @@ -256,6 +272,10 @@ int64_t LongColumn::getLong(int32_t position) const { return values_[position + arrayOffset_]; } +double LongColumn::getDouble(int32_t position) const { + return values_[position + arrayOffset_]; +} + std::vector LongColumn::getLongs() const { return values_; } diff --git a/iotdb-client/client-cpp/src/main/Column.h b/iotdb-client/client-cpp/src/main/Column.h index 8794e7b8d5e34..c278c6ebe7385 100644 --- a/iotdb-client/client-cpp/src/main/Column.h +++ b/iotdb-client/client-cpp/src/main/Column.h @@ -196,6 +196,9 @@ class IntColumn : public Column { ColumnEncoding getEncoding() const override; int32_t getInt(int32_t position) const override; + int64_t getLong(int32_t position) const override; + float getFloat(int32_t position) const override; + double getDouble(int32_t position) const override; std::vector getInts() const override; bool mayHaveNull() const override; @@ -220,6 +223,7 @@ class FloatColumn : public Column { ColumnEncoding getEncoding() const override; float getFloat(int32_t position) const override; + double getDouble(int32_t position) const override; std::vector getFloats() const override; bool mayHaveNull() const override; @@ -244,6 +248,7 @@ class LongColumn : public Column { ColumnEncoding getEncoding() const override; int64_t getLong(int32_t position) const override; + double getDouble(int32_t position) const override; std::vector getLongs() const override; bool mayHaveNull() const override; diff --git a/iotdb-client/client-cpp/src/test/cpp/sessionIT.cpp b/iotdb-client/client-cpp/src/test/cpp/sessionIT.cpp index 1f9abb153efd9..0bf30bbbf1be9 100644 --- a/iotdb-client/client-cpp/src/test/cpp/sessionIT.cpp +++ b/iotdb-client/client-cpp/src/test/cpp/sessionIT.cpp @@ -18,6 +18,7 @@ */ #include "catch.hpp" +#include "Column.h" #include "Session.h" #include "SessionBuilder.h" #include "TsBlock.h" @@ -878,4 +879,23 @@ TEST_CASE("TsBlock deserialize rejects truncated malicious payload", "[TsBlockDe std::string data(18, '\0'); data[3] = '\x10'; REQUIRE_THROWS_AS(TsBlock::deserialize(data), IoTDBException); +} + +TEST_CASE("Numeric column widening getters align with Java TsFile", "[column]") { + std::vector valueIsNull(1, false); + + std::vector floatValues = {120.00000762939453f}; + auto floatColumn = std::make_shared(0, 1, valueIsNull, floatValues); + auto rleColumn = std::make_shared(floatColumn, 20); + REQUIRE(floatColumn->getDouble(0) == Approx(120.0).margin(0.01)); + REQUIRE(rleColumn->getDouble(0) == Approx(120.0).margin(0.01)); + + std::vector intValues = {42}; + auto intColumn = std::make_shared(0, 1, valueIsNull, intValues); + REQUIRE(intColumn->getLong(0) == 42); + REQUIRE(intColumn->getDouble(0) == Approx(42.0)); + + std::vector longValues = {1000}; + auto longColumn = std::make_shared(0, 1, valueIsNull, longValues); + REQUIRE(longColumn->getDouble(0) == Approx(1000.0)); } \ No newline at end of file