提交 0a8c8b08 authored 作者: noelgrandin@gmail.com's avatar noelgrandin@gmail.com

Add support for PostgreSQL STRING_AGG function. Patch by Fred Aquiles.

上级 64040855
......@@ -58,7 +58,8 @@ Change Log
</li><li>Concurrent CREATE TABLE... IF NOT EXISTS in the presence of MULTI_THREAD=TRUE could
throw an exception.
</li><li>Fix bug in MVStore when creating lots of temporary tables, where we could run out of
transaction IDs.
transaction IDs.
</li><li>Add support for PostgreSQL STRING_AGG function. Patch by Fred Aquiles.
</li></ul>
<h2>Version 1.4.186 Beta (2015-03-02)</h2>
......
......@@ -2270,7 +2270,7 @@ public class Parser {
}
}
private Expression readAggregate(int aggregateType) {
private Expression readAggregate(int aggregateType, String aggregateName) {
if (currentSelect == null) {
throw getSyntaxError();
}
......@@ -2293,14 +2293,24 @@ public class Parser {
}
}
} else if (aggregateType == Aggregate.GROUP_CONCAT) {
boolean distinct = readIf("DISTINCT");
Aggregate agg = new Aggregate(Aggregate.GROUP_CONCAT,
Aggregate agg = null;
if (equalsToken("GROUP_CONCAT", aggregateName)) {
boolean distinct = readIf("DISTINCT");
agg = new Aggregate(Aggregate.GROUP_CONCAT,
readExpression(), currentSelect, distinct);
if (readIf("ORDER")) {
read("BY");
agg.setGroupConcatOrder(parseSimpleOrderList());
}
if (readIf("SEPARATOR")) {
if (readIf("ORDER")) {
read("BY");
agg.setGroupConcatOrder(parseSimpleOrderList());
}
if (readIf("SEPARATOR")) {
agg.setGroupConcatSeparator(readExpression());
}
} else if (equalsToken("STRING_AGG", aggregateName)) {
// PostgreSQL compatibility: string_agg(expression, delimiter)
agg = new Aggregate(Aggregate.GROUP_CONCAT,
readExpression(), currentSelect, false);
read(",");
agg.setGroupConcatSeparator(readExpression());
}
r = agg;
......@@ -2382,7 +2392,7 @@ public class Parser {
}
int agg = getAggregateType(name);
if (agg >= 0) {
return readAggregate(agg);
return readAggregate(agg, name);
}
Function function = Function.getFunction(database, name);
if (function == null) {
......
......@@ -163,6 +163,8 @@ public class Aggregate extends Expression {
addAggregate("MAX", MAX);
addAggregate("AVG", AVG);
addAggregate("GROUP_CONCAT", GROUP_CONCAT);
// PostgreSQL compatibility: string_agg(expression, delimiter)
addAggregate("STRING_AGG", GROUP_CONCAT);
addAggregate("STDDEV_SAMP", STDDEV_SAMP);
addAggregate("STDDEV", STDDEV_SAMP);
addAggregate("STDDEV_POP", STDDEV_POP);
......
......@@ -8188,6 +8188,12 @@ SELECT GROUP_CONCAT(ID ORDER BY ID) FROM TEST;
> 1,2,3,4,5,6,7,8,9
> rows (ordered): 1
SELECT STRING_AGG(ID,';') FROM TEST;
> GROUP_CONCAT(ID SEPARATOR ';')
> ------------------------------
> 1;2;3;4;5;6;7;8;9
> rows: 1
SELECT DISTINCT NAME FROM TEST;
> NAME
> --------
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论