Skip to content

Commit 8e066d4

Browse files
committed
Implement numeric widening getters on C++ Column classes
Align with Java TsFile: IntColumn/FloatColumn/LongColumn support cross-type getters (e.g. FloatColumn::getDouble). IoTDBRpcDataSet delegates directly to column getters like the Java client. Fixes CALL INFERENCE crash when schema declares DOUBLE but TsBlock stores FLOAT (including RLE-encoded columns).
1 parent ac94332 commit 8e066d4

4 files changed

Lines changed: 40 additions & 19 deletions

File tree

iotdb-client/client-cpp/src/main/Column.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,18 @@ int32_t IntColumn::getInt(int32_t position) const {
152152
return values_[position + arrayOffset_];
153153
}
154154

155+
int64_t IntColumn::getLong(int32_t position) const {
156+
return values_[position + arrayOffset_];
157+
}
158+
159+
float IntColumn::getFloat(int32_t position) const {
160+
return values_[position + arrayOffset_];
161+
}
162+
163+
double IntColumn::getDouble(int32_t position) const {
164+
return values_[position + arrayOffset_];
165+
}
166+
155167
std::vector<int32_t> IntColumn::getInts() const {
156168
return values_;
157169
}
@@ -204,6 +216,10 @@ float FloatColumn::getFloat(int32_t position) const {
204216
return values_[position + arrayOffset_];
205217
}
206218

219+
double FloatColumn::getDouble(int32_t position) const {
220+
return values_[position + arrayOffset_];
221+
}
222+
207223
std::vector<float> FloatColumn::getFloats() const {
208224
return values_;
209225
}
@@ -256,6 +272,10 @@ int64_t LongColumn::getLong(int32_t position) const {
256272
return values_[position + arrayOffset_];
257273
}
258274

275+
double LongColumn::getDouble(int32_t position) const {
276+
return values_[position + arrayOffset_];
277+
}
278+
259279
std::vector<int64_t> LongColumn::getLongs() const {
260280
return values_;
261281
}

iotdb-client/client-cpp/src/main/Column.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,9 @@ class IntColumn : public Column {
196196
ColumnEncoding getEncoding() const override;
197197

198198
int32_t getInt(int32_t position) const override;
199+
int64_t getLong(int32_t position) const override;
200+
float getFloat(int32_t position) const override;
201+
double getDouble(int32_t position) const override;
199202
std::vector<int32_t> getInts() const override;
200203

201204
bool mayHaveNull() const override;
@@ -220,6 +223,7 @@ class FloatColumn : public Column {
220223
ColumnEncoding getEncoding() const override;
221224

222225
float getFloat(int32_t position) const override;
226+
double getDouble(int32_t position) const override;
223227
std::vector<float> getFloats() const override;
224228

225229
bool mayHaveNull() const override;
@@ -244,6 +248,7 @@ class LongColumn : public Column {
244248
ColumnEncoding getEncoding() const override;
245249

246250
int64_t getLong(int32_t position) const override;
251+
double getDouble(int32_t position) const override;
247252
std::vector<int64_t> getLongs() const override;
248253

249254
bool mayHaveNull() const override;

iotdb-client/client-cpp/src/main/IoTDBRpcDataSet.cpp

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -280,12 +280,7 @@ boost::optional<double> IoTDBRpcDataSet::getDoubleByTsBlockColumnIndex(int32_t t
280280
}
281281
if (!isNull(tsBlockColumnIndex, tsBlockIndex_)) {
282282
lastReadWasNull_ = false;
283-
auto column = curTsBlock_->getColumn(tsBlockColumnIndex);
284-
TSDataType::TSDataType dataType = column->getDataType();
285-
if (dataType == TSDataType::FLOAT) {
286-
return static_cast<double>(column->getFloat(tsBlockIndex_));
287-
}
288-
return column->getDouble(tsBlockIndex_);
283+
return curTsBlock_->getColumn(tsBlockColumnIndex)->getDouble(tsBlockIndex_);
289284
} else {
290285
lastReadWasNull_ = true;
291286
return boost::none;
@@ -309,12 +304,7 @@ boost::optional<float> IoTDBRpcDataSet::getFloatByTsBlockColumnIndex(int32_t tsB
309304
}
310305
if (!isNull(tsBlockColumnIndex, tsBlockIndex_)) {
311306
lastReadWasNull_ = false;
312-
auto column = curTsBlock_->getColumn(tsBlockColumnIndex);
313-
TSDataType::TSDataType dataType = column->getDataType();
314-
if (dataType == TSDataType::DOUBLE) {
315-
return static_cast<float>(column->getDouble(tsBlockIndex_));
316-
}
317-
return column->getFloat(tsBlockIndex_);
307+
return curTsBlock_->getColumn(tsBlockColumnIndex)->getFloat(tsBlockIndex_);
318308
} else {
319309
lastReadWasNull_ = true;
320310
return boost::none;

iotdb-client/client-cpp/src/test/cpp/sessionIT.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -881,15 +881,21 @@ TEST_CASE("TsBlock deserialize rejects truncated malicious payload", "[TsBlockDe
881881
REQUIRE_THROWS_AS(TsBlock::deserialize(data), IoTDBException);
882882
}
883883

884-
TEST_CASE("Read float column as double for schema mismatch", "[column][inference]") {
884+
TEST_CASE("Numeric column widening getters align with Java TsFile", "[column]") {
885885
std::vector<bool> valueIsNull(1, false);
886-
std::vector<float> values = {120.00000762939453f};
887-
auto floatColumn = std::make_shared<FloatColumn>(0, 1, valueIsNull, values);
886+
887+
std::vector<float> floatValues = {120.00000762939453f};
888+
auto floatColumn = std::make_shared<FloatColumn>(0, 1, valueIsNull, floatValues);
888889
auto rleColumn = std::make_shared<RunLengthEncodedColumn>(floatColumn, 20);
890+
REQUIRE(floatColumn->getDouble(0) == Approx(120.0).margin(0.01));
891+
REQUIRE(rleColumn->getDouble(0) == Approx(120.0).margin(0.01));
889892

890-
REQUIRE(rleColumn->getDataType() == TSDataType::FLOAT);
891-
REQUIRE_THROWS_AS(rleColumn->getDouble(0), IoTDBException);
893+
std::vector<int32_t> intValues = {42};
894+
auto intColumn = std::make_shared<IntColumn>(0, 1, valueIsNull, intValues);
895+
REQUIRE(intColumn->getLong(0) == 42);
896+
REQUIRE(intColumn->getDouble(0) == Approx(42.0));
892897

893-
double asDouble = static_cast<double>(rleColumn->getFloat(0));
894-
REQUIRE(asDouble == Approx(120.0).margin(0.01));
898+
std::vector<int64_t> longValues = {1000};
899+
auto longColumn = std::make_shared<LongColumn>(0, 1, valueIsNull, longValues);
900+
REQUIRE(longColumn->getDouble(0) == Approx(1000.0));
895901
}

0 commit comments

Comments
 (0)