summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/builtin.cpp
diff options
context:
space:
mode:
authoraneporada <[email protected]>2024-11-12 20:02:10 +0300
committeraneporada <[email protected]>2024-11-12 20:12:34 +0300
commit10eb11dab8afe0eae39e5d587d57d4f123f3fa9d (patch)
tree118f7e40deb9422875a557dab721dfda74450d72 /yql/essentials/sql/v1/builtin.cpp
parent1620cea68d4380267df949c1a62270c7e961ba89 (diff)
Merge PR #10831, #11068, #11075, #11152
#11152 - Allow to choose normal or aggreation PG function #11075 - Handle invalid base #11068 - Allow more postgis functions #10831 - Views: if exists / if not exists for DDL commit_hash:0ebf35e45ac6de147c9000440ca25237db061d2e
Diffstat (limited to 'yql/essentials/sql/v1/builtin.cpp')
-rw-r--r--yql/essentials/sql/v1/builtin.cpp28
1 files changed, 26 insertions, 2 deletions
diff --git a/yql/essentials/sql/v1/builtin.cpp b/yql/essentials/sql/v1/builtin.cpp
index e066cd846d7..e327c2d2ea6 100644
--- a/yql/essentials/sql/v1/builtin.cpp
+++ b/yql/essentials/sql/v1/builtin.cpp
@@ -3421,8 +3421,31 @@ TNodePtr BuildBuiltinFunc(TContext& ctx, TPosition pos, TString name, const TVec
}
} else if (ns == "datetime2" && (name == "Parse")) {
return BuildUdf(ctx, pos, nameSpace, name, args);
- } else if (ns == "pg") {
- const bool isAggregateFunc = NYql::NPg::HasAggregation(name, NYql::NPg::EAggKind::Normal);
+ } else if (ns == "pg" || ns == "pgagg" || ns == "pgproc") {
+ bool isAggregateFunc = NYql::NPg::HasAggregation(name, NYql::NPg::EAggKind::Normal);
+ bool isNormalFunc = NYql::NPg::HasProc(name, NYql::NPg::EProcKind::Function);
+ if (!isAggregateFunc && !isNormalFunc) {
+ return new TInvalidBuiltin(pos, TStringBuilder() << "Unknown function: " << name);
+ }
+
+ if (isAggregateFunc && isNormalFunc) {
+ if (ns == "pg") {
+ return new TInvalidBuiltin(pos, TStringBuilder() << "Ambigious function: " << name << ", use either PgAgg:: or PgProc:: namespace");
+ } else if (ns == "pgagg") {
+ isNormalFunc = false;
+ } else {
+ isAggregateFunc = false;
+ }
+ }
+
+ if (isAggregateFunc && ns == "pgproc") {
+ return new TInvalidBuiltin(pos, TStringBuilder() << "Invalid namespace for aggregation function: " << name << ", use either Pg:: or PgAgg:: namespace");
+ }
+
+ if (isNormalFunc && ns == "pgagg") {
+ return new TInvalidBuiltin(pos, TStringBuilder() << "Invalid namespace for normal function: " << name << ", use either Pg:: or PgProc:: namespace");
+ }
+
if (isAggregateFunc) {
if (aggMode == EAggregateMode::Distinct) {
return new TInvalidBuiltin(pos, "Distinct is not supported yet for PG aggregation ");
@@ -3430,6 +3453,7 @@ TNodePtr BuildBuiltinFunc(TContext& ctx, TPosition pos, TString name, const TVec
return BuildAggrFuncFactoryCallback(name, "", EAggrFuncTypeCallback::PG)(pos, args, aggMode, false);
} else {
+ YQL_ENSURE(isNormalFunc);
TVector<TNodePtr> pgCallArgs;
pgCallArgs.push_back(BuildLiteralRawString(pos, name));
pgCallArgs.insert(pgCallArgs.end(), args.begin(), args.end());