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

Add support of PostgreSQL-style MODE()

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