提交 0965fcf3 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Add support of PostgreSQL-style MODE()

上级 448567f1
......@@ -3417,8 +3417,8 @@ MEDIAN(X)
"
"Functions (Aggregate)","MODE","
MODE( value )
[ ORDER BY { expression [ ASC | DESC ] } ]
{ MODE( value ) [ ORDER BY expression [ ASC | DESC ] ] }
| { MODE() WITHIN GROUP(ORDER BY expression [ ASC | DESC ]) }
[ FILTER ( WHERE expression ) ]
","
Returns the value that occurs with the greatest frequency.
......@@ -3434,6 +3434,7 @@ Aggregates are only allowed in select statements.
","
MODE(X)
MODE(X ORDER BY X)
MODE() WITHIN GROUP(ORDER BY X)
"
"Functions (Numeric)","ABS","
......
......@@ -2968,26 +2968,32 @@ public class Parser {
break;
}
case MODE: {
Expression expr = readExpression();
r = new Aggregate(aggregateType, expr, currentSelect, false);
if (readIf(ORDER)) {
if (readIf(CLOSE_PAREN)) {
read("WITHIN");
read(GROUP);
read(OPEN_PAREN);
read(ORDER);
read("BY");
Expression expr2 = readExpression();
String sql = expr.getSQL();
if (!sql.equals(expr2.getSQL())) {
parseIndex = lastParseIndex;
if (expectedList != null) {
expectedList.clear();
expectedList.add(sql);
Expression expr = readExpression();
r = new Aggregate(AggregateType.MODE, expr, currentSelect, false);
setModeAggOrder(r, expr);
} else {
Expression expr = readExpression();
r = new Aggregate(aggregateType, expr, currentSelect, false);
if (readIf(ORDER)) {
read("BY");
Expression expr2 = readExpression();
String sql = expr.getSQL();
if (!sql.equals(expr2.getSQL())) {
parseIndex = lastParseIndex;
if (expectedList != null) {
expectedList.clear();
expectedList.add(sql);
}
throw getSyntaxError();
}
throw getSyntaxError();
setModeAggOrder(r, expr);
}
ArrayList<SelectOrderBy> orderList = new ArrayList<>(1);
SelectOrderBy order = new SelectOrderBy();
order.expression = expr;
order.sortType = parseSimpleSortType();
orderList.add(order);
r.setOrderByList(orderList);
}
break;
}
......@@ -3003,6 +3009,15 @@ public class Parser {
return r;
}
private void setModeAggOrder(Aggregate r, Expression expr) {
ArrayList<SelectOrderBy> orderList = new ArrayList<>(1);
SelectOrderBy order = new SelectOrderBy();
order.expression = expr;
order.sortType = parseSimpleSortType();
orderList.add(order);
r.setOrderByList(orderList);
}
private ArrayList<SelectOrderBy> parseSimpleOrderList() {
ArrayList<SelectOrderBy> orderList = Utils.newSmallArrayList();
do {
......
......@@ -42,5 +42,14 @@ SELECT MODE(V ORDER BY V DESC) FROM TEST;
SELECT MODE(V ORDER BY V + 1) FROM TEST;
> exception SYNTAX_ERROR_2
SELECT MODE() WITHIN GROUP(ORDER BY V) FROM TEST;
>> 1
SELECT MODE() WITHIN GROUP(ORDER BY V ASC) FROM TEST;
>> 1
SELECT MODE() WITHIN GROUP(ORDER BY V DESC) FROM TEST;
>> 3
DROP TABLE TEST;
> ok
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论