You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tsfile.apache.org by co...@apache.org on 2025/12/16 12:00:12 UTC

(tsfile) branch fix_release_read_iotdb created (now 8ead48ca)

This is an automated email from the ASF dual-hosted git repository.

colinlee pushed a change to branch fix_release_read_iotdb
in repository https://gitbox.apache.org/repos/asf/tsfile.git


      at 8ead48ca tmp code

This branch includes the following new commits:

     new 8ead48ca tmp code

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(tsfile) 01/01: tmp code

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

colinlee pushed a commit to branch fix_release_read_iotdb
in repository https://gitbox.apache.org/repos/asf/tsfile.git

commit 8ead48cacb38afe18a5a23725797c18bb73aa15c
Author: ColinLee <sh...@163.com>
AuthorDate: Tue Dec 16 16:56:20 2025 +0800

    tmp code
    
    fix TEXT null.
    
    tmp code.
---
 cpp/CMakeLists.txt                                 |  19 +-
 cpp/src/reader/aligned_chunk_reader.cc             | 113 ++++----
 cpp/src/reader/result_set.h                        |  87 +++++++
 cpp/src/reader/tsfile_series_scan_iterator.cc      |  27 +-
 cpp/src/utils/db_utils.h                           |  59 -----
 .../reader/tree_view/tsfile_reader_tree_test.cc    |  86 -------
 cpp/test/writer/tsfile_writer_test.cc              |  27 +-
 python/tests/resources/README.md                   | 285 +++++++++++++++++++++
 python/tests/resources/simple_table_t1.tsfile      | Bin 0 -> 2965 bytes
 python/tests/resources/simple_table_t2.tsfile      | Bin 0 -> 2677 bytes
 python/tests/resources/simple_tree.tsfile          | Bin 0 -> 842 bytes
 python/tests/test_load_tsfile_from_iotdb.py        | 111 ++++++++
 python/tsfile/constants.py                         |   2 +-
 python/tsfile/tsfile_reader.pyx                    |   1 +
 14 files changed, 593 insertions(+), 224 deletions(-)

diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt
index 3128c996..b4b8c39b 100755
--- a/cpp/CMakeLists.txt
+++ b/cpp/CMakeLists.txt
@@ -108,7 +108,7 @@ if (NOT WIN32)
     endif ()
 endif ()
 
-option(BUILD_TEST "Build tests" OFF)
+option(BUILD_TEST "Build tests" ON)
 message("cmake using: BUILD_TEST=${BUILD_TEST}")
 
 option(ENABLE_ANTLR4 "Enable ANTLR4 runtime" ON)
@@ -117,15 +117,32 @@ message("cmake using: ENABLE_ANTLR4=${ENABLE_ANTLR4}")
 option(ENABLE_SNAPPY "Enable Google Snappy compression" ON)
 message("cmake using: ENABLE_SNAPPY=${ENABLE_SNAPPY}")
 
+if (ENABLE_SNAPPY)
+    add_definitions(-DENABLE_SNAPPY)
+endif()
+
 option(ENABLE_LZ4 "Enable LZ4 compression" ON)
 message("cmake using: ENABLE_LZ4=${ENABLE_LZ4}")
 
+if (ENABLE_LZ4)
+    add_definitions(-DENABLE_LZ4)
+endif()
+
 option(ENABLE_LZOKAY "Enable LZOKAY compression" ON)
 message("cmake using: ENABLE_LZOKAY=${ENABLE_LZOKAY}")
 
+if (ENABLE_LZOKAY)
+    add_definitions(-DENABLE_LZOKAY)
+endif()
+
 option(ENABLE_ZLIB "Enable Zlib compression" ON)
 message("cmake using: ENABLE_ZLIB=${ENABLE_ZLIB}")
 
+if (ENABLE_ZLIB)
+    add_definitions(-DENABLE_ZLIB)
+    add_definitions(-DENABLE_GZIP)
+endif()
+
 # All libs will be stored here, including libtsfile, compress-encoding lib.
 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
 
