From 36f485308640f3a62a7e449a6dfc34d47ed9791a Mon Sep 17 00:00:00 2001 From: KarryMorphy <93188900+stackByStack@users.noreply.github.com> Date: Fri, 12 Apr 2024 02:03:25 +0000 Subject: [PATCH 1/3] fix: unmatch between IndexScanPhysicalOperator and index_->create_scanner --- .../planner/operator/index_scan_physical_operator.h | 4 ++++ .../planner/operator/index_scan_physical_operator.cpp | 10 ++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/server/include/query_engine/planner/operator/index_scan_physical_operator.h b/src/server/include/query_engine/planner/operator/index_scan_physical_operator.h index 14520da..fa5a049 100644 --- a/src/server/include/query_engine/planner/operator/index_scan_physical_operator.h +++ b/src/server/include/query_engine/planner/operator/index_scan_physical_operator.h @@ -24,9 +24,11 @@ class IndexScanPhysicalOperator : public PhysicalOperator { if (left_value != nullptr) { left_value_ = *left_value; + left_null_ = false; } if (right_value != nullptr) { right_value_ = *right_value; + right_null_ = false; } } @@ -65,5 +67,7 @@ class IndexScanPhysicalOperator : public PhysicalOperator Value right_value_; bool left_inclusive_ = false; bool right_inclusive_ = false; + bool left_null_ = true; + bool right_null_ = true; std::vector> predicates_; }; diff --git a/src/server/query_engine/planner/operator/index_scan_physical_operator.cpp b/src/server/query_engine/planner/operator/index_scan_physical_operator.cpp index 49a7f2d..4ade668 100644 --- a/src/server/query_engine/planner/operator/index_scan_physical_operator.cpp +++ b/src/server/query_engine/planner/operator/index_scan_physical_operator.cpp @@ -12,11 +12,13 @@ RC IndexScanPhysicalOperator::open(Trx *trx) return RC::INTERNAL; } - IndexScanner *index_scanner = index_->create_scanner(left_value_.data(), - left_value_.length(), + const char *left_key = left_null_ ? nullptr : left_value_.data(); + const char *right_key = right_null_ ? nullptr : right_value_.data(); + IndexScanner *index_scanner = index_->create_scanner(left_key, + left_value_.length(), left_inclusive_, - right_value_.data(), - right_value_.length(), + right_key, + right_value_.length(), right_inclusive_); if(index_scanner == nullptr) { From a88cadc487fbe3a2e0f2ee36156e1c632b4c7997 Mon Sep 17 00:00:00 2001 From: KarryMorphy <93188900+stackByStack@users.noreply.github.com> Date: Mon, 15 Apr 2024 02:02:01 +0000 Subject: [PATCH 2/3] fix: add force copy ability of class Value --- .../include/query_engine/parser/value.h | 1 + src/server/query_engine/parser/value.cpp | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/server/include/query_engine/parser/value.h b/src/server/include/query_engine/parser/value.h index fdb3080..735db69 100644 --- a/src/server/include/query_engine/parser/value.h +++ b/src/server/include/query_engine/parser/value.h @@ -39,6 +39,7 @@ class Value explicit Value(float val); explicit Value(bool val); explicit Value(const char *s, int len = 0); + explicit Value(const char *s, int len, bool force); explicit Value(AttrType attrType); Value(const Value &other) = default; diff --git a/src/server/query_engine/parser/value.cpp b/src/server/query_engine/parser/value.cpp index 43e4e9a..14a6cc6 100644 --- a/src/server/query_engine/parser/value.cpp +++ b/src/server/query_engine/parser/value.cpp @@ -43,6 +43,33 @@ Value::Value(const char *s, int len /*= 0*/) { set_string(s, len); } + +/** + * force mean Force Copy from s +*/ +Value::Value(const char *s, int len, bool force) +{ + if(!force) { + set_string(s, len); + } else { + //为规避0带来的截断问题,我们先将其均置为1,并记录其位置以将其复原 + char *data_tmp = new char[len]; + std::vector places_of_zeros; + for(int i = 0; i < len; i++) { + data_tmp[i] = s[i]; + if(s[i] == 0) { + places_of_zeros.push_back(i); + data_tmp[i] = 1; + } + } + set_string(data_tmp, len); + //复原 + for(int i = 0; i < places_of_zeros.size(); i++) { + str_value_[places_of_zeros[i]] = 0; + } + delete[] data_tmp; + } +} Value::Value(AttrType attrType) { switch (attrType) { From db6727ec1d644026f499bd0d7cac7928e4446eac Mon Sep 17 00:00:00 2001 From: KarryMorphy <93188900+stackByStack@users.noreply.github.com> Date: Mon, 15 Apr 2024 02:39:39 +0000 Subject: [PATCH 3/3] fix: find_index_by_field supports searching multi-field index --- src/server/storage_engine/recorder/table_meta.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/server/storage_engine/recorder/table_meta.cpp b/src/server/storage_engine/recorder/table_meta.cpp index cd994a5..88a7fef 100644 --- a/src/server/storage_engine/recorder/table_meta.cpp +++ b/src/server/storage_engine/recorder/table_meta.cpp @@ -224,7 +224,10 @@ const IndexMeta *TableMeta::index(const char *name) const const IndexMeta *TableMeta::find_index_by_field(const char *field) const { for (const IndexMeta &index : indexes_) { - if (0 == strcmp(index.field(0), field)) { + // if (0 == strcmp(index.field(0), field)) { + // return &index; + // } + if (0 == strcmp(index.multi_fields(), field)) { return &index; } }