@@ -271,8 +271,15 @@ boost::optional<bool> IoTDBRpcDataSet::getBoolean(const std::string& columnName)
271271 return getBooleanByTsBlockColumnIndex (index);
272272}
273273
274+ // Note: tsBlockColumnIndex < 0 indicates the time pseudo-column in tree model.
275+ // Only getLong and getString support reading the time column directly.
276+ // All other typed getters throw IoTDBException to prevent undefined behavior
277+ // from accessing valueColumns_ with a negative index.
274278boost::optional<bool > IoTDBRpcDataSet::getBooleanByTsBlockColumnIndex (int32_t tsBlockColumnIndex) {
275279 checkRecord ();
280+ if (tsBlockColumnIndex < 0 ) {
281+ throw IoTDBException (" Cannot read boolean from time column" );
282+ }
276283 if (!isNull (tsBlockColumnIndex, tsBlockIndex_)) {
277284 lastReadWasNull_ = false ;
278285 return curTsBlock_->getColumn (tsBlockColumnIndex)->getBoolean (tsBlockIndex_);
@@ -295,6 +302,9 @@ boost::optional<double> IoTDBRpcDataSet::getDouble(const std::string& columnName
295302
296303boost::optional<double > IoTDBRpcDataSet::getDoubleByTsBlockColumnIndex (int32_t tsBlockColumnIndex) {
297304 checkRecord ();
305+ if (tsBlockColumnIndex < 0 ) {
306+ throw IoTDBException (" Cannot read double from time column" );
307+ }
298308 if (!isNull (tsBlockColumnIndex, tsBlockIndex_)) {
299309 lastReadWasNull_ = false ;
300310 return curTsBlock_->getColumn (tsBlockColumnIndex)->getDouble (tsBlockIndex_);
@@ -317,6 +327,9 @@ boost::optional<float> IoTDBRpcDataSet::getFloat(const std::string& columnName)
317327
318328boost::optional<float > IoTDBRpcDataSet::getFloatByTsBlockColumnIndex (int32_t tsBlockColumnIndex) {
319329 checkRecord ();
330+ if (tsBlockColumnIndex < 0 ) {
331+ throw IoTDBException (" Cannot read float from time column" );
332+ }
320333 if (!isNull (tsBlockColumnIndex, tsBlockIndex_)) {
321334 lastReadWasNull_ = false ;
322335 return curTsBlock_->getColumn (tsBlockColumnIndex)->getFloat (tsBlockIndex_);
@@ -339,6 +352,9 @@ boost::optional<int32_t> IoTDBRpcDataSet::getInt(const std::string& columnName)
339352
340353boost::optional<int32_t > IoTDBRpcDataSet::getIntByTsBlockColumnIndex (int32_t tsBlockColumnIndex) {
341354 checkRecord ();
355+ if (tsBlockColumnIndex < 0 ) {
356+ throw IoTDBException (" Cannot read int32 from time column" );
357+ }
342358 if (!isNull (tsBlockColumnIndex, tsBlockIndex_)) {
343359 lastReadWasNull_ = false ;
344360 TSDataType::TSDataType dataType = curTsBlock_->getColumn (tsBlockColumnIndex)->getDataType ();
@@ -395,6 +411,9 @@ std::shared_ptr<Binary> IoTDBRpcDataSet::getBinary(const std::string& columnName
395411
396412std::shared_ptr<Binary> IoTDBRpcDataSet::getBinaryByTsBlockColumnIndex (int32_t tsBlockColumnIndex) {
397413 checkRecord ();
414+ if (tsBlockColumnIndex < 0 ) {
415+ throw IoTDBException (" Cannot read binary from time column" );
416+ }
398417 if (!isNull (tsBlockColumnIndex, tsBlockIndex_)) {
399418 lastReadWasNull_ = false ;
400419 return curTsBlock_->getColumn (tsBlockColumnIndex)->getBinary (tsBlockIndex_);
0 commit comments