aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorАлександр Новожилов <mrlolthe1st@ydb.tech>2024-01-17 01:02:41 +0300
committerGitHub <noreply@github.com>2024-01-17 01:02:41 +0300
commit9a1868542085a40049b909a514f659c60c2b7b06 (patch)
tree41dc18a0d38e62df3ae5ebf2d4585b71c5bf08a1
parent30df0c15f47119138f6f500b0e2ccd34101a55b2 (diff)
downloadydb-9a1868542085a40049b909a514f659c60c2b7b06.tar.gz
YQL-16252, YQL-16623: Support search_path (#788)
* YQL-16252, YQL-16623: Support search_path * tests * canon * fixes * fixes * fix * fix * one more test * typo
-rw-r--r--ydb/library/yql/core/pg_settings/guc_settings.cpp29
-rw-r--r--ydb/library/yql/core/pg_settings/guc_settings.h20
-rw-r--r--ydb/library/yql/core/pg_settings/ya.make7
-rw-r--r--ydb/library/yql/sql/pg/pg_sql.cpp124
-rw-r--r--ydb/library/yql/sql/pg/pg_sql_ut.cpp117
-rw-r--r--ydb/library/yql/sql/settings/translation_settings.h4
-rw-r--r--ydb/library/yql/sql/settings/ya.make1
-rw-r--r--ydb/library/yql/tests/sql/dq_file/part15/canondata/result.json22
-rw-r--r--ydb/library/yql/tests/sql/dq_file/part4/canondata/result.json22
-rw-r--r--ydb/library/yql/tests/sql/sql2yql/canondata/result.json14
-rw-r--r--ydb/library/yql/tests/sql/suites/pg_catalog/pg_set_config.sql5
-rw-r--r--ydb/library/yql/tests/sql/suites/pg_catalog/pg_set_config_commit.sql6
-rw-r--r--ydb/library/yql/tests/sql/yt_native_file/part15/canondata/result.json21
-rw-r--r--ydb/library/yql/tests/sql/yt_native_file/part4/canondata/result.json21
-rw-r--r--ydb/library/yql/tools/pgrun/pgrun.cpp19
15 files changed, 420 insertions, 12 deletions
diff --git a/ydb/library/yql/core/pg_settings/guc_settings.cpp b/ydb/library/yql/core/pg_settings/guc_settings.cpp
new file mode 100644
index 0000000000..ed8dd68876
--- /dev/null
+++ b/ydb/library/yql/core/pg_settings/guc_settings.cpp
@@ -0,0 +1,29 @@
+#include "guc_settings.h"
+
+void TGUCSettings::Setup(const std::unordered_map<std::string, std::string>& runtimeSettings) {
+ RollbackSettings_ = runtimeSettings;
+ RollBack();
+}
+
+std::optional<std::string> TGUCSettings::Get(const std::string& key) const {
+ auto it = Settings_.find(key);
+ if (it == Settings_.end()) {
+ return std::nullopt;
+ }
+ return it->second;
+}
+
+void TGUCSettings::Set(const std::string& key, const std::string& val, bool isLocal) {
+ Settings_[key] = val;
+ if (!isLocal) {
+ SessionSettings_[key] = val;
+ }
+}
+
+void TGUCSettings::Commit() {
+ RollbackSettings_ = SessionSettings_;
+}
+
+void TGUCSettings::RollBack() {
+ Settings_ = SessionSettings_ = RollbackSettings_;
+}
diff --git a/ydb/library/yql/core/pg_settings/guc_settings.h b/ydb/library/yql/core/pg_settings/guc_settings.h
new file mode 100644
index 0000000000..e709c7ec7f
--- /dev/null
+++ b/ydb/library/yql/core/pg_settings/guc_settings.h
@@ -0,0 +1,20 @@
+#pragma once
+#include <unordered_map>
+#include <vector>
+#include <string>
+#include <optional>
+#include <memory>
+
+class TGUCSettings {
+public:
+ using TPtr = std::shared_ptr<TGUCSettings>;
+ void Setup(const std::unordered_map<std::string, std::string>& runtimeSettings);
+ std::optional<std::string> Get(const std::string&) const;
+ void Set(const std::string&, const std::string&, bool isLocal = false);
+ void Commit();
+ void RollBack();
+private:
+ std::unordered_map<std::string, std::string> Settings_;
+ std::unordered_map<std::string, std::string> RollbackSettings_;
+ std::unordered_map<std::string, std::string> SessionSettings_;
+};
diff --git a/ydb/library/yql/core/pg_settings/ya.make b/ydb/library/yql/core/pg_settings/ya.make
new file mode 100644
index 0000000000..c749255765
--- /dev/null
+++ b/ydb/library/yql/core/pg_settings/ya.make
@@ -0,0 +1,7 @@
+LIBRARY()
+
+SRCS(
+ guc_settings.cpp
+)
+
+END() \ No newline at end of file
diff --git a/ydb/library/yql/sql/pg/pg_sql.cpp b/ydb/library/yql/sql/pg/pg_sql.cpp
index 808ef71b9b..5e4d328ca0 100644
--- a/ydb/library/yql/sql/pg/pg_sql.cpp
+++ b/ydb/library/yql/sql/pg/pg_sql.cpp
@@ -632,6 +632,54 @@ public:
return QL(QA("values"), QVL(valNames.data(), valNames.size()), VL(valueRows));
}
+ TAstNode* ParseSetConfig(const FuncCall* value) {
+ auto length = ListLength(value->args);
+ if (length != 3) {
+ AddError(TStringBuilder() << "Expected 3 arguments, but got: " << length);
+ return;
+ }
+ auto loc = value->location;
+ VariableSetStmt config;
+ auto arg0 = ListNodeNth(value->args, 0);
+ auto arg1 = ListNodeNth(value->args, 1);
+ auto arg2 = ListNodeNth(value->args, 2);
+ if (NodeTag(arg2) != T_TypeCast) {
+ AddError(TStringBuilder() << "Expected type cast node as is_local arg, but got node with tag");
+ return;
+ }
+ auto isLocalCast = CAST_NODE(TypeCast, arg2)->arg;
+ if (NodeTag(isLocalCast) != T_A_Const) {
+ AddError(TStringBuilder() << "Expected a_const in cast, but got something wrong: " << NodeTag(isLocalCast));
+ return nullptr;
+ }
+ auto isLocalConst = CAST_NODE(A_Const, isLocalCast);
+ if (NodeTag(isLocalConst->val) != T_String) {
+ AddError(TStringBuilder() << "Expected string in const, but got something wrong: " << NodeTag(isLocalCast));
+ return nullptr;
+ }
+ auto rawVal = TString(StrVal(isLocalConst->val));
+ if (rawVal != "t" && rawVal != "f") {
+ AddError(TStringBuilder() << "Expected t/f, but got " << rawVal);
+ return;
+ }
+ config.is_local = rawVal == "t";
+
+ if (NodeTag(arg0) != T_A_Const || NodeTag(arg1) != T_A_Const) {
+ AddError(TStringBuilder() << "Expected const with string, but got something else: " << NodeTag(arg0));
+ return nullptr;
+ }
+
+ auto name = CAST_NODE(A_Const, arg0)->val;
+ auto val = CAST_NODE(A_Const, arg1)->val;
+ if (NodeTag(name) != T_String || NodeTag(val) != T_String) {
+ AddError(TStringBuilder() << "Expected string const as name arg, but got something else: " << NodeTag(name));
+ return;
+ }
+ config.name = (char*)StrVal(name);
+ config.args = list_make1((void*)(&val));
+ return ParseVariableSetStmt(&config, true);
+ }
+
using TTraverseSelectStack = TStack<std::pair<const SelectStmt*, bool>>;
using TTraverseNodeStack = TStack<std::pair<const Node*, bool>>;
@@ -974,6 +1022,34 @@ public:
res.emplace_back(CreatePgStarResultItem());
i++;
}
+ bool maybeSelectWithJustSetConfig = !inner && !sort && windowItems.empty() && !having && !groupBy && !whereFilter && !x->distinctClause && ListLength(x->targetList) == 1;
+ if (maybeSelectWithJustSetConfig) {
+ auto node = ListNodeNth(x->targetList, 0);
+ if (NodeTag(node) != T_ResTarget) {
+ NodeNotImplemented(x, node);
+ return nullptr;
+ }
+ auto r = CAST_NODE(ResTarget, node);
+ if (!r->val) {
+ AddError("SelectStmt: expected val");
+ return nullptr;
+ }
+ auto call = r->val;
+ if (NodeTag(call) == T_FuncCall) {
+ auto fn = CAST_NODE(FuncCall, call);
+ if (ListLength(fn->funcname) == 1) {
+ auto nameNode = ListNodeNth(fn->funcname, 0);
+ if (NodeTag(nameNode) != T_String) {
+ AddError("Function name must be string");
+ return nullptr;
+ }
+ auto name = to_lower(TString(StrVal(ListNodeNth(fn->funcname, 0))));
+ if (name == "set_config") {
+ return ParseSetConfig(fn);
+ }
+ }
+ }
+ }
for (int targetIndex = 0; targetIndex < ListLength(x->targetList); ++targetIndex) {
auto node = ListNodeNth(x->targetList, targetIndex);
if (NodeTag(node) != T_ResTarget) {
@@ -1993,13 +2069,38 @@ public:
}
[[nodiscard]]
- TAstNode* ParseVariableSetStmt(const VariableSetStmt* value) {
+ TAstNode* ParseVariableSetStmt(const VariableSetStmt* value, bool isSetConfig = false) {
if (value->kind != VAR_SET_VALUE) {
AddError(TStringBuilder() << "VariableSetStmt, not supported kind: " << (int)value->kind);
return nullptr;
}
auto name = to_lower(TString(value->name));
+ if (isSetConfig) {
+ if (ListLength(value->args) != 1) {
+ AddError(TStringBuilder() << "VariableSetStmt, expected 1 arg, but got: " << ListLength(value->args));
+ return nullptr;
+ }
+ auto val = ListNodeNth(value->args, 0);
+ if (NodeTag(val) != T_String) {
+ AddError(TStringBuilder() << "VariableSetStmt, expected string literal for " << value->name << " option");
+ return nullptr;
+ }
+ TString rawStr = TString(StrVal(val));
+ if (name != "search_path") {
+ AddError(TStringBuilder() << "VariableSetStmt, set_config doesn't support that option:" << name);
+ return nullptr;
+ }
+ if (rawStr != "pg_catalog" && rawStr != "public") {
+ AddError(TStringBuilder() << "VariableSetStmt, search path supports only public and pg_catalogue, but got :" << rawStr);
+ return nullptr;
+ }
+ if (Settings.GUCSettings) {
+ Settings.GUCSettings->Set(name, rawStr, value->is_local);
+ }
+ return Statements.back();
+ }
+
if (name == "useblocks" || name == "emitaggapply") {
if (ListLength(value->args) != 1) {
AddError(TStringBuilder() << "VariableSetStmt, expected 1 arg, but got: " << ListLength(value->args));
@@ -2277,10 +2378,12 @@ public:
case TRANS_STMT_COMMIT:
Statements.push_back(L(A("let"), A("world"), L(A("CommitAll!"),
A("world"))));
+ Settings.GUCSettings->Commit();
return true;
case TRANS_STMT_ROLLBACK:
Statements.push_back(L(A("let"), A("world"), L(A("CommitAll!"),
A("world"), QL(QL(QA("mode"), QA("rollback"))))));
+ Settings.GUCSettings->RollBack();
return true;
default:
AddError(TStringBuilder() << "TransactionStmt: kind is not supported: " << (int)value->kind);
@@ -2413,6 +2516,20 @@ public:
return true;
}
+ TString ResolveCluster(const TStringBuf schemaname) {
+ if (schemaname == "public") {
+ return "";
+ }
+ if (schemaname == "" && Settings.GUCSettings) {
+ auto search_path = Settings.GUCSettings->Get("search_path");
+ if (!search_path || *search_path == "public") {
+ return Settings.DefaultCluster;
+ }
+ return TString(*search_path);
+ }
+ return TString(schemaname);
+ }
+
TAstNode* BuildClusterSinkOrSourceExpression(
bool isSink, const TStringBuf schemaname) {
const auto p = Settings.ClusterMapping.FindPtr(schemaname);
@@ -2443,7 +2560,7 @@ public:
return {};
}
- const auto cluster = !schemaname.Empty() && schemaname != "public" ? schemaname : Settings.DefaultCluster;
+ const auto cluster = ResolveCluster(schemaname);
const auto sinkOrSource = BuildClusterSinkOrSourceExpression(isSink, cluster);
const auto key = BuildTableKeyExpression(relname, isScheme);
return {sinkOrSource, key};
@@ -2470,7 +2587,7 @@ public:
return {};
}
- const auto cluster = !schemaname.Empty() && schemaname != "public" ? schemaname : Settings.DefaultCluster;
+ const auto cluster = ResolveCluster(schemaname);
const auto sinkOrSource = BuildClusterSinkOrSourceExpression(true, cluster);
const auto key = BuildPgObjectExpression(objectName, pgObjectType);
return {sinkOrSource, key};
@@ -3262,6 +3379,7 @@ public:
}
auto name = names.back();
+
const bool isAggregateFunc = NYql::NPg::HasAggregation(name);
const bool hasReturnSet = NYql::NPg::HasReturnSetProc(name);
diff --git a/ydb/library/yql/sql/pg/pg_sql_ut.cpp b/ydb/library/yql/sql/pg/pg_sql_ut.cpp
index 10011b7f62..d99fcfaa61 100644
--- a/ydb/library/yql/sql/pg/pg_sql_ut.cpp
+++ b/ydb/library/yql/sql/pg/pg_sql_ut.cpp
@@ -456,4 +456,121 @@ SELECT COUNT(*) FROM public.t;");
auto issue = *(res.Issues.begin());
UNIT_ASSERT(issue.GetMessage().Contains("VariableSetStmt, not supported BlockEngine option value: foo"));
}
+
+ Y_UNIT_TEST(SetConfig_SearchPath) {
+ TTranslationSettings settings;
+ settings.GUCSettings = std::make_shared<TGUCSettings>();
+ settings.ClusterMapping["pg_catalog"] = NYql::PgProviderName;
+ settings.DefaultCluster = "";
+
+ auto res = SqlToYqlWithMode(
+ R"(select set_config('search_path', 'pg_catalog', false);)",
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::ToCerr,
+ false,
+ settings);
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToString());
+ UNIT_ASSERT(res.Root);
+
+ res = SqlToYqlWithMode(
+ R"(select oid,
+typinput::int4 as typinput,
+typname,
+typnamespace,
+typtype
+from pg_type)",
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+ UNIT_ASSERT(res.IsOk());
+ UNIT_ASSERT(res.Root);
+
+ res = SqlToYqlWithMode(
+ R"(select oid,
+typinput::int4 as typinput,
+typname,
+typnamespace,
+typtype
+from pg_catalog.pg_type)",
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+ UNIT_ASSERT(res.IsOk());
+ UNIT_ASSERT(res.Root);
+
+ res = SqlToYqlWithMode(
+ R"(select set_config('search_path', 'public', false);)",
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+ UNIT_ASSERT(res.IsOk());
+ UNIT_ASSERT(res.Root);
+
+ res = SqlToYqlWithMode(
+ R"(select set_config('search_path', 'yql', false);)",
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+ UNIT_ASSERT(!res.IsOk());
+ UNIT_ASSERT(!res.Root);
+
+ res = SqlToYqlWithMode(
+ R"(select set_config('search_path', 'pg_catalog', false);)",
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+ UNIT_ASSERT(res.IsOk());
+ UNIT_ASSERT(res.Root);
+
+ res = SqlToYqlWithMode(
+ R"(rollback;)",
+ NSQLTranslation::ESqlMode::QUERY,
+ 10,
+ {},
+ EDebugOutput::None,
+ false,
+ settings);
+ UNIT_ASSERT(res.IsOk());
+ UNIT_ASSERT(res.Root);
+
+ google::protobuf::Arena arena;
+ const auto service = TString(NYql::YtProviderName);
+ settings.ClusterMapping["hahn"] = NYql::YtProviderName;
+ settings.ClusterMapping["mon"] = NYql::SolomonProviderName;
+ settings.MaxErrors = 10;
+ settings.Mode = NSQLTranslation::ESqlMode::QUERY;
+ settings.Arena = &arena;
+ settings.AnsiLexer = false;
+ settings.SyntaxVersion = 1;
+ settings.PgParser = true;
+
+ res = SqlToYql(
+ R"(select oid,
+typinput::int4 as typinput,
+typname,
+typnamespace,
+typtype
+from pg_type)",
+ settings);
+ UNIT_ASSERT(res.Issues.ToString().Contains("Unknown cluster:"));
+ UNIT_ASSERT(!res.IsOk());
+ UNIT_ASSERT(!res.Root);
+ }
}
diff --git a/ydb/library/yql/sql/settings/translation_settings.h b/ydb/library/yql/sql/settings/translation_settings.h
index 4ec571a932..2dad2e646d 100644
--- a/ydb/library/yql/sql/settings/translation_settings.h
+++ b/ydb/library/yql/sql/settings/translation_settings.h
@@ -1,5 +1,7 @@
#pragma once
+#include <ydb/library/yql/core/pg_settings/guc_settings.h>
+
#include <util/generic/hash.h>
#include <util/generic/hash_set.h>
#include <util/generic/map.h>
@@ -110,6 +112,8 @@ namespace NSQLTranslation {
bool AutoParametrizeEnabled = false;
bool AutoParametrizeValuesStmt = false;
THashSet<TString> AutoParametrizeExprDisabledScopes = {};
+
+ TGUCSettings::TPtr GUCSettings = std::make_shared<TGUCSettings>();
};
bool ParseTranslationSettings(const TString& query, NSQLTranslation::TTranslationSettings& settings, NYql::TIssues& issues);
diff --git a/ydb/library/yql/sql/settings/ya.make b/ydb/library/yql/sql/settings/ya.make
index d703c6b709..b1fcf57ca3 100644
--- a/ydb/library/yql/sql/settings/ya.make
+++ b/ydb/library/yql/sql/settings/ya.make
@@ -9,6 +9,7 @@ PEERDIR(
library/cpp/deprecated/split
library/cpp/json
ydb/library/yql/core/issue
+ ydb/library/yql/core/pg_settings
ydb/library/yql/core/issue/protos
ydb/library/yql/utils
)
diff --git a/ydb/library/yql/tests/sql/dq_file/part15/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part15/canondata/result.json
index 82099eb4f1..c6716667ca 100644
--- a/ydb/library/yql/tests/sql/dq_file/part15/canondata/result.json
+++ b/ydb/library/yql/tests/sql/dq_file/part15/canondata/result.json
@@ -2263,6 +2263,28 @@
}
],
"test.test[pg-unknown-default.txt-Results]": [],
+ "test.test[pg_catalog-pg_set_config_commit-default.txt-Analyze]": [
+ {
+ "checksum": "68060cb3253dfbfa478b2c0ff4ee0b52",
+ "size": 2171,
+ "uri": "https://{canondata_backend}/1880306/db71d33ed2525c218cc0dde3f5b7b9ce7f9aa317/resource.tar.gz#test.test_pg_catalog-pg_set_config_commit-default.txt-Analyze_/plan.txt"
+ }
+ ],
+ "test.test[pg_catalog-pg_set_config_commit-default.txt-Debug]": [
+ {
+ "checksum": "33f854f63b0fc28ef95bb639aade1fe9",
+ "size": 876,
+ "uri": "https://{canondata_backend}/1880306/db71d33ed2525c218cc0dde3f5b7b9ce7f9aa317/resource.tar.gz#test.test_pg_catalog-pg_set_config_commit-default.txt-Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[pg_catalog-pg_set_config_commit-default.txt-Plan]": [
+ {
+ "checksum": "68060cb3253dfbfa478b2c0ff4ee0b52",
+ "size": 2171,
+ "uri": "https://{canondata_backend}/1880306/db71d33ed2525c218cc0dde3f5b7b9ce7f9aa317/resource.tar.gz#test.test_pg_catalog-pg_set_config_commit-default.txt-Plan_/plan.txt"
+ }
+ ],
+ "test.test[pg_catalog-pg_set_config_commit-default.txt-Results]": [],
"test.test[pragma-yson_auto_convert--Analyze]": [
{
"checksum": "b4dd508a329723c74293d80f0278c705",
diff --git a/ydb/library/yql/tests/sql/dq_file/part4/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part4/canondata/result.json
index fb6fe2f901..c29d789481 100644
--- a/ydb/library/yql/tests/sql/dq_file/part4/canondata/result.json
+++ b/ydb/library/yql/tests/sql/dq_file/part4/canondata/result.json
@@ -2153,6 +2153,28 @@
}
],
"test.test[pg-tpch-q09-default.txt-Results]": [],
+ "test.test[pg_catalog-pg_set_config-default.txt-Analyze]": [
+ {
+ "checksum": "4eaabd8e0d2437ccd8ba8311ee9b195d",
+ "size": 1357,
+ "uri": "https://{canondata_backend}/1937001/ceb29095b5e35ed4cc1eb104072815b0be7ac715/resource.tar.gz#test.test_pg_catalog-pg_set_config-default.txt-Analyze_/plan.txt"
+ }
+ ],
+ "test.test[pg_catalog-pg_set_config-default.txt-Debug]": [
+ {
+ "checksum": "c0fc5bdb405f341292917207a1a9b077",
+ "size": 800,
+ "uri": "https://{canondata_backend}/1937001/ceb29095b5e35ed4cc1eb104072815b0be7ac715/resource.tar.gz#test.test_pg_catalog-pg_set_config-default.txt-Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[pg_catalog-pg_set_config-default.txt-Plan]": [
+ {
+ "checksum": "4eaabd8e0d2437ccd8ba8311ee9b195d",
+ "size": 1357,
+ "uri": "https://{canondata_backend}/1937001/ceb29095b5e35ed4cc1eb104072815b0be7ac715/resource.tar.gz#test.test_pg_catalog-pg_set_config-default.txt-Plan_/plan.txt"
+ }
+ ],
+ "test.test[pg_catalog-pg_set_config-default.txt-Results]": [],
"test.test[produce-reduce_all-default.txt-Analyze]": [
{
"checksum": "9bd46d79daaa9520002fc1a9f8ead7ad",
diff --git a/ydb/library/yql/tests/sql/sql2yql/canondata/result.json b/ydb/library/yql/tests/sql/sql2yql/canondata/result.json
index 409d77064d..349c8228ea 100644
--- a/ydb/library/yql/tests/sql/sql2yql/canondata/result.json
+++ b/ydb/library/yql/tests/sql/sql2yql/canondata/result.json
@@ -13208,6 +13208,20 @@
"uri": "https://{canondata_backend}/1773845/118c740ff9ea824c1b2998c5bad993b2a2276f6e/resource.tar.gz#test_sql2yql.test_pg_catalog-pg_locks_/sql.yql"
}
],
+ "test_sql2yql.test[pg_catalog-pg_set_config]": [
+ {
+ "checksum": "0b00c0ffc35339caa3a22beb1e12d9af",
+ "size": 1776,
+ "uri": "https://{canondata_backend}/1942173/1ce1eb52fea966081c3286eec52d5acc98c048a6/resource.tar.gz#test_sql2yql.test_pg_catalog-pg_set_config_/sql.yql"
+ }
+ ],
+ "test_sql2yql.test[pg_catalog-pg_set_config_commit]": [
+ {
+ "checksum": "8f4536c9243a0a083e4bd355461525c6",
+ "size": 1860,
+ "uri": "https://{canondata_backend}/1942173/1ce1eb52fea966081c3286eec52d5acc98c048a6/resource.tar.gz#test_sql2yql.test_pg_catalog-pg_set_config_commit_/sql.yql"
+ }
+ ],
"test_sql2yql.test[pg_catalog-pg_shdescription]": [
{
"checksum": "3c2389e9a1d831db2944939e11919590",
diff --git a/ydb/library/yql/tests/sql/suites/pg_catalog/pg_set_config.sql b/ydb/library/yql/tests/sql/suites/pg_catalog/pg_set_config.sql
new file mode 100644
index 0000000000..f04de1c0d5
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/pg_catalog/pg_set_config.sql
@@ -0,0 +1,5 @@
+--!syntax_pg
+select set_config('search_path', 'pg_catalog', false);
+select oid, typinput::int4 as typinput, typname, typnamespace, typtype from pg_type;
+select set_config('search_path', 'public', false);
+select oid, typinput::int4 as typinput, typname, typnamespace, typtype from pg_catalog.pg_type;
diff --git a/ydb/library/yql/tests/sql/suites/pg_catalog/pg_set_config_commit.sql b/ydb/library/yql/tests/sql/suites/pg_catalog/pg_set_config_commit.sql
new file mode 100644
index 0000000000..5df0cac811
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/pg_catalog/pg_set_config_commit.sql
@@ -0,0 +1,6 @@
+--!syntax_pg
+select set_config('search_path', 'pg_catalog', false);
+commit;
+select oid, typinput::int4 as typinput, typname, typnamespace, typtype from pg_type;
+rollback;
+select oid, typinput::int4 as typinput, typname, typnamespace, typtype from pg_type;
diff --git a/ydb/library/yql/tests/sql/yt_native_file/part15/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part15/canondata/result.json
index 033d09bf70..04eea3709e 100644
--- a/ydb/library/yql/tests/sql/yt_native_file/part15/canondata/result.json
+++ b/ydb/library/yql/tests/sql/yt_native_file/part15/canondata/result.json
@@ -2040,6 +2040,27 @@
"uri": "https://{canondata_backend}/1923547/61458c9c64b8429a1ff4c80acb29f295ac160173/resource.tar.gz#test.test_pg-unknown-default.txt-Results_/results.txt"
}
],
+ "test.test[pg_catalog-pg_set_config_commit-default.txt-Debug]": [
+ {
+ "checksum": "90a2cbfdc0e2b05b0e0519c7e6d7fd5f",
+ "size": 816,
+ "uri": "https://{canondata_backend}/1942415/f984090b55dc18be59f4bd18b1adb52d0c0c4f56/resource.tar.gz#test.test_pg_catalog-pg_set_config_commit-default.txt-Debug_/opt.yql"
+ }
+ ],
+ "test.test[pg_catalog-pg_set_config_commit-default.txt-Plan]": [
+ {
+ "checksum": "68060cb3253dfbfa478b2c0ff4ee0b52",
+ "size": 2171,
+ "uri": "https://{canondata_backend}/1942415/f984090b55dc18be59f4bd18b1adb52d0c0c4f56/resource.tar.gz#test.test_pg_catalog-pg_set_config_commit-default.txt-Plan_/plan.txt"
+ }
+ ],
+ "test.test[pg_catalog-pg_set_config_commit-default.txt-Results]": [
+ {
+ "checksum": "9e0d1aa68d849723ce01958eb48252db",
+ "size": 48462,
+ "uri": "https://{canondata_backend}/1942415/f984090b55dc18be59f4bd18b1adb52d0c0c4f56/resource.tar.gz#test.test_pg_catalog-pg_set_config_commit-default.txt-Results_/results.txt"
+ }
+ ],
"test.test[pragma-yson_auto_convert--Debug]": [
{
"checksum": "e9ad6c82ef2a21b3a8b8692df194fe72",
diff --git a/ydb/library/yql/tests/sql/yt_native_file/part4/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part4/canondata/result.json
index 005d1dc4ee..a1316d31d7 100644
--- a/ydb/library/yql/tests/sql/yt_native_file/part4/canondata/result.json
+++ b/ydb/library/yql/tests/sql/yt_native_file/part4/canondata/result.json
@@ -1741,6 +1741,27 @@
"uri": "https://{canondata_backend}/937458/e5bf2059ff1773755323cbc5a526b3a57c820703/resource.tar.gz#test.test_pg-tpch-q09-default.txt-Results_/results.txt"
}
],
+ "test.test[pg_catalog-pg_set_config-default.txt-Debug]": [
+ {
+ "checksum": "e1ac509be349f61477e97f8f46d36361",
+ "size": 736,
+ "uri": "https://{canondata_backend}/1880306/b8b828a21bbfc443a7e752a79a78e9a185098989/resource.tar.gz#test.test_pg_catalog-pg_set_config-default.txt-Debug_/opt.yql"
+ }
+ ],
+ "test.test[pg_catalog-pg_set_config-default.txt-Plan]": [
+ {
+ "checksum": "4eaabd8e0d2437ccd8ba8311ee9b195d",
+ "size": 1357,
+ "uri": "https://{canondata_backend}/1880306/b8b828a21bbfc443a7e752a79a78e9a185098989/resource.tar.gz#test.test_pg_catalog-pg_set_config-default.txt-Plan_/plan.txt"
+ }
+ ],
+ "test.test[pg_catalog-pg_set_config-default.txt-Results]": [
+ {
+ "checksum": "9e0d1aa68d849723ce01958eb48252db",
+ "size": 48462,
+ "uri": "https://{canondata_backend}/1880306/b8b828a21bbfc443a7e752a79a78e9a185098989/resource.tar.gz#test.test_pg_catalog-pg_set_config-default.txt-Results_/results.txt"
+ }
+ ],
"test.test[produce-reduce_all-default.txt-Debug]": [
{
"checksum": "bf18d4de67411fd4d4c0e9747d2d14f9",
diff --git a/ydb/library/yql/tools/pgrun/pgrun.cpp b/ydb/library/yql/tools/pgrun/pgrun.cpp
index 1ad3d59d8a..62f3a4227c 100644
--- a/ydb/library/yql/tools/pgrun/pgrun.cpp
+++ b/ydb/library/yql/tools/pgrun/pgrun.cpp
@@ -1014,6 +1014,16 @@ int Main(int argc, char* argv[])
const TString username = GetUsername();
THashSet<TString> sqlFlags;
+ NSQLTranslation::TTranslationSettings settings;
+ settings.ClusterMapping = clusterMapping;
+ settings.DefaultCluster = DefaultCluster;
+ settings.Flags = sqlFlags;
+ settings.SyntaxVersion = 1;
+ settings.AnsiLexer = false;
+ settings.V0Behavior = NSQLTranslation::EV0Behavior::Report;
+ settings.AssumeYdbOnClusterWithSlash = false;
+ settings.PgParser = true;
+
for (const auto& raw_stmt : TStatementIterator{Cin.ReadAll()}) {
const auto stmt = GetFormattedStmt(raw_stmt);
Cout << stmt << '\n';
@@ -1035,16 +1045,7 @@ int Main(int argc, char* argv[])
}
google::protobuf::Arena arena;
- NSQLTranslation::TTranslationSettings settings;
settings.Arena = &arena;
- settings.ClusterMapping = clusterMapping;
- settings.DefaultCluster = DefaultCluster;
- settings.Flags = sqlFlags;
- settings.SyntaxVersion = 1;
- settings.AnsiLexer = false;
- settings.V0Behavior = NSQLTranslation::EV0Behavior::Report;
- settings.AssumeYdbOnClusterWithSlash = false;
- settings.PgParser = true;
auto program = factory.Create("-stdin-", stmt);