Skip to content

Commit 5f71cfb

Browse files
authored
Allow to choose normal or aggreation PG function (#11152)
1 parent ece8202 commit 5f71cfb

File tree

10 files changed

+191
-2
lines changed

10 files changed

+191
-2
lines changed

ydb/library/yql/parser/pg_catalog/catalog.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2362,6 +2362,24 @@ void EnumProc(std::function<void(ui32, const TProcDesc&)> f) {
23622362
}
23632363
}
23642364

2365+
bool HasProc(const TString& name, EProcKind kind) {
2366+
const auto& catalog = TCatalog::Instance();
2367+
auto procIdPtr = catalog.State->ProcByName.FindPtr(to_lower(name));
2368+
if (!procIdPtr) {
2369+
return false;
2370+
}
2371+
2372+
for (const auto& id : *procIdPtr) {
2373+
const auto& d = catalog.State->Procs.FindPtr(id);
2374+
Y_ENSURE(d);
2375+
if (d->Kind == kind) {
2376+
return true;
2377+
}
2378+
}
2379+
2380+
return false;
2381+
}
2382+
23652383
bool HasReturnSetProc(const TString& name) {
23662384
const auto& catalog = TCatalog::Instance();
23672385
auto procIdPtr = catalog.State->ProcByName.FindPtr(to_lower(name));

ydb/library/yql/parser/pg_catalog/catalog.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ const TProcDesc& LookupProc(ui32 procId);
283283
std::variant<const TProcDesc*, const TTypeDesc*> LookupProcWithCasts(const TString& name, const TVector<ui32>& argTypeIds);
284284
bool HasReturnSetProc(const TString& name);
285285
void EnumProc(std::function<void(ui32, const TProcDesc&)> f);
286+
bool HasProc(const TString& name, EProcKind kind);
286287

287288
bool HasType(const TString& name);
288289
bool HasType(ui32 typeId);

ydb/library/yql/parser/pg_catalog/safe_procs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
"postgis_lib_version",
4242
"st_interiorringn",
4343
"st_collectionhomogenize",
44+
"st_makeline",
4445

4546
//dbeaver
4647
"pg_get_expr",

ydb/library/yql/sql/v1/builtin.cpp

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3422,15 +3422,39 @@ TNodePtr BuildBuiltinFunc(TContext& ctx, TPosition pos, TString name, const TVec
34223422
}
34233423
} else if (ns == "datetime2" && (name == "Parse")) {
34243424
return BuildUdf(ctx, pos, nameSpace, name, args);
3425-
} else if (ns == "pg") {
3426-
const bool isAggregateFunc = NYql::NPg::HasAggregation(name, NYql::NPg::EAggKind::Normal);
3425+
} else if (ns == "pg" || ns == "pgagg" || ns == "pgproc") {
3426+
bool isAggregateFunc = NYql::NPg::HasAggregation(name, NYql::NPg::EAggKind::Normal);
3427+
bool isNormalFunc = NYql::NPg::HasProc(name, NYql::NPg::EProcKind::Function);
3428+
if (!isAggregateFunc && !isNormalFunc) {
3429+
return new TInvalidBuiltin(pos, TStringBuilder() << "Unknown function: " << name);
3430+
}
3431+
3432+
if (isAggregateFunc && isNormalFunc) {
3433+
if (ns == "pg") {
3434+
return new TInvalidBuiltin(pos, TStringBuilder() << "Ambigious function: " << name << ", use either PgAgg:: or PgProc:: namespace");
3435+
} else if (ns == "pgagg") {
3436+
isNormalFunc = false;
3437+
} else {
3438+
isAggregateFunc = false;
3439+
}
3440+
}
3441+
3442+
if (isAggregateFunc && ns == "pgproc") {
3443+
return new TInvalidBuiltin(pos, TStringBuilder() << "Invalid namespace for aggregation function: " << name << ", use either Pg:: or PgAgg:: namespace");
3444+
}
3445+
3446+
if (isNormalFunc && ns == "pgagg") {
3447+
return new TInvalidBuiltin(pos, TStringBuilder() << "Invalid namespace for normal function: " << name << ", use either Pg:: or PgProc:: namespace");
3448+
}
3449+
34273450
if (isAggregateFunc) {
34283451
if (aggMode == EAggregateMode::Distinct) {
34293452
return new TInvalidBuiltin(pos, "Distinct is not supported yet for PG aggregation ");
34303453
}
34313454

34323455
return BuildAggrFuncFactoryCallback(name, "", EAggrFuncTypeCallback::PG)(pos, args, aggMode, false);
34333456
} else {
3457+
YQL_ENSURE(isNormalFunc);
34343458
TVector<TNodePtr> pgCallArgs;
34353459
pgCallArgs.push_back(BuildLiteralRawString(pos, name));
34363460
pgCallArgs.insert(pgCallArgs.end(), args.begin(), args.end());

ydb/library/yql/tests/sql/dq_file/part2/canondata/result.json

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2081,6 +2081,50 @@
20812081
}
20822082
],
20832083
"test.test[pg-join_using_multiple2--Results]": [],
2084+
"test.test[pg-pgns_agg-default.txt-Analyze]": [
2085+
{
2086+
"checksum": "b4dd508a329723c74293d80f0278c705",
2087+
"size": 505,
2088+
"uri": "https://{canondata_backend}/1871002/e16c2456d2585dc5260dae8153efad865802ebff/resource.tar.gz#test.test_pg-pgns_agg-default.txt-Analyze_/plan.txt"
2089+
}
2090+
],
2091+
"test.test[pg-pgns_agg-default.txt-Debug]": [
2092+
{
2093+
"checksum": "c62f85fabe40a18829587ccbbdbaee91",
2094+
"size": 446,
2095+
"uri": "https://{canondata_backend}/1871002/e16c2456d2585dc5260dae8153efad865802ebff/resource.tar.gz#test.test_pg-pgns_agg-default.txt-Debug_/opt.yql_patched"
2096+
}
2097+
],
2098+
"test.test[pg-pgns_agg-default.txt-Plan]": [
2099+
{
2100+
"checksum": "b4dd508a329723c74293d80f0278c705",
2101+
"size": 505,
2102+
"uri": "https://{canondata_backend}/1871002/e16c2456d2585dc5260dae8153efad865802ebff/resource.tar.gz#test.test_pg-pgns_agg-default.txt-Plan_/plan.txt"
2103+
}
2104+
],
2105+
"test.test[pg-pgns_agg-default.txt-Results]": [],
2106+
"test.test[pg-pgns_proc-default.txt-Analyze]": [
2107+
{
2108+
"checksum": "b4dd508a329723c74293d80f0278c705",
2109+
"size": 505,
2110+
"uri": "https://{canondata_backend}/1871002/e16c2456d2585dc5260dae8153efad865802ebff/resource.tar.gz#test.test_pg-pgns_proc-default.txt-Analyze_/plan.txt"
2111+
}
2112+
],
2113+
"test.test[pg-pgns_proc-default.txt-Debug]": [
2114+
{
2115+
"checksum": "2fcd7306a350cf965b03048751c38368",
2116+
"size": 344,
2117+
"uri": "https://{canondata_backend}/1871002/e16c2456d2585dc5260dae8153efad865802ebff/resource.tar.gz#test.test_pg-pgns_proc-default.txt-Debug_/opt.yql_patched"
2118+
}
2119+
],
2120+
"test.test[pg-pgns_proc-default.txt-Plan]": [
2121+
{
2122+
"checksum": "b4dd508a329723c74293d80f0278c705",
2123+
"size": 505,
2124+
"uri": "https://{canondata_backend}/1871002/e16c2456d2585dc5260dae8153efad865802ebff/resource.tar.gz#test.test_pg-pgns_proc-default.txt-Plan_/plan.txt"
2125+
}
2126+
],
2127+
"test.test[pg-pgns_proc-default.txt-Results]": [],
20842128
"test.test[pg-select_agg-default.txt-Analyze]": [
20852129
{
20862130
"checksum": "b4dd508a329723c74293d80f0278c705",

ydb/library/yql/tests/sql/hybrid_file/part0/canondata/result.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1889,6 +1889,34 @@
18891889
"uri": "https://{canondata_backend}/1936947/581aa6d896ffe57e25bdb8006459e912860e61fa/resource.tar.gz#test.test_pg-pg_in_expr-default.txt-Plan_/plan.txt"
18901890
}
18911891
],
1892+
"test.test[pg-pgns_agg-default.txt-Debug]": [
1893+
{
1894+
"checksum": "7c56fcc35df8e04017352ad60d1ca319",
1895+
"size": 445,
1896+
"uri": "https://{canondata_backend}/1942525/5034185140ffa064b6ff5f40aec4f177acd3c5a1/resource.tar.gz#test.test_pg-pgns_agg-default.txt-Debug_/opt.yql_patched"
1897+
}
1898+
],
1899+
"test.test[pg-pgns_agg-default.txt-Plan]": [
1900+
{
1901+
"checksum": "b4dd508a329723c74293d80f0278c705",
1902+
"size": 505,
1903+
"uri": "https://{canondata_backend}/1942525/5034185140ffa064b6ff5f40aec4f177acd3c5a1/resource.tar.gz#test.test_pg-pgns_agg-default.txt-Plan_/plan.txt"
1904+
}
1905+
],
1906+
"test.test[pg-pgns_proc-default.txt-Debug]": [
1907+
{
1908+
"checksum": "8a265371cc480c231744f2eb58cebd6a",
1909+
"size": 343,
1910+
"uri": "https://{canondata_backend}/1942525/5034185140ffa064b6ff5f40aec4f177acd3c5a1/resource.tar.gz#test.test_pg-pgns_proc-default.txt-Debug_/opt.yql_patched"
1911+
}
1912+
],
1913+
"test.test[pg-pgns_proc-default.txt-Plan]": [
1914+
{
1915+
"checksum": "b4dd508a329723c74293d80f0278c705",
1916+
"size": 505,
1917+
"uri": "https://{canondata_backend}/1942525/5034185140ffa064b6ff5f40aec4f177acd3c5a1/resource.tar.gz#test.test_pg-pgns_proc-default.txt-Plan_/plan.txt"
1918+
}
1919+
],
18921920
"test.test[pg-select_agg_expr_order-default.txt-Debug]": [
18931921
{
18941922
"checksum": "dd4cae1f250ec04efe611cc4e2f7e505",

ydb/library/yql/tests/sql/sql2yql/canondata/result.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12942,6 +12942,20 @@
1294212942
"uri": "https://{canondata_backend}/1881367/79a71c1478c556da1931a7565c12bdd14cc63567/resource.tar.gz#test_sql2yql.test_pg-pg_view_/sql.yql"
1294312943
}
1294412944
],
12945+
"test_sql2yql.test[pg-pgns_agg]": [
12946+
{
12947+
"checksum": "d8084a6545a07f42528921be288eb18a",
12948+
"size": 1622,
12949+
"uri": "https://{canondata_backend}/1942278/f9767af57fb40678ebac7071b53e03ed182ae745/resource.tar.gz#test_sql2yql.test_pg-pgns_agg_/sql.yql"
12950+
}
12951+
],
12952+
"test_sql2yql.test[pg-pgns_proc]": [
12953+
{
12954+
"checksum": "8c7e5172b26cd5d3be6d582c0f8d9ab0",
12955+
"size": 1014,
12956+
"uri": "https://{canondata_backend}/1942278/f9767af57fb40678ebac7071b53e03ed182ae745/resource.tar.gz#test_sql2yql.test_pg-pgns_proc_/sql.yql"
12957+
}
12958+
],
1294512959
"test_sql2yql.test[pg-point]": [
1294612960
{
1294712961
"checksum": "eb9eb97cbb091b3417869b7e742edaa5",
@@ -32115,6 +32129,20 @@
3211532129
"uri": "https://{canondata_backend}/1880306/64654158d6bfb1289c66c626a8162239289559d0/resource.tar.gz#test_sql_format.test_pg-pg_types_literal_with_length_/formatted.sql"
3211632130
}
3211732131
],
32132+
"test_sql_format.test[pg-pgns_agg]": [
32133+
{
32134+
"checksum": "76c561d4b5ced5a600630822124835a2",
32135+
"size": 57,
32136+
"uri": "https://{canondata_backend}/1942278/f9767af57fb40678ebac7071b53e03ed182ae745/resource.tar.gz#test_sql_format.test_pg-pgns_agg_/formatted.sql"
32137+
}
32138+
],
32139+
"test_sql_format.test[pg-pgns_proc]": [
32140+
{
32141+
"checksum": "24413a1cdf3177e0adea1760335ec372",
32142+
"size": 32,
32143+
"uri": "https://{canondata_backend}/1942278/f9767af57fb40678ebac7071b53e03ed182ae745/resource.tar.gz#test_sql_format.test_pg-pgns_proc_/formatted.sql"
32144+
}
32145+
],
3211832146
"test_sql_format.test[pg-reflection]": [
3211932147
{
3212032148
"checksum": "65481055414382285e38644c195cc090",
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
select PgAgg::count() from (select 1);
2+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
select PgProc::upper('a'u);

ydb/library/yql/tests/sql/yt_native_file/part2/canondata/result.json

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1847,6 +1847,48 @@
18471847
"uri": "https://{canondata_backend}/1946324/7d1d6b1f697cbe9fb62c81047eb61d3fa72baf62/resource.tar.gz#test.test_pg-join_using_multiple2--Results_/results.txt"
18481848
}
18491849
],
1850+
"test.test[pg-pgns_agg-default.txt-Debug]": [
1851+
{
1852+
"checksum": "1a4923d66dd787df594ce62653e213a9",
1853+
"size": 378,
1854+
"uri": "https://{canondata_backend}/1942525/526b4d04c2d9ca7b67c4128634cdf050f1482988/resource.tar.gz#test.test_pg-pgns_agg-default.txt-Debug_/opt.yql"
1855+
}
1856+
],
1857+
"test.test[pg-pgns_agg-default.txt-Plan]": [
1858+
{
1859+
"checksum": "b4dd508a329723c74293d80f0278c705",
1860+
"size": 505,
1861+
"uri": "https://{canondata_backend}/1942525/526b4d04c2d9ca7b67c4128634cdf050f1482988/resource.tar.gz#test.test_pg-pgns_agg-default.txt-Plan_/plan.txt"
1862+
}
1863+
],
1864+
"test.test[pg-pgns_agg-default.txt-Results]": [
1865+
{
1866+
"checksum": "6a00eb838183e16098feefe4a7d81bed",
1867+
"size": 733,
1868+
"uri": "https://{canondata_backend}/1942525/526b4d04c2d9ca7b67c4128634cdf050f1482988/resource.tar.gz#test.test_pg-pgns_agg-default.txt-Results_/results.txt"
1869+
}
1870+
],
1871+
"test.test[pg-pgns_proc-default.txt-Debug]": [
1872+
{
1873+
"checksum": "af182fe1c8fc87eeb63c9a584dcaf30a",
1874+
"size": 276,
1875+
"uri": "https://{canondata_backend}/1942525/526b4d04c2d9ca7b67c4128634cdf050f1482988/resource.tar.gz#test.test_pg-pgns_proc-default.txt-Debug_/opt.yql"
1876+
}
1877+
],
1878+
"test.test[pg-pgns_proc-default.txt-Plan]": [
1879+
{
1880+
"checksum": "b4dd508a329723c74293d80f0278c705",
1881+
"size": 505,
1882+
"uri": "https://{canondata_backend}/1942525/526b4d04c2d9ca7b67c4128634cdf050f1482988/resource.tar.gz#test.test_pg-pgns_proc-default.txt-Plan_/plan.txt"
1883+
}
1884+
],
1885+
"test.test[pg-pgns_proc-default.txt-Results]": [
1886+
{
1887+
"checksum": "deb8e87729873be62e40545c9b57a906",
1888+
"size": 733,
1889+
"uri": "https://{canondata_backend}/1942525/526b4d04c2d9ca7b67c4128634cdf050f1482988/resource.tar.gz#test.test_pg-pgns_proc-default.txt-Results_/results.txt"
1890+
}
1891+
],
18501892
"test.test[pg-select_agg-default.txt-Debug]": [
18511893
{
18521894
"checksum": "b9d62afa0b411dfbe3a9e7d76f997c60",

0 commit comments

Comments
 (0)