1#include "duckdb/planner/expression_binder/having_binder.hpp"
2
3#include "duckdb/parser/expression/columnref_expression.hpp"
4#include "duckdb/planner/binder.hpp"
5#include "duckdb/planner/expression_binder/aggregate_binder.hpp"
6#include "duckdb/common/string_util.hpp"
7
8using namespace duckdb;
9using namespace std;
10
11HavingBinder::HavingBinder(Binder &binder, ClientContext &context, BoundSelectNode &node, BoundGroupInformation &info)
12 : SelectBinder(binder, context, node, info) {
13 target_type = SQLType(SQLTypeId::BOOLEAN);
14}
15
16BindResult HavingBinder::BindExpression(ParsedExpression &expr, idx_t depth, bool root_expression) {
17 // check if the expression binds to one of the groups
18 auto group_index = TryBindGroup(expr, depth);
19 if (group_index != INVALID_INDEX) {
20 return BindGroup(expr, depth, group_index);
21 }
22 switch (expr.expression_class) {
23 case ExpressionClass::WINDOW:
24 return BindResult("HAVING clause cannot contain window functions!");
25 case ExpressionClass::COLUMN_REF:
26 return BindResult(
27 StringUtil::Format("column %s must appear in the GROUP BY clause or be used in an aggregate function",
28 expr.ToString().c_str()));
29 default:
30 return ExpressionBinder::BindExpression(expr, depth);
31 }
32}
33