[Fix](Planner) fix parse error of view with group_concat order by (#22196)
Problem:
When create view with projection group_concat(xxx, xxx order by orderkey). It will failed during second parse of inline view
For example:
it works when doing
"SELECT id, group_concat(`name`, "," ORDER BY id) AS test_group_column FROM test GROUP BY id"
but when create view it does not work
"create view test_view as SELECT id, group_concat(`name`, "," ORDER BY id) AS test_group_column FROM test GROUP BY id"
Reason:
when creating view, we will doing parse again of view.toSql() to check whether it has some syntax error. And when doing toSql() to group_concat with order by, it add seperate ', ' between second parameter and order by. So when parsing again, it
would failed because it is different semantic with original statement.
group_concat(`name`, "," ORDER BY id) ==> group_concat(`name`, "," , ORDER BY id)
Solved:
Change toSql of group_concat and add order by statement analyze() of group_concat in Planner cause it would work if we get order by from view statement and do not analyze and binding slot reference to it
This commit is contained in:
@ -547,7 +547,12 @@ public class FunctionCallExpr extends Expr {
|
||||
|
||||
for (int i = 0; i < len; ++i) {
|
||||
if (i != 0) {
|
||||
sb.append(", ");
|
||||
if (fnName.getFunction().equalsIgnoreCase("group_concat")
|
||||
&& orderByElements.size() > 0 && i == len - orderByElements.size()) {
|
||||
sb.append(" ");
|
||||
} else {
|
||||
sb.append(", ");
|
||||
}
|
||||
}
|
||||
if (ConnectContext.get() != null && ConnectContext.get().getState().isQuery() && i == 1
|
||||
&& (fnName.getFunction().equalsIgnoreCase("aes_decrypt")
|
||||
@ -1785,6 +1790,11 @@ public class FunctionCallExpr extends Expr {
|
||||
}
|
||||
// rewrite return type if is nested type function
|
||||
analyzeNestedFunction();
|
||||
for (OrderByElement o : orderByElements) {
|
||||
if (!o.getExpr().isAnalyzed) {
|
||||
o.getExpr().analyzeImpl(analyzer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if return type is nested type, need to be determined the sub-element type
|
||||
|
||||
@ -59,3 +59,7 @@ false
|
||||
1 3,21,2,11,1
|
||||
2 23,222,22,211,21
|
||||
|
||||
-- !select_group_concat_order_by_desc4 --
|
||||
1 3,21,2,11,1
|
||||
2 23,222,22,211,21
|
||||
|
||||
|
||||
@ -63,6 +63,9 @@ false
|
||||
1 3,21,2,11,1
|
||||
2 23,222,22,211,21
|
||||
|
||||
-- !select_group_concat_order_by --
|
||||
-- !select_group_concat_order_by1 --
|
||||
1,11,2,21,21,211,22,222,23,3 3,23,222,22,211,21,21,2,11,1
|
||||
|
||||
-- !select_group_concat_order_by2 --
|
||||
1,11,2,21,21,211,22,222,23,3 3,23,222,22,211,21,21,2,11,1
|
||||
|
||||
|
||||
@ -113,4 +113,10 @@ suite("test_group_concat") {
|
||||
qt_select_group_concat_order_by_desc3 """
|
||||
SELECT b1, group_concat(cast(abs(b3) as varchar) order by abs(b2) desc, b3 desc) FROM table_group_concat group by b1 order by b1
|
||||
"""
|
||||
|
||||
sql """create view if not exists test_view as SELECT b1, group_concat(cast(abs(b3) as varchar) order by abs(b2) desc, b3 desc) FROM table_group_concat group by b1 order by b1;"""
|
||||
qt_select_group_concat_order_by_desc4 """
|
||||
select * from test_view;
|
||||
"""
|
||||
sql """drop view if exists test_view"""
|
||||
}
|
||||
|
||||
@ -119,8 +119,13 @@ suite("test_group_concat") {
|
||||
qt_select_group_concat_order_by_desc3 """
|
||||
SELECT b1, group_concat(cast(abs(b3) as varchar) order by abs(b2) desc, b3 desc) FROM table_group_concat group by b1 order by b1
|
||||
"""
|
||||
qt_select_group_concat_order_by """
|
||||
qt_select_group_concat_order_by1 """
|
||||
select group_concat(b3,',' order by b3 asc),group_concat(b3,',' order by b3 desc) from table_group_concat;
|
||||
"""
|
||||
|
||||
sql """create view if not exists test_view as select group_concat(b3,',' order by b3 asc),group_concat(b3,',' order by b3 desc) from table_group_concat;"""
|
||||
qt_select_group_concat_order_by2 """
|
||||
select * from test_view;
|
||||
"""
|
||||
sql """drop view if exists test_view"""
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user