tsfile icon indicating copy to clipboard operation
tsfile copied to clipboard

[CPP] TsFile CANNOT store negative numbers correctly

Open citrusreticulata opened this issue 9 months ago • 1 comments

Negative numbers cannot be stored correctly

see src/common/allocator/byte_stream.h, line 1005

    FORCE_INLINE static int write_var_int(int32_t i32, ByteStream &out) {
        // TODO 8byte to 4byte.
        // but in IoTDB java, it has only write_var_uint(i32)
        i32 = i32 << 1;
        return do_write_var_uint((uint32_t)i32, out);
    }
    FORCE_INLINE static int read_var_int(int32_t &i32, ByteStream &in) {
        int ret = common::E_OK;
        uint32_t ui32;
        if (RET_FAIL(do_read_var_uint(ui32, in))) {
        } else {
            i32 = (int32_t)(ui32 >> 1);
        }
        return ret;
    }

The code here does not consider handling negative numbers at all.

The behavior and name of the Plain Encoder are inconsistent

Even more incredible is that Plain Encoder did not store an uncoded value as expected, but instead forced signed integers to be converted to unsigned integers and used variable length encoding. see src/encoding/plain_encoder.h line 34:

FORCE_INLINE int encode(bool value, common::ByteStream &out_stream) {
        return common::SerializationUtil::write_i8(value ? 1 : 0, out_stream);
    }

    FORCE_INLINE int encode(int32_t value, common::ByteStream &out_stream) {
        return common::SerializationUtil::write_var_int(value, out_stream);
    }

    FORCE_INLINE int encode(int64_t value, common::ByteStream &out_stream) {
        return common::SerializationUtil::write_i64(value, out_stream);
    }

    FORCE_INLINE int encode(float value, common::ByteStream &out_stream) {
        return common::SerializationUtil::write_float(value, out_stream);
    }

    FORCE_INLINE int encode(double value, common::ByteStream &out_stream) {
        return common::SerializationUtil::write_double(value, out_stream);
    }

The stored data cannot be read

All plain encoded negative numbers cannot be read correctly... :(

I can't believe that no one find this bug for more than one year...

citrusreticulata avatar Apr 03 '25 13:04 citrusreticulata

Hi, this is your first issue in the Apache TsFile project. Thanks for your report. Welcome to join the community!

github-actions[bot] avatar Apr 03 '25 13:04 github-actions[bot]