diff --git a/omnioperator/omniop-spark-extension/cpp/src/jni/OrcColumnarBatchJniReader.cpp b/omnioperator/omniop-spark-extension/cpp/src/jni/OrcColumnarBatchJniReader.cpp index c0f4c1ae17031e933dd4467328c629d8045c3f20..f26934403fa4dc4ab57bb2ad9d72a29839f1055b 100644 --- a/omnioperator/omniop-spark-extension/cpp/src/jni/OrcColumnarBatchJniReader.cpp +++ b/omnioperator/omniop-spark-extension/cpp/src/jni/OrcColumnarBatchJniReader.cpp @@ -386,18 +386,6 @@ uint64_t CopyCharType(orc::ColumnVectorBatch *field) return (uint64_t)originalVector; } -inline void TransferDecimal128(int64_t &highbits, uint64_t &lowbits) -{ - if (highbits < 0) { // int128's 2s' complement code - lowbits = ~lowbits + 1; // 2s' complement code - highbits = ~highbits; //1s' complement code - if (lowbits == 0) { - highbits += 1; // carry a number as in adding - } - highbits ^= ((uint64_t)1 << 63); - } -} - uint64_t CopyToOmniDecimal128Vec(orc::ColumnVectorBatch *field) { orc::Decimal128VectorBatch *lvb = dynamic_cast(field); @@ -408,22 +396,20 @@ uint64_t CopyToOmniDecimal128Vec(orc::ColumnVectorBatch *field) if (lvb->hasNulls) { for (uint i = 0; i < numElements; i++) { if (notNulls[i]) { - auto highbits = values[i].getHighBits(); - auto lowbits = values[i].getLowBits(); - TransferDecimal128(highbits, lowbits); - Decimal128 d128(highbits, lowbits); - originalVector->SetValue(i, d128); + __int128_t dst = values[i].getHighBits(); + dst <<= 64; + dst |= values[i].getLowBits(); + originalVector->SetValue(i, Decimal128(dst)); } else { originalVector->SetNull(i); } } } else { for (uint i = 0; i < numElements; i++) { - auto highbits = values[i].getHighBits(); - auto lowbits = values[i].getLowBits(); - TransferDecimal128(highbits, lowbits); - Decimal128 d128(highbits, lowbits); - originalVector->SetValue(i, d128); + __int128_t dst = values[i].getHighBits(); + dst <<= 64; + dst |= values[i].getLowBits(); + originalVector->SetValue(i, Decimal128(dst)); } } return (uint64_t)originalVector;