diff --git a/src/include/execution/plans/index_scan_plan.h b/src/include/execution/plans/index_scan_plan.h index 14121fcfc..f0768facb 100644 --- a/src/include/execution/plans/index_scan_plan.h +++ b/src/include/execution/plans/index_scan_plan.h @@ -14,11 +14,11 @@ #include #include +#include #include "catalog/catalog.h" #include "concurrency/transaction.h" #include "execution/expressions/abstract_expression.h" -#include "execution/expressions/constant_value_expression.h" #include "execution/plans/abstract_plan.h" namespace bustub { @@ -35,12 +35,12 @@ class IndexScanPlanNode : public AbstractPlanNode { * @param pred_key The key for point lookup */ IndexScanPlanNode(SchemaRef output, table_oid_t table_oid, index_oid_t index_oid, - AbstractExpressionRef filter_predicate = nullptr, ConstantValueExpression *pred_key = nullptr) + AbstractExpressionRef filter_predicate = nullptr, std::vector pred_keys = {}) : AbstractPlanNode(std::move(output), {}), table_oid_(table_oid), index_oid_(index_oid), filter_predicate_(std::move(filter_predicate)), - pred_key_(pred_key) {} + pred_keys_(std::move(pred_keys)) {} auto GetType() const -> PlanType override { return PlanType::IndexScan; } @@ -62,10 +62,10 @@ class IndexScanPlanNode : public AbstractPlanNode { AbstractExpressionRef filter_predicate_; /** - * The constant value key to lookup. + * The constant value keys to lookup. * For example when dealing "WHERE v = 1" we could store the constant value 1 here */ - const ConstantValueExpression *pred_key_; + std::vector pred_keys_; // Add anything you want here for index lookup diff --git a/test/sql/p3.05-index-scan.slt b/test/sql/p3.05-index-scan.slt index 402590ce2..67e36d27f 100644 --- a/test/sql/p3.05-index-scan.slt +++ b/test/sql/p3.05-index-scan.slt @@ -45,6 +45,14 @@ select * from t1 where v2 = 40; ---- 2 40 721 +statement ok +explain select * from t1 where v1 = 1 or v1 = 2; + +query rowsort +ensure:index_scan +select * from t1 where v1 = 1 or v1 = 2; +---- +1 50 645 +2 40 721 query select * from t1 where v1 = 1 and v2 = 50; @@ -99,6 +107,12 @@ select * from t1 where v2 = 20; ---- 4 20 445 +query rowsort +ensure:index_scan +select * from t1 where v1 = 7 or 3 = v1; +---- +7 -10 645 +3 30 645 + query +ensure:index_scan select * from t1 where v2 = 40; ---- @@ -151,6 +165,38 @@ select * from t1 where v2 = 0 and v3 = 721; ---- 6 0 721 +query +ensure:seq_scan +select * from t1 where v1 = 7 or 10 = v2; +---- +5 10 445 +7 -10 645 + +query rowsort +ensure:index_scan +select * from t1 where v1 = 7 or v1 = 3 or 5 = v1; +---- +7 -10 645 +3 30 645 +5 10 445 + +query +ensure:index_scan +select * from t1 where v1 = 3 or v1 = 3 or v1 = 3 +---- +3 30 645 + +query +ensure:index_scan +select * from t1 where v1 = 3 or v1 = 5 or v1 = 1 or v1 = 5 +---- +5 10 445 +1 50 645 +3 30 645 + +query +ensure:seq_scan +select * from t1 where v1 = 7 or v1 = 3 or 5 = v1 or 3 = v2; +---- +5 10 445 +3 30 645 +7 -10 645 + # Delete some elements query delete from t1 where v2 = 30;