Skip to content
This repository was archived by the owner on Sep 27, 2019. It is now read-only.

Commit f16f6f9

Browse files
committed
Support subquery in having clause with correlated predicate
1 parent 7066b8c commit f16f6f9

File tree

9 files changed

+199
-114
lines changed

9 files changed

+199
-114
lines changed

src/include/optimizer/operators.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,9 @@ class LogicalAggregateAndGroupBy
226226
public:
227227
static Operator make();
228228

229+
static Operator make(
230+
std::vector<std::shared_ptr<expression::AbstractExpression>> &columns);
231+
229232
static Operator make(
230233
std::vector<std::shared_ptr<expression::AbstractExpression>> &columns,
231234
std::vector<AnnotatedExpression> &having);

src/include/optimizer/query_to_operator_transformer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ class QueryToOperatorTransformer : public SqlNodeVisitor {
8181
*
8282
* @param expr The original predicate
8383
*/
84-
void CollectPredicates(expression::AbstractExpression *expr);
84+
std::vector<AnnotatedExpression> CollectPredicates(
85+
expression::AbstractExpression *expr,
86+
std::vector<AnnotatedExpression> predicates = {});
8587

8688
// TODO(boweic): Since we haven't migrated all the functionalities needed to
8789
// generate mark-join and single-join to the optimizer, currently this

src/include/optimizer/util.h

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -33,73 +33,80 @@ class DataTable;
3333
namespace optimizer {
3434
namespace util {
3535

36-
inline void to_lower_string(std::string& str) {
36+
inline void to_lower_string(std::string &str) {
3737
std::transform(str.begin(), str.end(), str.begin(), ::tolower);
3838
}
3939

4040
template <class T>
41-
bool IsSubset(const std::unordered_set<T>& super_set,
42-
const std::unordered_set<T>& child_set) {
41+
bool IsSubset(const std::unordered_set<T> &super_set,
42+
const std::unordered_set<T> &child_set) {
4343
for (auto element : child_set) {
4444
if (super_set.find(element) == super_set.end()) return false;
4545
}
4646
return true;
4747
}
4848

4949
template <class T>
50-
void SetUnion(std::unordered_set<T>& new_set, std::unordered_set<T>& old_set) {
50+
void SetUnion(std::unordered_set<T> &new_set, std::unordered_set<T> &old_set) {
5151
for (auto element : old_set) new_set.insert(element);
5252
}
5353

5454
// get the column IDs evaluated in a predicate
55-
void GetPredicateColumns(const catalog::Schema* schema,
56-
expression::AbstractExpression* expression,
57-
std::vector<oid_t>& column_ids,
58-
std::vector<ExpressionType>& expr_types,
59-
std::vector<type::Value>& values,
60-
bool& index_searchable);
61-
62-
bool CheckIndexSearchable(storage::DataTable* target_table,
63-
expression::AbstractExpression* expression,
64-
std::vector<oid_t>& key_column_ids,
65-
std::vector<ExpressionType>& expr_types,
66-
std::vector<type::Value>& values, oid_t& index_id);
67-
68-
void SplitPredicates(expression::AbstractExpression* expr,
69-
std::vector<expression::AbstractExpression*>& predicates);
70-
71-
expression::AbstractExpression* CombinePredicates(
55+
void GetPredicateColumns(const catalog::Schema *schema,
56+
expression::AbstractExpression *expression,
57+
std::vector<oid_t> &column_ids,
58+
std::vector<ExpressionType> &expr_types,
59+
std::vector<type::Value> &values,
60+
bool &index_searchable);
61+
62+
bool CheckIndexSearchable(storage::DataTable *target_table,
63+
expression::AbstractExpression *expression,
64+
std::vector<oid_t> &key_column_ids,
65+
std::vector<ExpressionType> &expr_types,
66+
std::vector<type::Value> &values, oid_t &index_id);
67+
68+
void SplitPredicates(expression::AbstractExpression *expr,
69+
std::vector<expression::AbstractExpression *> &predicates);
70+
71+
expression::AbstractExpression *CombinePredicates(
7272
std::vector<std::shared_ptr<expression::AbstractExpression>> predicates);
7373

74-
expression::AbstractExpression* CombinePredicates(
74+
expression::AbstractExpression *CombinePredicates(
7575
std::vector<AnnotatedExpression> predicates);
7676

77-
void ExtractPredicates(expression::AbstractExpression* expr,
78-
std::vector<AnnotatedExpression>& annotated_predicates);
77+
std::vector<AnnotatedExpression> ExtractPredicates(
78+
expression::AbstractExpression *expr,
79+
std::vector<AnnotatedExpression> annotated_predicates = {});
7980

80-
expression::AbstractExpression* ConstructJoinPredicate(
81-
std::unordered_set<std::string>& table_alias_set,
82-
MultiTablePredicates& join_predicates);
81+
expression::AbstractExpression *ConstructJoinPredicate(
82+
std::unordered_set<std::string> &table_alias_set,
83+
MultiTablePredicates &join_predicates);
8384

84-
bool ContainsJoinColumns(const std::unordered_set<std::string>& l_group_alias,
85-
const std::unordered_set<std::string>& r_group_alias,
86-
const expression::AbstractExpression* expr);
85+
bool ContainsJoinColumns(const std::unordered_set<std::string> &l_group_alias,
86+
const std::unordered_set<std::string> &r_group_alias,
87+
const expression::AbstractExpression *expr);
8788

8889
std::unique_ptr<planner::AbstractPlan> CreateCopyPlan(
89-
parser::CopyStatement* copy_stmt);
90+
parser::CopyStatement *copy_stmt);
9091

9192
std::unordered_map<std::string, std::shared_ptr<expression::AbstractExpression>>
92-
ConstructSelectElementMap(std::vector<std::unique_ptr<expression::AbstractExpression>> &select_list);
93-
94-
expression::AbstractExpression*
95-
TransformQueryDerivedTablePredicates(const std::unordered_map<std::string, std::shared_ptr<expression::AbstractExpression>>& alias_to_expr_map,
96-
expression::AbstractExpression* expr);
97-
98-
// Extract equi-join keys from the join predicates (conjunction is already removed in each unit)
99-
void ExtractEquiJoinKeys(const std::vector<AnnotatedExpression> join_predicates,
100-
std::vector<std::unique_ptr<expression::AbstractExpression>>& left_keys,
101-
std::vector<std::unique_ptr<expression::AbstractExpression>>& right_keys,
102-
const std::unordered_set<std::string>& left_alias, const std::unordered_set<std::string>& right_alias);
93+
ConstructSelectElementMap(
94+
std::vector<std::unique_ptr<expression::AbstractExpression>> &select_list);
95+
96+
expression::AbstractExpression *TransformQueryDerivedTablePredicates(
97+
const std::unordered_map<std::string,
98+
std::shared_ptr<expression::AbstractExpression>>
99+
&alias_to_expr_map,
100+
expression::AbstractExpression *expr);
101+
102+
// Extract equi-join keys from the join predicates (conjunction is already
103+
// removed in each unit)
104+
void ExtractEquiJoinKeys(
105+
const std::vector<AnnotatedExpression> join_predicates,
106+
std::vector<std::unique_ptr<expression::AbstractExpression>> &left_keys,
107+
std::vector<std::unique_ptr<expression::AbstractExpression>> &right_keys,
108+
const std::unordered_set<std::string> &left_alias,
109+
const std::unordered_set<std::string> &right_alias);
103110

104111
} // namespace util
105112
} // namespace optimizer

src/optimizer/input_column_deriver.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ void InputColumnDeriver::JoinHelper(const BaseOperatorNode *op) {
275275
}
276276
ExprMap output_cols_map;
277277
for (auto expr : required_cols_) {
278-
expression::ExpressionUtil::GetTupleValueExprs(output_cols_map, expr);
278+
expression::ExpressionUtil::GetTupleAndAggregateExprs(output_cols_map, expr);
279279
}
280280
for (auto &expr_idx_pair : output_cols_map) {
281281
input_cols_set.insert(expr_idx_pair.first);

0 commit comments

Comments
 (0)