Skip to content

Commit 64b4e8e

Browse files
authored
fix order by index scan rule (#662)
* fix order by index scan rule Signed-off-by: Alex Chi <[email protected]> * update custom rules Signed-off-by: Alex Chi <[email protected]> --------- Signed-off-by: Alex Chi <[email protected]>
1 parent bd47080 commit 64b4e8e

File tree

3 files changed

+8
-14
lines changed

3 files changed

+8
-14
lines changed

src/include/catalog/catalog.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#pragma once
1414

15+
#include <exception>
1516
#include <memory>
1617
#include <string>
1718
#include <unordered_map>
@@ -249,6 +250,7 @@ class Catalog {
249250
auto *table_meta = GetTable(table_name);
250251
for (auto iter = table_meta->table_->MakeIterator(); !iter.IsEnd(); ++iter) {
251252
auto [meta, tuple] = iter.GetTuple();
253+
// we have to silently ignore the error here for a lot of reasons...
252254
index->InsertEntry(tuple.KeyFromTuple(schema, key_schema, key_attrs), tuple.GetRid(), txn);
253255
}
254256

src/optimizer/optimizer_custom_rules.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ auto Optimizer::OptimizeCustom(const AbstractPlanNodeRef &plan) -> AbstractPlanN
1414
p = OptimizeNLJAsHashJoin(p);
1515
p = OptimizeOrderByAsIndexScan(p);
1616
p = OptimizeSortLimitAsTopN(p);
17+
p = OptimizeMergeFilterScan(p);
18+
p = OptimizeSeqScanAsIndexScan(p);
1719
return p;
1820
}
1921

src/optimizer/order_by_index_scan.cpp

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,10 @@ auto Optimizer::OptimizeOrderByAsIndexScan(const AbstractPlanNodeRef &plan) -> A
5858
const auto indices = catalog_.GetTableIndexes(table_info->name_);
5959

6060
for (const auto *index : indices) {
61-
const auto &columns = index->key_schema_.GetColumns();
62-
// check index key schema == order by columns
63-
bool valid = true;
64-
if (columns.size() == order_by_column_ids.size()) {
65-
for (size_t i = 0; i < columns.size(); i++) {
66-
if (columns[i].GetName() != table_info->schema_.GetColumn(order_by_column_ids[i]).GetName()) {
67-
valid = false;
68-
break;
69-
}
70-
}
71-
if (valid) {
72-
return std::make_shared<IndexScanPlanNode>(optimized_plan->output_schema_, table_info->oid_,
73-
index->index_oid_);
74-
}
61+
const auto &columns = index->index_->GetKeyAttrs();
62+
if (order_by_column_ids == columns) {
63+
return std::make_shared<IndexScanPlanNode>(optimized_plan->output_schema_, table_info->oid_,
64+
index->index_oid_);
7565
}
7666
}
7767
}

0 commit comments

Comments
 (0)