diff --git a/cpp/src/reader/aligned_chunk_reader.cc b/cpp/src/reader/aligned_chunk_reader.cc
index fc944ca7..b39db564 100644
--- a/cpp/src/reader/aligned_chunk_reader.cc
+++ b/cpp/src/reader/aligned_chunk_reader.cc
@@ -25,8 +25,8 @@
 using namespace common;
 namespace storage {
 
-int AlignedChunkReader::init(ReadFile *read_file, String m_name,
-                             TSDataType data_type, Filter *time_filter) {
+int AlignedChunkReader::init(ReadFile* read_file, String m_name,
+                             TSDataType data_type, Filter* time_filter) {
     read_file_ = read_file;
     measurement_name_.shallow_copy_from(m_name);
     time_decoder_ = DecoderFactory::alloc_time_decoder();
@@ -50,7 +50,7 @@ void AlignedChunkReader::reset() {
     cur_time_page_header_.reset();
     cur_value_page_header_.reset();
 
-    char *file_data_buf = time_in_stream_.get_wrapped_buf();
+    char* file_data_buf = time_in_stream_.get_wrapped_buf();
     if (file_data_buf != nullptr) {
         mem_free(file_data_buf);
     }
@@ -87,7 +87,7 @@ void AlignedChunkReader::destroy() {
         CompressorFactory::free(value_compressor_);
         value_compressor_ = nullptr;
     }
-    char *buf = time_in_stream_.get_wrapped_buf();
+    char* buf = time_in_stream_.get_wrapped_buf();
     if (buf != nullptr) {
         mem_free(buf);
         time_in_stream_.clear_wrapped_buf();
@@ -102,8 +102,8 @@ void AlignedChunkReader::destroy() {
     chunk_header_.~ChunkHeader();
 }
 
-int AlignedChunkReader::load_by_aligned_meta(ChunkMeta *time_chunk_meta,
-                                             ChunkMeta *value_chunk_meta) {
+int AlignedChunkReader::load_by_aligned_meta(ChunkMeta* time_chunk_meta,
+                                             ChunkMeta* value_chunk_meta) {
     int ret = E_OK;
     time_chunk_meta_ = time_chunk_meta;
     value_chunk_meta_ = value_chunk_meta;
@@ -116,8 +116,8 @@ int AlignedChunkReader::load_by_aligned_meta(ChunkMeta *time_chunk_meta,
     file_data_time_buf_size_ = 1024;
     file_data_value_buf_size_ = 1024;
     int32_t ret_read_len = 0;
-    char *time_file_data_buf =
-        (char *)mem_alloc(file_data_time_buf_size_, MOD_CHUNK_READER);
+    char* time_file_data_buf =
+        (char*)mem_alloc(file_data_time_buf_size_, MOD_CHUNK_READER);
     if (IS_NULL(time_file_data_buf)) {
         return E_OOM;
     }
@@ -140,8 +140,8 @@ int AlignedChunkReader::load_by_aligned_meta(ChunkMeta *time_chunk_meta,
     }
     /* ================ deserialize value_chunk_header ================*/
     ret_read_len = 0;
-    char *value_file_data_buf =
-        (char *)mem_alloc(file_data_value_buf_size_, MOD_CHUNK_READER);
+    char* value_file_data_buf =
+        (char*)mem_alloc(file_data_value_buf_size_, MOD_CHUNK_READER);
     if (IS_NULL(value_file_data_buf)) {
         return E_OOM;
     }
@@ -182,7 +182,7 @@ int AlignedChunkReader::load_by_aligned_meta(ChunkMeta *time_chunk_meta,
 }
 
 int AlignedChunkReader::alloc_compressor_and_decoder(
-    storage::Decoder *&decoder, storage::Compressor *&compressor,
+    storage::Decoder*& decoder, storage::Compressor*& compressor,
     TSEncoding encoding, TSDataType data_type, CompressionType compression) {
     if (decoder != nullptr) {
         decoder->reset();
@@ -204,10 +204,10 @@ int AlignedChunkReader::alloc_compressor_and_decoder(
     return E_OK;
 }
 
-int AlignedChunkReader::get_next_page(TsBlock *ret_tsblock,
-                                      Filter *oneshoot_filter, PageArena &pa) {
+int AlignedChunkReader::get_next_page(TsBlock* ret_tsblock,
+                                      Filter* oneshoot_filter, PageArena& pa) {
     int ret = E_OK;
-    Filter *filter =
+    Filter* filter =
         (oneshoot_filter != nullptr ? oneshoot_filter : time_filter_);
     if (prev_time_page_not_finish() && prev_value_page_not_finish()) {
         ret = decode_time_value_buf_into_tsblock(ret_tsblock, oneshoot_filter,
@@ -243,11 +243,11 @@ int AlignedChunkReader::get_next_page(TsBlock *ret_tsblock,
     return ret;
 }
 
-int AlignedChunkReader::get_cur_page_header(ChunkMeta *&chunk_meta,
-                                            common::ByteStream &in_stream,
-                                            PageHeader &cur_page_header,
-                                            uint32_t &chunk_visit_offset,
-                                            ChunkHeader &chunk_header) {
+int AlignedChunkReader::get_cur_page_header(ChunkMeta*& chunk_meta,
+                                            common::ByteStream& in_stream,
+                                            PageHeader& cur_page_header,
+                                            uint32_t& chunk_visit_offset,
+                                            ChunkHeader& chunk_header) {
     int ret = E_OK;
     bool retry = true;
     int cur_page_header_serialized_size = 0;
@@ -263,7 +263,7 @@ int AlignedChunkReader::get_cur_page_header(ChunkMeta *&chunk_meta,
         if (deserialize_buf_not_enough(ret) && retry) {
             retry = false;
             retry_read_want_size += 1024;
-            int32_t &file_data_buf_size =
+            int32_t& file_data_buf_size =
                 chunk_header.data_type_ == common::VECTOR
                     ? file_data_time_buf_size_
                     : file_data_value_buf_size_;
@@ -295,18 +295,18 @@ int AlignedChunkReader::get_cur_page_header(ChunkMeta *&chunk_meta,
 // reader at least @want_size bytes from file and wrap the buffer into
 // @in_stream_
 int AlignedChunkReader::read_from_file_and_rewrap(
-    common::ByteStream &in_stream_, ChunkMeta *&chunk_meta,
-    uint32_t &chunk_visit_offset, int32_t &file_data_buf_size, int want_size,
+    common::ByteStream& in_stream_, ChunkMeta*& chunk_meta,
+    uint32_t& chunk_visit_offset, int32_t& file_data_buf_size, int want_size,
     bool may_shrink) {
     int ret = E_OK;
     const int DEFAULT_READ_SIZE = 4096;  // may use page_size + page_header_size
-    char *file_data_buf = in_stream_.get_wrapped_buf();
+    char* file_data_buf = in_stream_.get_wrapped_buf();
     int offset = chunk_meta->offset_of_chunk_header_ + chunk_visit_offset;
     int read_size =
         (want_size < DEFAULT_READ_SIZE ? DEFAULT_READ_SIZE : want_size);
     if (file_data_buf_size < read_size ||
         (may_shrink && read_size < file_data_buf_size / 10)) {
-        file_data_buf = (char *)mem_realloc(file_data_buf, read_size);
+        file_data_buf = (char*)mem_realloc(file_data_buf, read_size);
         if (IS_NULL(file_data_buf)) {
             return E_OOM;
         }
@@ -326,7 +326,7 @@ int AlignedChunkReader::read_from_file_and_rewrap(
     return ret;
 }
 
-bool AlignedChunkReader::cur_page_statisify_filter(Filter *filter) {
+bool AlignedChunkReader::cur_page_statisify_filter(Filter* filter) {
     bool value_satisfy = filter == nullptr ||
                          cur_value_page_header_.statistic_ == nullptr ||
                          filter->satisfy(cur_value_page_header_.statistic_);
@@ -364,8 +364,8 @@ int AlignedChunkReader::decode_cur_time_page_data() {
         }
     }
 
-    char *time_compressed_buf = nullptr;
-    char *time_uncompressed_buf = nullptr;
+    char* time_compressed_buf = nullptr;
+    char* time_uncompressed_buf = nullptr;
     uint32_t time_compressed_buf_size = 0;
     uint32_t time_uncompressed_buf_size = 0;
 
@@ -376,7 +376,7 @@ int AlignedChunkReader::decode_cur_time_page_data() {
 #ifdef DEBUG_SE
         std::cout << "AlignedChunkReader::decode_cur_page_data,time_in_stream_."
                      "get_wrapped_buf="
-                  << (void *)(time_in_stream_.get_wrapped_buf())
+                  << (void*)(time_in_stream_.get_wrapped_buf())
                   << ", time_in_stream_.read_pos=" << time_in_stream_.read_pos()
                   << std::endl;
 #endif
@@ -427,11 +427,11 @@ int AlignedChunkReader::decode_cur_value_page_data() {
         }
     }
 
-    char *value_compressed_buf = nullptr;
-    char *value_uncompressed_buf = nullptr;
+    char* value_compressed_buf = nullptr;
+    char* value_uncompressed_buf = nullptr;
     uint32_t value_compressed_buf_size = 0;
     uint32_t value_uncompressed_buf_size = 0;
-    char *value_buf = nullptr;
+    char* value_buf = nullptr;
     uint32_t value_buf_size = 0;
 
     // Step 2: do uncompress
@@ -467,7 +467,7 @@ int AlignedChunkReader::decode_cur_value_page_data() {
             SerializationUtil::read_ui32(value_uncompressed_buf);
         value_uncompressed_buf_offset += sizeof(uint32_t);
         value_page_col_notnull_bitmap_.resize((value_page_data_num_ + 7) / 8);
-        for (unsigned char &i : value_page_col_notnull_bitmap_) {
+        for (unsigned char& i : value_page_col_notnull_bitmap_) {
             i = *(value_uncompressed_buf + value_uncompressed_buf_offset);
             value_uncompressed_buf_offset++;
         }
@@ -486,7 +486,7 @@ int AlignedChunkReader::decode_cur_value_page_data() {
 }
 
 int AlignedChunkReader::decode_time_value_buf_into_tsblock(
-    TsBlock *&ret_tsblock, Filter *filter, common::PageArena *pa) {
+    TsBlock*& ret_tsblock, Filter* filter, common::PageArena* pa) {
     int ret = common::E_OK;
     ret = decode_tv_buf_into_tsblock_by_datatype(time_in_, value_in_,
                                                  ret_tsblock, filter, pa);
@@ -535,7 +535,7 @@ int AlignedChunkReader::decode_time_value_buf_into_tsblock(
                     ret = E_OVERFLOW;                                          \
                     break;                                                     \
                 }                                                              \
-                row_appender.append(0, (char *)&time, sizeof(time));           \
+                row_appender.append(0, (char*)&time, sizeof(time));            \
                 row_appender.append_null(1);                                   \
                 continue;                                                      \
             }                                                                  \
@@ -552,15 +552,15 @@ int AlignedChunkReader::decode_time_value_buf_into_tsblock(
             } else {                                                           \
                 /*std::cout << "decoder: time=" << time << ", value=" << value \
                  * << std::endl;*/                                             \
-                row_appender.append(0, (char *)&time, sizeof(time));           \
-                row_appender.append(1, (char *)&value, sizeof(value));         \
+                row_appender.append(0, (char*)&time, sizeof(time));            \
+                row_appender.append(1, (char*)&value, sizeof(value));          \
             }                                                                  \
         }                                                                      \
     } while (false)
 
 int AlignedChunkReader::i32_DECODE_TYPED_TV_INTO_TSBLOCK(
-    ByteStream &time_in, ByteStream &value_in, RowAppender &row_appender,
-    Filter *filter) {
+    ByteStream& time_in, ByteStream& value_in, RowAppender& row_appender,
+    Filter* filter) {
     int ret = E_OK;
     uint32_t mask = 1 << 7;
     int64_t time = 0;
@@ -578,7 +578,7 @@ int AlignedChunkReader::i32_DECODE_TYPED_TV_INTO_TSBLOCK(
                 ret = E_OVERFLOW;
                 break;
             }
-            row_appender.append(0, (char *)&time, sizeof(time));
+            row_appender.append(0, (char*)&time, sizeof(time));
             row_appender.append_null(1);
             continue;
         }
@@ -594,16 +594,16 @@ int AlignedChunkReader::i32_DECODE_TYPED_TV_INTO_TSBLOCK(
         } else {
             /*std::cout << "decoder: time=" << time << ", value=" << value
              * << std::endl;*/
-            row_appender.append(0, (char *)&time, sizeof(time));
-            row_appender.append(1, (char *)&value, sizeof(value));
+            row_appender.append(0, (char*)&time, sizeof(time));
+            row_appender.append(1, (char*)&value, sizeof(value));
         }
     }
     return ret;
 }
 
 int AlignedChunkReader::decode_tv_buf_into_tsblock_by_datatype(
-    ByteStream &time_in, ByteStream &value_in, TsBlock *ret_tsblock,
-    Filter *filter, common::PageArena *pa) {
+    ByteStream& time_in, ByteStream& value_in, TsBlock* ret_tsblock,
+    Filter* filter, common::PageArena* pa) {
     int ret = E_OK;
     RowAppender row_appender(ret_tsblock);
     switch (value_chunk_header_.data_type_) {
@@ -648,24 +648,37 @@ int AlignedChunkReader::decode_tv_buf_into_tsblock_by_datatype(
 }
 
 int AlignedChunkReader::STRING_DECODE_TYPED_TV_INTO_TSBLOCK(
-    ByteStream &time_in, ByteStream &value_in, RowAppender &row_appender,
-    PageArena &pa, Filter *filter) {
+    ByteStream& time_in, ByteStream& value_in, RowAppender& row_appender,
+    PageArena& pa, Filter* filter) {
     int ret = E_OK;
     int64_t time = 0;
     common::String value;
-    while (time_decoder_->has_remaining(time_in)) {
-        ASSERT(value_decoder_->has_remaining(value_in));
+    uint32_t mask = 1 << 7;
+    while (time_decoder_->has_remaining(time_in) &&
+           value_decoder_->has_remaining(value_in)) {
+        cur_value_index++;
+        bool should_read_data = true;
+        if (((value_page_col_notnull_bitmap_[cur_value_index / 8] & 0xFF) &
+             (mask >> (cur_value_index % 8))) == 0) {
+            should_read_data = false;
+        }
         if (UNLIKELY(!row_appender.add_row())) {
             ret = E_OVERFLOW;
+            cur_value_index--;
             break;
         } else if (RET_FAIL(time_decoder_->read_int64(time, time_in))) {
-        } else if (RET_FAIL(value_decoder_->read_String(value, pa, value_in))) {
+        } else if (should_read_data &&
+                   RET_FAIL(value_decoder_->read_String(value, pa, value_in))) {
         } else if (filter != nullptr && !filter->satisfy(time, value)) {
             row_appender.backoff_add_row();
             continue;
         } else {
-            row_appender.append(0, (char *)&time, sizeof(time));
-            row_appender.append(1, value.buf_, value.len_);
+            row_appender.append(0, (char*)&time, sizeof(time));
+            if (!should_read_data) {
+                row_appender.append_null(1);
+            } else {
+                row_appender.append(1, value.buf_, value.len_);
+            }
         }
     }
     return ret;
diff --git a/cpp/src/reader/result_set.h b/cpp/src/reader/result_set.h
index da9891f2..228a9333 100644
--- a/cpp/src/reader/result_set.h
+++ b/cpp/src/reader/result_set.h
@@ -297,6 +297,93 @@ inline ResultSetIterator ResultSet::iterator() {
     return ResultSetIterator(this);
 }
 
+static void print_table_result_set(storage::ResultSet* table_result_set) {
+    if (table_result_set == nullptr) {
+        std::cout << "TableResultSet is nullptr" << std::endl;
+        return;
+    }
+
+    auto metadata = table_result_set->get_metadata();
+    if (metadata == nullptr) {
+        std::cout << "Metadata is nullptr" << std::endl;
+        return;
+    }
+
+    uint32_t column_count = metadata->get_column_count();
+    if (column_count == 0) {
+        std::cout << "No columns in result set" << std::endl;
+        return;
+    }
+
+    for (uint32_t i = 1; i <= column_count; i++) {
+        std::cout << metadata->get_column_name(i);
+        if (i < column_count) {
+            std::cout << "\t";
+        }
+    }
+    std::cout << std::endl;
+
+    bool has_next = false;
+    int row_count = 0;
+    while (IS_SUCC(table_result_set->next(has_next)) && has_next) {
+        for (uint32_t i = 1; i <= column_count; i++) {
+            if (table_result_set->is_null(i)) {
+                std::cout << "NULL";
+            } else {
+                common::TSDataType col_type = metadata->get_column_type(i);
+                switch (col_type) {
+                    case common::INT64: {
+                        int64_t val = table_result_set->get_value<int64_t>(i);
+                        std::cout << val;
+                        break;
+                    }
+                    case common::INT32: {
+                        int32_t val = table_result_set->get_value<int32_t>(i);
+                        std::cout << val;
+                        break;
+                    }
+                    case common::FLOAT: {
+                        float val = table_result_set->get_value<float>(i);
+                        std::cout << val;
+                        break;
+                    }
+                    case common::DOUBLE: {
+                        double val = table_result_set->get_value<double>(i);
+                        std::cout << val;
+                        break;
+                    }
+                    case common::BOOLEAN: {
+                        bool val = table_result_set->get_value<bool>(i);
+                        std::cout << (val ? "true" : "false");
+                        break;
+                    }
+                    case common::TEXT:
+                    case common::STRING: {
+                        common::String* str =
+                            table_result_set->get_value<common::String*>(i);
+                        if (str == nullptr) {
+                            std::cout << "null";
+                        } else {
+                            std::cout << std::string(str->buf_, str->len_);
+                        }
+                        break;
+                    }
+                    default: {
+                        std::cout << "<UNKNOWN>";
+                        break;
+                    }
+                }
+            }
+            if (i < column_count) {
+                std::cout << "\t";
+            }
+        }
+        std::cout << std::endl;
+        row_count++;
+    }
+    std::cout << "Total rows: " << row_count << std::endl;
+}
+
 }  // namespace storage
 
 #endif  // READER_QUERY_DATA_SET_H
diff --git a/cpp/src/reader/tsfile_series_scan_iterator.cc b/cpp/src/reader/tsfile_series_scan_iterator.cc
index b1be6835..5e78574e 100644
--- a/cpp/src/reader/tsfile_series_scan_iterator.cc
+++ b/cpp/src/reader/tsfile_series_scan_iterator.cc
@@ -36,11 +36,11 @@ void TsFileSeriesScanIterator::destroy() {
     }
 }
 
-int TsFileSeriesScanIterator::get_next(TsBlock *&ret_tsblock, bool alloc,
-                                       Filter *oneshoot_filter) {
+int TsFileSeriesScanIterator::get_next(TsBlock*& ret_tsblock, bool alloc,
+                                       Filter* oneshoot_filter) {
     // TODO @filter
     int ret = E_OK;
-    Filter *filter =
+    Filter* filter =
         (oneshoot_filter != nullptr) ? oneshoot_filter : time_filter_;
     if (!chunk_reader_->has_more_data()) {
         while (true) {
@@ -48,7 +48,7 @@ int TsFileSeriesScanIterator::get_next(TsBlock *&ret_tsblock, bool alloc,
                 return E_NO_MORE_DATA;
             } else {
                 if (!is_aligned_) {
-                    ChunkMeta *cm = get_current_chunk_meta();
+                    ChunkMeta* cm = get_current_chunk_meta();
                     advance_to_next_chunk();
                     if (filter != nullptr && cm->statistic_ != nullptr &&
                         !filter->satisfy(cm->statistic_)) {
@@ -59,8 +59,8 @@ int TsFileSeriesScanIterator::get_next(TsBlock *&ret_tsblock, bool alloc,
                     }
                     break;
                 } else {
-                    ChunkMeta *value_cm = value_chunk_meta_cursor_.get();
-                    ChunkMeta *time_cm = time_chunk_meta_cursor_.get();
+                    ChunkMeta* value_cm = value_chunk_meta_cursor_.get();
+                    ChunkMeta* time_cm = time_chunk_meta_cursor_.get();
                     advance_to_next_chunk();
                     if (filter != nullptr && value_cm->statistic_ != nullptr &&
                         !filter->satisfy(value_cm->statistic_)) {
@@ -96,10 +96,10 @@ int TsFileSeriesScanIterator::init_chunk_reader() {
     int ret = E_OK;
     is_aligned_ = itimeseries_index_->get_data_type() == common::VECTOR;
     if (!is_aligned_) {
-        void *buf = common::mem_alloc(sizeof(ChunkReader), common::MOD_DEFAULT);
+        void* buf = common::mem_alloc(sizeof(ChunkReader), common::MOD_DEFAULT);
         chunk_reader_ = new (buf) ChunkReader;
         chunk_meta_cursor_ = itimeseries_index_->get_chunk_meta_list()->begin();
-        ChunkMeta *cm = chunk_meta_cursor_.get();
+        ChunkMeta* cm = chunk_meta_cursor_.get();
         ASSERT(!chunk_reader_->has_more_data());
         if (RET_FAIL(chunk_reader_->init(
                 read_file_, itimeseries_index_->get_measurement_name(),
@@ -109,16 +109,15 @@ int TsFileSeriesScanIterator::init_chunk_reader() {
             chunk_meta_cursor_++;
         }
     } else {
-        void *buf =
+        void* buf =
             common::mem_alloc(sizeof(AlignedChunkReader), common::MOD_DEFAULT);
         chunk_reader_ = new (buf) AlignedChunkReader;
         time_chunk_meta_cursor_ =
             itimeseries_index_->get_time_chunk_meta_list()->begin();
         value_chunk_meta_cursor_ =
             itimeseries_index_->get_value_chunk_meta_list()->begin();
-        ChunkMeta *time_cm = time_chunk_meta_cursor_.get();
-        ChunkMeta *value_cm = value_chunk_meta_cursor_.get();
-        chunk_reader_->has_more_data();
+        ChunkMeta* time_cm = time_chunk_meta_cursor_.get();
+        ChunkMeta* value_cm = value_chunk_meta_cursor_.get();
         ASSERT(!chunk_reader_->has_more_data());
         if (RET_FAIL(chunk_reader_->init(
                 read_file_, itimeseries_index_->get_measurement_name(),
@@ -134,8 +133,8 @@ int TsFileSeriesScanIterator::init_chunk_reader() {
     return ret;
 }
 
-TsBlock *TsFileSeriesScanIterator::alloc_tsblock() {
-    ChunkHeader &ch = chunk_reader_->get_chunk_header();
+TsBlock* TsFileSeriesScanIterator::alloc_tsblock() {
+    ChunkHeader& ch = chunk_reader_->get_chunk_header();
 
     // TODO config
     ColumnSchema time_cd("time", common::INT64, common::SNAPPY,
diff --git a/cpp/src/utils/db_utils.h b/cpp/src/utils/db_utils.h
index 90d0b969..8c0b89ce 100644
--- a/cpp/src/utils/db_utils.h
+++ b/cpp/src/utils/db_utils.h
@@ -315,65 +315,6 @@ FORCE_INLINE int64_t get_cur_timestamp() {
     }
     return timestamp;
 }
-
-#if 0
-struct DatabaseIdTTL
-{
-  NodeID db_nid_;
-  int64_t  ttl_;
-  int16_t counter_;  // suppose we at most support 64k timeseries.
-  DatabaseIdTTL() {}
-  DatabaseIdTTL(NodeID db_nid, int64_t ttl, int16_t counter) :  db_nid_(db_nid), ttl_(ttl), counter_(counter) {}  
-  DatabaseIdTTL(const DatabaseIdTTL &other) :  db_nid_(other.db_nid_), ttl_(other.ttl_), counter_(other.counter_) {}
-  DatabaseIdTTL & operator = (const DatabaseIdTTL &other) 
-  {
-    this->db_nid_ = other.db_nid_;
-    this->ttl_ = other.ttl_;
-    this->counter_ = other.counter_;
-    return *this;
-  }
-  bool operator == (const DatabaseIdTTL &other)
-  {
-    if (db_nid_ != other.db_nid_ || ttl_ != other.ttl_ || counter_ != other.counter_) {
-      return false;
-    }
-    return true;
-  }
-  friend std::ostream& operator << (std::ostream& out, DatabaseIdTTL& di)
-  {
-
-    return out;
-  }    
-};
-
-struct DeviceIDWithCounter
-{
-  NodeID device_nid_;
-  int16_t counter_;  // suppose we at most support 64k timeseries.
-  DeviceIDWithCounter() {}
-  DeviceIDWithCounter(NodeID device_nid, int16_t counter) :  device_nid_(device_nid), counter_(counter) {}  
-  DeviceIDWithCounter(const DeviceIDWithCounter &other) :  device_nid_(other.device_nid_), counter_(other.counter_) {}
-  DeviceIDWithCounter& operator = (const DeviceIDWithCounter &other) 
-  {
-    this->device_nid_ = other.device_nid_;
-    this->counter_ = other.counter_;
-    return *this;
-  }
-  bool operator == (const DeviceID &other)
-  {
-    if (device_nid_ != other.device_nid_ || counter_ != other.counter_) {
-      return false;
-    }
-    return true;
-  }
-  friend std::ostream& operator << (std::ostream& out, DeviceID& di)
-  {
-    out << "(" << di.device_nid_ << ", " << di.counter_ << ")  ";
-    return out;
-  }    
-};
-#endif
-
 }  // end namespace common
 
 #endif  // UTILS_UTILS_H
diff --git a/cpp/test/reader/tree_view/tsfile_reader_tree_test.cc b/cpp/test/reader/tree_view/tsfile_reader_tree_test.cc
index a5c46102..ffcaa20f 100644
--- a/cpp/test/reader/tree_view/tsfile_reader_tree_test.cc
+++ b/cpp/test/reader/tree_view/tsfile_reader_tree_test.cc
@@ -32,92 +32,6 @@
 using namespace storage;
 using namespace common;
 
-static void print_table_result_set(storage::TableResultSet* table_result_set) {
-    if (table_result_set == nullptr) {
-        std::cout << "TableResultSet is nullptr" << std::endl;
-        return;
-    }
-
-    auto metadata = table_result_set->get_metadata();
-    if (metadata == nullptr) {
-        std::cout << "Metadata is nullptr" << std::endl;
-        return;
-    }
-
-    uint32_t column_count = metadata->get_column_count();
-    if (column_count == 0) {
-        std::cout << "No columns in result set" << std::endl;
-        return;
-    }
-
-    for (uint32_t i = 1; i <= column_count; i++) {
-        std::cout << metadata->get_column_name(i);
-        if (i < column_count) {
-            std::cout << "\t";
-        }
-    }
-    std::cout << std::endl;
-
-    bool has_next = false;
-    int row_count = 0;
-    while (IS_SUCC(table_result_set->next(has_next)) && has_next) {
-        for (uint32_t i = 1; i <= column_count; i++) {
-            if (table_result_set->is_null(i)) {
-                std::cout << "NULL";
-            } else {
-                common::TSDataType col_type = metadata->get_column_type(i);
-                switch (col_type) {
-                    case common::INT64: {
-                        int64_t val = table_result_set->get_value<int64_t>(i);
-                        std::cout << val;
-                        break;
-                    }
-                    case common::INT32: {
-                        int32_t val = table_result_set->get_value<int32_t>(i);
-                        std::cout << val;
-                        break;
-                    }
-                    case common::FLOAT: {
-                        float val = table_result_set->get_value<float>(i);
-                        std::cout << val;
-                        break;
-                    }
-                    case common::DOUBLE: {
-                        double val = table_result_set->get_value<double>(i);
-                        std::cout << val;
-                        break;
-                    }
-                    case common::BOOLEAN: {
-                        bool val = table_result_set->get_value<bool>(i);
-                        std::cout << (val ? "true" : "false");
-                        break;
-                    }
-                    case common::STRING: {
-                        common::String* str =
-                            table_result_set->get_value<common::String*>(i);
-                        if (str == nullptr) {
-                            std::cout << "null";
-                        } else {
-                            std::cout << std::string(str->buf_, str->len_);
-                        }
-                        break;
-                    }
-                    default: {
-                        std::cout << "<UNKNOWN>";
-                        break;
-                    }
-                }
-            }
-            if (i < column_count) {
-                std::cout << "\t";
-            }
-        }
-        std::cout << std::endl;
-        row_count++;
-    }
-    std::cout << "Total rows: " << row_count << std::endl;
-}
-
 class TsFileTreeReaderTest : public ::testing::Test {
    protected:
     void SetUp() override {
diff --git a/cpp/test/writer/tsfile_writer_test.cc b/cpp/test/writer/tsfile_writer_test.cc
index 791cf8e7..07d6cf78 100644
--- a/cpp/test/writer/tsfile_writer_test.cc
+++ b/cpp/test/writer/tsfile_writer_test.cc
@@ -320,19 +320,20 @@ TEST_F(TsFileWriterTest, WriteDiffrentTypeCombination) {
     char *literal = new char[std::strlen("literal") + 1];
     std::strcpy(literal, "literal");
     String literal_str(literal, std::strlen("literal"));
-
-    for (size_t i = 0; i < schema_vecs.size(); ++i) {
-        TsRecord record(1622505600000 + i * 1000, device_path);
-        if (schema_vecs[i].data_type_ == TSDataType::INT32) {
-            record.add_point(schema_vecs[i].measurement_name_, (int32_t)i);
-        } else if (schema_vecs[i].data_type_ == TSDataType::FLOAT) {
-            record.add_point(schema_vecs[i].measurement_name_, 3.14);
-        } else if (schema_vecs[i].data_type_ == TSDataType::DOUBLE) {
-            record.add_point(schema_vecs[i].measurement_name_, 3.1415926);
-        } else if (schema_vecs[i].data_type_ == TSDataType::BOOLEAN) {
-            record.add_point(schema_vecs[i].measurement_name_, true);
-        } else if (schema_vecs[i].data_type_ == TSDataType::STRING) {
-            record.add_point(schema_vecs[i].measurement_name_, literal_str);
+    for (size_t l = 0; l < 100; ++l) {
+        TsRecord record(1622505600000 + 1 * 1000, device_path);
+        for (size_t i = 0; i < schema_vecs.size(); ++i) {
+            if (schema_vecs[i].data_type_ == TSDataType::INT32) {
+                record.add_point(schema_vecs[i].measurement_name_, (int32_t)i);
+            } else if (schema_vecs[i].data_type_ == TSDataType::FLOAT) {
+                record.add_point(schema_vecs[i].measurement_name_, 3.14);
+            } else if (schema_vecs[i].data_type_ == TSDataType::DOUBLE) {
+                record.add_point(schema_vecs[i].measurement_name_, 3.1415926);
+            } else if (schema_vecs[i].data_type_ == TSDataType::BOOLEAN) {
+                record.add_point(schema_vecs[i].measurement_name_, true);
+            } else if (schema_vecs[i].data_type_ == TSDataType::STRING) {
+                record.add_point(schema_vecs[i].measurement_name_, literal_str);
+            }
         }
         ASSERT_EQ(tsfile_writer_->write_record(record), E_OK);
     }
diff --git a/python/tests/resources/README.md b/python/tests/resources/README.md
new file mode 100644
index 00000000..ca80bb43
--- /dev/null
+++ b/python/tests/resources/README.md
@@ -0,0 +1,285 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+In `simple_tree.tsfile`:
+
+```sql
+
+CREATE TIMESERIES root.ln.wf01.wt01.status WITH DATATYPE=BOOLEAN, ENCODING=PLAIN;
+CREATE TIMESERIES root.ln.wf01.wt01.temperature WITH DATATYPE=FLOAT, ENCODING=PLAIN;
+IoTDB> show timeseries;
++-----------------------------+-----+--------+--------+--------+-----------+----+----------+--------+------------------+--------+
+|                   Timeseries|Alias|Database|DataType|Encoding|Compression|Tags|Attributes|Deadband|DeadbandParameters|ViewType|
++-----------------------------+-----+--------+--------+--------+-----------+----+----------+--------+------------------+--------+
+|root.ln.wf01.wt01.temperature| null| root.ln|   FLOAT|     RLE|        LZ4|null|      null|    null|              null|    BASE|
+|     root.ln.wf01.wt01.status| null| root.ln| BOOLEAN|   PLAIN|        LZ4|null|      null|    null|              null|    BASE|
++-----------------------------+-----+--------+--------+--------+-----------+----+----------+--------+------------------+--------+
+```
+
+```sql
+IoTDB> select * from root.ln.wf01.wt01;
++-----------------------------+-----------------------------+------------------------+
+|                         Time|root.ln.wf01.wt01.temperature|root.ln.wf01.wt01.status|
++-----------------------------+-----------------------------+------------------------+
+|1970-01-01T08:00:00.100+08:00|                         null|                    true|
+|1970-01-01T08:00:00.101+08:00|                         null|                   false|
+|1970-01-01T08:00:00.102+08:00|                         null|                    true|
+|1970-01-01T08:00:00.103+08:00|                         null|                   false|
+|1970-01-01T08:00:00.104+08:00|                         null|                    true|
+|1970-01-01T08:00:00.105+08:00|                         20.0|                   false|
+|1970-01-01T08:00:00.106+08:00|                         20.1|                    true|
+|1970-01-01T08:00:00.107+08:00|                         20.2|                   false|
+|1970-01-01T08:00:00.108+08:00|                         20.3|                    true|
+|1970-01-01T08:00:00.109+08:00|                         20.4|                   false|
+|1970-01-01T08:00:00.110+08:00|                         20.5|                    true|
+|1970-01-01T08:00:00.111+08:00|                         20.6|                   false|
+|1970-01-01T08:00:00.112+08:00|                         20.7|                    true|
+|1970-01-01T08:00:00.113+08:00|                         20.8|                   false|
+|1970-01-01T08:00:00.114+08:00|                         20.9|                    true|
+|1970-01-01T08:00:00.115+08:00|                         21.0|                   false|
+|1970-01-01T08:00:00.116+08:00|                         21.1|                    true|
+|1970-01-01T08:00:00.117+08:00|                         21.2|                   false|
+|1970-01-01T08:00:00.118+08:00|                         21.3|                    true|
+|1970-01-01T08:00:00.119+08:00|                         21.4|                   false|
+|1970-01-01T08:00:00.120+08:00|                         21.5|                    true|
+|1970-01-01T08:00:00.121+08:00|                         21.6|                   false|
+|1970-01-01T08:00:00.122+08:00|                         21.7|                    true|
+|1970-01-01T08:00:00.123+08:00|                         21.8|                   false|
+|1970-01-01T08:00:00.124+08:00|                         21.9|                    true|
+|1970-01-01T08:00:00.125+08:00|                         22.0|                   false|
+|1970-01-01T08:00:00.126+08:00|                         22.1|                    true|
+|1970-01-01T08:00:00.127+08:00|                         22.2|                   false|
+|1970-01-01T08:00:00.128+08:00|                         22.3|                    true|
+|1970-01-01T08:00:00.129+08:00|                         22.4|                   false|
+|1970-01-01T08:00:00.130+08:00|                         22.5|                    true|
+|1970-01-01T08:00:00.131+08:00|                         22.6|                   false|
+|1970-01-01T08:00:00.132+08:00|                         22.7|                    true|
+|1970-01-01T08:00:00.133+08:00|                         22.8|                   false|
+|1970-01-01T08:00:00.134+08:00|                         22.9|                    true|
+|1970-01-01T08:00:00.135+08:00|                         23.0|                   false|
+|1970-01-01T08:00:00.136+08:00|                         23.1|                    true|
+|1970-01-01T08:00:00.137+08:00|                         23.2|                   false|
+|1970-01-01T08:00:00.138+08:00|                         23.3|                    true|
+|1970-01-01T08:00:00.139+08:00|                         23.4|                   false|
+|1970-01-01T08:00:00.140+08:00|                         23.5|                    true|
+|1970-01-01T08:00:00.141+08:00|                         23.6|                   false|
+|1970-01-01T08:00:00.142+08:00|                         23.7|                    true|
+|1970-01-01T08:00:00.143+08:00|                         23.8|                   false|
+|1970-01-01T08:00:00.144+08:00|                         23.9|                    true|
+|1970-01-01T08:00:00.145+08:00|                         24.0|                   false|
+|1970-01-01T08:00:00.146+08:00|                         24.1|                    true|
+|1970-01-01T08:00:00.147+08:00|                         24.2|                   false|
+|1970-01-01T08:00:00.148+08:00|                         24.3|                    true|
+|1970-01-01T08:00:00.149+08:00|                         24.4|                   false|
+|1970-01-01T08:00:00.150+08:00|                         24.5|                    true|
+|1970-01-01T08:00:00.151+08:00|                         24.6|                   false|
+|1970-01-01T08:00:00.152+08:00|                         24.7|                    true|
+|1970-01-01T08:00:00.153+08:00|                         24.8|                   false|
+|1970-01-01T08:00:00.154+08:00|                         24.9|                    true|
+|1970-01-01T08:00:00.155+08:00|                         25.0|                   false|
+|1970-01-01T08:00:00.156+08:00|                         25.1|                    true|
+|1970-01-01T08:00:00.157+08:00|                         25.2|                   false|
+|1970-01-01T08:00:00.158+08:00|                         25.3|                    true|
+|1970-01-01T08:00:00.159+08:00|                         25.4|                   false|
+|1970-01-01T08:00:00.160+08:00|                         25.5|                    true|
+|1970-01-01T08:00:00.161+08:00|                         25.6|                   false|
+|1970-01-01T08:00:00.162+08:00|                         25.7|                    true|
+|1970-01-01T08:00:00.163+08:00|                         25.8|                   false|
+|1970-01-01T08:00:00.164+08:00|                         25.9|                    true|
+|1970-01-01T08:00:00.165+08:00|                         26.0|                   false|
+|1970-01-01T08:00:00.166+08:00|                         26.1|                    true|
+|1970-01-01T08:00:00.167+08:00|                         26.2|                   false|
+|1970-01-01T08:00:00.168+08:00|                         26.3|                    true|
+|1970-01-01T08:00:00.169+08:00|                         26.4|                   false|
+|1970-01-01T08:00:00.170+08:00|                         26.5|                    true|
+|1970-01-01T08:00:00.171+08:00|                         26.6|                   false|
+|1970-01-01T08:00:00.172+08:00|                         26.7|                    true|
+|1970-01-01T08:00:00.173+08:00|                         26.8|                   false|
+|1970-01-01T08:00:00.174+08:00|                         26.9|                    true|
+|1970-01-01T08:00:00.175+08:00|                         27.0|                   false|
+|1970-01-01T08:00:00.176+08:00|                         27.1|                    true|
+|1970-01-01T08:00:00.177+08:00|                         27.2|                   false|
+|1970-01-01T08:00:00.178+08:00|                         27.3|                    true|
+|1970-01-01T08:00:00.179+08:00|                         27.4|                   false|
+|1970-01-01T08:00:00.180+08:00|                         27.5|                    true|
+|1970-01-01T08:00:00.181+08:00|                         27.6|                   false|
+|1970-01-01T08:00:00.182+08:00|                         27.7|                    true|
+|1970-01-01T08:00:00.183+08:00|                         27.8|                   false|
+|1970-01-01T08:00:00.184+08:00|                         27.9|                    true|
+|1970-01-01T08:00:00.185+08:00|                         28.0|                   false|
+|1970-01-01T08:00:00.186+08:00|                         28.1|                    true|
+|1970-01-01T08:00:00.187+08:00|                         28.2|                   false|
+|1970-01-01T08:00:00.188+08:00|                         28.3|                    true|
+|1970-01-01T08:00:00.189+08:00|                         28.4|                   false|
+|1970-01-01T08:00:00.190+08:00|                         28.5|                    true|
+|1970-01-01T08:00:00.191+08:00|                         28.6|                   false|
+|1970-01-01T08:00:00.192+08:00|                         28.7|                    true|
+|1970-01-01T08:00:00.193+08:00|                         28.8|                   false|
+|1970-01-01T08:00:00.194+08:00|                         28.9|                    true|
+|1970-01-01T08:00:00.195+08:00|                         29.0|                   false|
+|1970-01-01T08:00:00.196+08:00|                         29.1|                    true|
+|1970-01-01T08:00:00.197+08:00|                         29.2|                   false|
+|1970-01-01T08:00:00.198+08:00|                         29.3|                    true|
+|1970-01-01T08:00:00.199+08:00|                         29.4|                   false|
+|1970-01-01T08:00:00.200+08:00|                         29.5|                    null|
+|1970-01-01T08:00:00.201+08:00|                         29.6|                    null|
+|1970-01-01T08:00:00.202+08:00|                         29.7|                    null|
+|1970-01-01T08:00:00.203+08:00|                         29.8|                    null|
+|1970-01-01T08:00:00.204+08:00|                         29.9|                    null|
++-----------------------------+-----------------------------+------------------------+
+Total line number = 105
+```
+
+In `simple_table_t1.tsfile`
+
+```sql
+IoTDB:test> CREATE TABLE test (
+>   s0  STRING TAG,
+>   s1  STRING TAG,
+>   s2  INT64     FIELD,
+>   s3  FLOAT     FIELD,
+>   s4  STRING    FIELD,
+>   s5  TIMESTAMP FIELD,
+>   s6  INT32     FIELD,
+>   s7  DOUBLE    FIELD,
+>   s8  DATE      FIELD,
+>   s9  TEXT      FIELD
+> );
+
+IoTDB:test> select * from test;
++-----------------------------+--+--+----+----+---+-----------------------------+----+----+----------+------+
+|                         time|s0|s1|  s2|  s3| s4|                           s5|  s6|  s7|        s8|    s9|
++-----------------------------+--+--+----+----+---+-----------------------------+----+----+----------+------+
+|2025-10-10T22:20:20.000+08:00| a| b|1010| 2.0|v10|1970-01-01T08:00:01.010+08:00|  20|11.0|2024-10-20|text10|
+|2025-10-10T22:20:21.000+08:00| a| b|1011| 2.1|v11|1970-01-01T08:00:01.011+08:00|  21|11.1|2024-10-21|text11|
+|2025-10-10T22:20:22.000+08:00| a| b|1012| 2.2|v12|1970-01-01T08:00:01.012+08:00|  22|11.2|2024-10-22|text12|
+|2025-10-10T22:20:23.000+08:00| a| b|1013| 2.3|v13|1970-01-01T08:00:01.013+08:00|  23|11.3|2024-10-23|text13|
+|2025-10-10T22:20:24.000+08:00| a| b|1014| 2.4|v14|1970-01-01T08:00:01.014+08:00|  24|11.4|2024-10-24|text14|
+|2025-10-10T22:20:25.000+08:00| a| b|1015| 2.5|v15|1970-01-01T08:00:01.015+08:00|  25|11.5|2024-10-25|text15|
+|2025-10-10T22:20:26.000+08:00| a| b|null| 2.6|v16|1970-01-01T08:00:01.016+08:00|null|11.6|2024-10-26|  null|
+|2025-10-10T22:20:27.000+08:00| a| b|1017| 2.7|v17|1970-01-01T08:00:01.017+08:00|  27|11.7|2024-10-27|text17|
+|2025-10-10T22:20:28.000+08:00| a| b|1018| 2.8|v18|1970-01-01T08:00:01.018+08:00|  28|11.8|2024-10-28|text18|
+|2025-10-10T22:20:29.000+08:00| a| b|1019| 2.9|v19|1970-01-01T08:00:01.019+08:00|  29|11.9|2024-10-29|text19|
+|2025-10-10T22:20:30.000+08:00| a| b|1020| 3.0|v20|1970-01-01T08:00:01.020+08:00|  30|12.0|2024-10-30|text20|
+|2025-10-10T22:20:31.000+08:00| a| b|1021| 3.1|v21|1970-01-01T08:00:01.021+08:00|  31|12.1|2024-10-31|text21|
+|2025-10-10T22:20:32.000+08:00| a| b|1022| 3.2|v22|1970-01-01T08:00:01.022+08:00|  32|12.2|2024-11-01|text22|
+|2025-10-10T22:20:33.000+08:00| a| b|null| 3.3|v23|1970-01-01T08:00:01.023+08:00|null|12.3|2024-11-02|  null|
+|2025-10-10T22:20:34.000+08:00| a| b|1024| 3.4|v24|1970-01-01T08:00:01.024+08:00|  34|12.4|2024-11-03|text24|
+|2025-10-10T22:20:35.000+08:00| a| b|1025| 3.5|v25|1970-01-01T08:00:01.025+08:00|  35|12.5|2024-11-04|text25|
+|2025-10-10T22:20:36.000+08:00| a| b|1026| 3.6|v26|1970-01-01T08:00:01.026+08:00|  36|12.6|2024-11-05|text26|
+|2025-10-10T22:20:37.000+08:00| a| b|1027| 3.7|v27|1970-01-01T08:00:01.027+08:00|  37|12.7|2024-11-06|text27|
+|2025-10-10T22:20:38.000+08:00| a| b|1028| 3.8|v28|1970-01-01T08:00:01.028+08:00|  38|12.8|2024-11-07|text28|
+|2025-10-10T22:20:39.000+08:00| a| b|null| 3.9|v29|1970-01-01T08:00:01.029+08:00|null|12.9|2024-11-08|  null|
+|2025-10-10T22:20:40.000+08:00| a| b|1030| 4.0|v30|1970-01-01T08:00:01.030+08:00|  40|13.0|2024-11-09|text30|
+|2025-10-10T22:20:41.000+08:00| a| b|1031| 4.1|v31|1970-01-01T08:00:01.031+08:00|  41|13.1|2024-11-10|text31|
+|2025-10-10T22:20:42.000+08:00| a| b|1032| 4.2|v32|1970-01-01T08:00:01.032+08:00|  42|13.2|2024-11-11|text32|
+|2025-10-10T22:20:43.000+08:00| a| b|1033| 4.3|v33|1970-01-01T08:00:01.033+08:00|  43|13.3|2024-11-12|text33|
+|2025-10-10T22:20:44.000+08:00| a| b|1034| 4.4|v34|1970-01-01T08:00:01.034+08:00|  44|13.4|2024-11-13|text34|
+|2025-10-10T22:20:45.000+08:00| a| b|1035| 4.5|v35|1970-01-01T08:00:01.035+08:00|  45|13.5|2024-11-14|text35|
+|2025-10-10T22:20:46.000+08:00| a| b|null| 4.6|v36|1970-01-01T08:00:01.036+08:00|null|13.6|2024-11-15|  null|
+|2025-10-10T22:20:47.000+08:00| a| b|1037| 4.7|v37|1970-01-01T08:00:01.037+08:00|  47|13.7|2024-11-16|text37|
+|2025-10-10T22:20:48.000+08:00| a| b|1038| 4.8|v38|1970-01-01T08:00:01.038+08:00|  48|13.8|2024-11-17|text38|
+|2025-10-10T22:20:49.000+08:00| a| b|1039| 4.9|v39|1970-01-01T08:00:01.039+08:00|  49|13.9|2024-11-18|text39|
+|2025-10-10T22:21:20.000+08:00| b| d|1070| 8.0|v70|1970-01-01T08:00:01.070+08:00|  80|17.0|2024-12-19|text70|
+|2025-10-10T22:21:21.000+08:00| b| d|1071| 8.1|v71|1970-01-01T08:00:01.071+08:00|  81|17.1|2024-12-20|text71|
+|2025-10-10T22:21:22.000+08:00| b| d|1072| 8.2|v72|1970-01-01T08:00:01.072+08:00|  82|17.2|2024-12-21|text72|
+|2025-10-10T22:21:23.000+08:00| b| d|1073| 8.3|v73|1970-01-01T08:00:01.073+08:00|  83|17.3|2024-12-22|text73|
+|2025-10-10T22:21:24.000+08:00| b| d|1074| 8.4|v74|1970-01-01T08:00:01.074+08:00|  84|17.4|2024-12-23|text74|
+|2025-10-10T22:21:25.000+08:00| b| d|1075| 8.5|v75|1970-01-01T08:00:01.075+08:00|  85|17.5|2024-12-24|text75|
+|2025-10-10T22:21:26.000+08:00| b| d|null| 8.6|v76|1970-01-01T08:00:01.076+08:00|null|17.6|2024-12-25|  null|
+|2025-10-10T22:21:27.000+08:00| b| d|1077| 8.7|v77|1970-01-01T08:00:01.077+08:00|  87|17.7|2024-12-26|text77|
+|2025-10-10T22:21:28.000+08:00| b| d|1078| 8.8|v78|1970-01-01T08:00:01.078+08:00|  88|17.8|2024-12-27|text78|
+|2025-10-10T22:21:29.000+08:00| b| d|1079| 8.9|v79|1970-01-01T08:00:01.079+08:00|  89|17.9|2024-12-28|text79|
+|2025-10-10T22:21:30.000+08:00| b| d|1080| 9.0|v80|1970-01-01T08:00:01.080+08:00|  90|18.0|2024-12-29|text80|
+|2025-10-10T22:21:31.000+08:00| b| d|1081| 9.1|v81|1970-01-01T08:00:01.081+08:00|  91|18.1|2024-12-30|text81|
+|2025-10-10T22:21:32.000+08:00| b| d|1082| 9.2|v82|1970-01-01T08:00:01.082+08:00|  92|18.2|2024-12-31|text82|
+|2025-10-10T22:21:33.000+08:00| b| d|null| 9.3|v83|1970-01-01T08:00:01.083+08:00|null|18.3|2025-01-01|  null|
+|2025-10-10T22:21:34.000+08:00| b| d|1084| 9.4|v84|1970-01-01T08:00:01.084+08:00|  94|18.4|2025-01-02|text84|
+|2025-10-10T22:21:35.000+08:00| b| d|1085| 9.5|v85|1970-01-01T08:00:01.085+08:00|  95|18.5|2025-01-03|text85|
+|2025-10-10T22:21:36.000+08:00| b| d|1086| 9.6|v86|1970-01-01T08:00:01.086+08:00|  96|18.6|2025-01-04|text86|
+|2025-10-10T22:21:37.000+08:00| b| d|1087| 9.7|v87|1970-01-01T08:00:01.087+08:00|  97|18.7|2025-01-05|text87|
+|2025-10-10T22:21:38.000+08:00| b| d|1088| 9.8|v88|1970-01-01T08:00:01.088+08:00|  98|18.8|2025-01-06|text88|
+|2025-10-10T22:21:39.000+08:00| b| d|null| 9.9|v89|1970-01-01T08:00:01.089+08:00|null|18.9|2025-01-07|  null|
+|2025-10-10T22:21:40.000+08:00| b| d|1090|10.0|v90|1970-01-01T08:00:01.090+08:00| 100|19.0|2025-01-08|text90|
+|2025-10-10T22:21:41.000+08:00| b| d|1091|10.1|v91|1970-01-01T08:00:01.091+08:00| 101|19.1|2025-01-09|text91|
+|2025-10-10T22:21:42.000+08:00| b| d|1092|10.2|v92|1970-01-01T08:00:01.092+08:00| 102|19.2|2025-01-10|text92|
+|2025-10-10T22:21:43.000+08:00| b| d|1093|10.3|v93|1970-01-01T08:00:01.093+08:00| 103|19.3|2025-01-11|text93|
+|2025-10-10T22:21:44.000+08:00| b| d|1094|10.4|v94|1970-01-01T08:00:01.094+08:00| 104|19.4|2025-01-12|text94|
+|2025-10-10T22:21:45.000+08:00| b| d|1095|10.5|v95|1970-01-01T08:00:01.095+08:00| 105|19.5|2025-01-13|text95|
+|2025-10-10T22:21:46.000+08:00| b| d|null|10.6|v96|1970-01-01T08:00:01.096+08:00|null|19.6|2025-01-14|  null|
+|2025-10-10T22:21:47.000+08:00| b| d|1097|10.7|v97|1970-01-01T08:00:01.097+08:00| 107|19.7|2025-01-15|text97|
+|2025-10-10T22:21:48.000+08:00| b| d|1098|10.8|v98|1970-01-01T08:00:01.098+08:00| 108|19.8|2025-01-16|text98|
+|2025-10-10T22:21:49.000+08:00| b| d|1099|10.9|v99|1970-01-01T08:00:01.099+08:00| 109|19.9|2025-01-17|text99|
++-----------------------------+--+--+----+----+---+-----------------------------+----+----+----------+------+
+Total line number = 60
+```
+
+In `simple_table_t2.tsfile`
+
+```sql
+
+IoTDB:test> select * from test;
++-----------------------------+--+--+----+---+---+-----------------------------+----+----+----------+------+
+|                         time|s0|s1|  s2| s3| s4|                           s5|  s6|  s7|        s8|    s9|
++-----------------------------+--+--+----+---+---+-----------------------------+----+----+----------+------+
+|2025-10-10T22:20:10.000+08:00| a| a|1000|1.0| v0|1970-01-01T08:00:01.000+08:00|  10|10.0|2024-10-10| text0|
+|2025-10-10T22:20:11.000+08:00| a| a|1001|1.1| v1|1970-01-01T08:00:01.001+08:00|  11|10.1|2024-10-11| text1|
+|2025-10-10T22:20:12.000+08:00| a| a|1002|1.2| v2|1970-01-01T08:00:01.002+08:00|  12|10.2|2024-10-12| text2|
+|2025-10-10T22:20:13.000+08:00| a| a|1003|1.3| v3|1970-01-01T08:00:01.003+08:00|  13|10.3|2024-10-13| text3|
+|2025-10-10T22:20:14.000+08:00| a| a|1004|1.4| v4|1970-01-01T08:00:01.004+08:00|  14|10.4|2024-10-14| text4|
+|2025-10-10T22:20:15.000+08:00| a| a|1005|1.5| v5|1970-01-01T08:00:01.005+08:00|  15|10.5|2024-10-15| text5|
+|2025-10-10T22:20:16.000+08:00| a| a|null|1.6| v6|1970-01-01T08:00:01.006+08:00|null|10.6|2024-10-16|  null|
+|2025-10-10T22:20:17.000+08:00| a| a|1007|1.7| v7|1970-01-01T08:00:01.007+08:00|  17|10.7|2024-10-17| text7|
+|2025-10-10T22:20:18.000+08:00| a| a|1008|1.8| v8|1970-01-01T08:00:01.008+08:00|  18|10.8|2024-10-18| text8|
+|2025-10-10T22:20:19.000+08:00| a| a|1009|1.9| v9|1970-01-01T08:00:01.009+08:00|  19|10.9|2024-10-19| text9|
+|2025-10-10T22:20:50.000+08:00| b| c|1040|5.0|v40|1970-01-01T08:00:01.040+08:00|  50|14.0|2024-11-19|text40|
+|2025-10-10T22:20:51.000+08:00| b| c|1041|5.1|v41|1970-01-01T08:00:01.041+08:00|  51|14.1|2024-11-20|text41|
+|2025-10-10T22:20:52.000+08:00| b| c|1042|5.2|v42|1970-01-01T08:00:01.042+08:00|  52|14.2|2024-11-21|text42|
+|2025-10-10T22:20:53.000+08:00| b| c|1043|5.3|v43|1970-01-01T08:00:01.043+08:00|  53|14.3|2024-11-22|text43|
+|2025-10-10T22:20:54.000+08:00| b| c|1044|5.4|v44|1970-01-01T08:00:01.044+08:00|  54|14.4|2024-11-23|text44|
+|2025-10-10T22:20:55.000+08:00| b| c|1045|5.5|v45|1970-01-01T08:00:01.045+08:00|  55|14.5|2024-11-24|text45|
+|2025-10-10T22:20:56.000+08:00| b| c|null|5.6|v46|1970-01-01T08:00:01.046+08:00|null|14.6|2024-11-25|  null|
+|2025-10-10T22:20:57.000+08:00| b| c|1047|5.7|v47|1970-01-01T08:00:01.047+08:00|  57|14.7|2024-11-26|text47|
+|2025-10-10T22:20:58.000+08:00| b| c|1048|5.8|v48|1970-01-01T08:00:01.048+08:00|  58|14.8|2024-11-27|text48|
+|2025-10-10T22:20:59.000+08:00| b| c|1049|5.9|v49|1970-01-01T08:00:01.049+08:00|  59|14.9|2024-11-28|text49|
+|2025-10-10T22:21:00.000+08:00| b| c|1050|6.0|v50|1970-01-01T08:00:01.050+08:00|  60|15.0|2024-11-29|text50|
+|2025-10-10T22:21:01.000+08:00| b| c|1051|6.1|v51|1970-01-01T08:00:01.051+08:00|  61|15.1|2024-11-30|text51|
+|2025-10-10T22:21:02.000+08:00| b| c|1052|6.2|v52|1970-01-01T08:00:01.052+08:00|  62|15.2|2024-12-01|text52|
+|2025-10-10T22:21:03.000+08:00| b| c|null|6.3|v53|1970-01-01T08:00:01.053+08:00|null|15.3|2024-12-02|  null|
+|2025-10-10T22:21:04.000+08:00| b| c|1054|6.4|v54|1970-01-01T08:00:01.054+08:00|  64|15.4|2024-12-03|text54|
+|2025-10-10T22:21:05.000+08:00| b| c|1055|6.5|v55|1970-01-01T08:00:01.055+08:00|  65|15.5|2024-12-04|text55|
+|2025-10-10T22:21:06.000+08:00| b| c|1056|6.6|v56|1970-01-01T08:00:01.056+08:00|  66|15.6|2024-12-05|text56|
+|2025-10-10T22:21:07.000+08:00| b| c|1057|6.7|v57|1970-01-01T08:00:01.057+08:00|  67|15.7|2024-12-06|text57|
+|2025-10-10T22:21:08.000+08:00| b| c|1058|6.8|v58|1970-01-01T08:00:01.058+08:00|  68|15.8|2024-12-07|text58|
+|2025-10-10T22:21:09.000+08:00| b| c|null|6.9|v59|1970-01-01T08:00:01.059+08:00|null|15.9|2024-12-08|  null|
+|2025-10-10T22:21:10.000+08:00| b| c|1060|7.0|v60|1970-01-01T08:00:01.060+08:00|  70|16.0|2024-12-09|text60|
+|2025-10-10T22:21:11.000+08:00| b| c|1061|7.1|v61|1970-01-01T08:00:01.061+08:00|  71|16.1|2024-12-10|text61|
+|2025-10-10T22:21:12.000+08:00| b| c|1062|7.2|v62|1970-01-01T08:00:01.062+08:00|  72|16.2|2024-12-11|text62|
+|2025-10-10T22:21:13.000+08:00| b| c|1063|7.3|v63|1970-01-01T08:00:01.063+08:00|  73|16.3|2024-12-12|text63|
+|2025-10-10T22:21:14.000+08:00| b| c|1064|7.4|v64|1970-01-01T08:00:01.064+08:00|  74|16.4|2024-12-13|text64|
+|2025-10-10T22:21:15.000+08:00| b| c|1065|7.5|v65|1970-01-01T08:00:01.065+08:00|  75|16.5|2024-12-14|text65|
+|2025-10-10T22:21:16.000+08:00| b| c|null|7.6|v66|1970-01-01T08:00:01.066+08:00|null|16.6|2024-12-15|  null|
+|2025-10-10T22:21:17.000+08:00| b| c|1067|7.7|v67|1970-01-01T08:00:01.067+08:00|  77|16.7|2024-12-16|text67|
+|2025-10-10T22:21:18.000+08:00| b| c|1068|7.8|v68|1970-01-01T08:00:01.068+08:00|  78|16.8|2024-12-17|text68|
+|2025-10-10T22:21:19.000+08:00| b| c|1069|7.9|v69|1970-01-01T08:00:01.069+08:00|  79|16.9|2024-12-18|text69|
++-----------------------------+--+--+----+---+---+-----------------------------+----+----+----------+------+
+Total line number = 40
+```
\ No newline at end of file
diff --git a/python/tests/resources/simple_table_t1.tsfile b/python/tests/resources/simple_table_t1.tsfile
new file mode 100644
index 00000000..6ca6647a
Binary files /dev/null and b/python/tests/resources/simple_table_t1.tsfile differ
diff --git a/python/tests/resources/simple_table_t2.tsfile b/python/tests/resources/simple_table_t2.tsfile
new file mode 100644
index 00000000..2cfa12d5
Binary files /dev/null and b/python/tests/resources/simple_table_t2.tsfile differ
diff --git a/python/tests/resources/simple_tree.tsfile b/python/tests/resources/simple_tree.tsfile
new file mode 100644
index 00000000..f281a907
Binary files /dev/null and b/python/tests/resources/simple_tree.tsfile differ
diff --git a/python/tests/test_load_tsfile_from_iotdb.py b/python/tests/test_load_tsfile_from_iotdb.py
new file mode 100644
index 00000000..d865dd35
--- /dev/null
+++ b/python/tests/test_load_tsfile_from_iotdb.py
@@ -0,0 +1,111 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+import os
+
+import numpy as np
+
+import tsfile as ts
+
+
+def test_load_tsfile_from_iotdb():
+    test_path = os.path.dirname(os.path.abspath(__file__))
+    dir_path = os.path.join(test_path, 'resources')
+    simple_tree_path = os.path.join(dir_path, 'simple_tree.tsfile')
+    df = ts.to_dataframe(simple_tree_path)
+
+    ## --------
+    assert len(df) == 105, "row count mismatch"
+    assert df["time"].isna().sum() == 0
+    assert int(df["time"].sum()) == 15960
+    assert df["temperature"].isna().sum() == 5
+    assert df["status"].isna().sum() == 5
+    assert (df["status"] == True).sum() == 50
+    assert (df["status"] == False).sum() == 50
+    ## ---------
+
+    #
+    simple_tabl1_path = os.path.join(dir_path, 'simple_table_t1.tsfile')
+    df = ts.to_dataframe(simple_tabl1_path)
+    ## ---------
+    assert len(df) == 60
+    assert df["time"].isna().sum() == 0
+    assert df["time"].sum() == (
+            (1760106020000 + 1760106049000) * 30 // 2 +
+            (1760106080000 + 1760106109000) * 30 // 2
+    )
+    assert df["s0"].isna().sum() == 0
+    assert df["s1"].isna().sum() == 0
+    assert df["s2"].isna().sum() == 8
+    assert df["s3"].isna().sum() == 0
+    assert df["s4"].isna().sum() == 0
+    assert df["s4"].nunique() == 60
+    assert df["s5"].isna().sum() == 0
+
+    assert df["s5"].sum() == (
+            (1010 + 1039) * 30 // 2 +
+            (1070 + 1099) * 30 // 2
+    )
+    assert df["s6"].isna().sum() == 8
+
+    assert df["s6"].sum(skipna=True) == (
+            (20 + 49) * 30 // 2 - (26 + 33 + 39 + 46)
+            +
+            (80 + 109) * 30 // 2 - (86 + 93 + 99 + 106)
+    )
+    assert df["s7"].isna().sum() == 0
+    assert df["s8"].isna().sum() == 0
+    assert df["s8"].nunique() == 60
+    assert df["s9"].isna().sum() == 8
+    ## ---------
+
+    simple_tabl2_path = os.path.join(dir_path, 'simple_table_t2.tsfile')
+    df = ts.to_dataframe(simple_tabl2_path)
+    ## ---------
+    assert len(df) == 40
+    assert df["time"].isna().sum() == 0
+    assert int(df["time"].sum()) == 70404242080000
+
+    assert df["s0"].isna().sum() == 0
+    assert df["s1"].isna().sum() == 0
+    assert df["s0"].nunique() == 2
+    assert df["s1"].nunique() == 2
+
+    assert df["s2"].isna().sum() == 5
+    assert int(df["s2"].sum(skipna=True)) == 36450
+
+    assert df["s3"].isna().sum() == 0
+    assert np.isclose(float(df["s3"].sum()), 208.0, rtol=1e-6, atol=1e-6)
+
+    assert df["s4"].isna().sum() == 0
+    assert df["s4"].nunique() == 40
+
+    assert df["s5"].isna().sum() == 0
+    assert int(df["s5"].sum()) == 41680
+
+    assert df["s6"].isna().sum() == 5
+    assert int(df["s6"].sum(skipna=True)) == 1800
+
+    assert df["s7"].isna().sum() == 0
+    assert np.isclose(float(df["s7"].sum()), 568.0, rtol=1e-6, atol=1e-6)
+
+    assert df["s8"].isna().sum() == 0
+    assert df["s8"].nunique() == 40
+
+    assert df["s9"].isna().sum() == 5
+    ## ---------
diff --git a/python/tsfile/constants.py b/python/tsfile/constants.py
index 2f1ad982..7d1f5ff5 100644
--- a/python/tsfile/constants.py
+++ b/python/tsfile/constants.py
@@ -56,7 +56,7 @@ class TSDataType(IntEnum):
         Convert datatype to pandas dtype
         """
         if self == TSDataType.BOOLEAN:
-            return "bool"
+            return "boolean"
         elif self == TSDataType.INT32:
             return "Int32"
         elif self == TSDataType.INT64:
diff --git a/python/tsfile/tsfile_reader.pyx b/python/tsfile/tsfile_reader.pyx
index 041fe76d..359492d6 100644
--- a/python/tsfile/tsfile_reader.pyx
+++ b/python/tsfile/tsfile_reader.pyx
@@ -19,6 +19,7 @@
 #cython: language_level=3
 
 import weakref
+from email.contentmanager import raw_data_manager
 from typing import List
 
 import pandas as pd