aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfedor-miron <fedor-miron@yandex-team.com>2023-06-06 14:48:24 +0300
committerfedor-miron <fedor-miron@yandex-team.com>2023-06-06 14:48:24 +0300
commit440ce83181e1a979be7ca865667b28c5144d883b (patch)
tree6c1a5835a6b29c9e68d2b79d530dc56e75d4a08c
parent7f8e5bba976bab99984226a4d4a448f178095be0 (diff)
downloadydb-440ce83181e1a979be7ca865667b28c5144d883b.tar.gz
YQL-16021: support show server_version
-rw-r--r--ydb/library/yql/parser/pg_wrapper/CMakeLists.darwin-x86_64.txt1
-rw-r--r--ydb/library/yql/parser/pg_wrapper/CMakeLists.linux-aarch64.txt1
-rw-r--r--ydb/library/yql/parser/pg_wrapper/CMakeLists.linux-x86_64.txt1
-rw-r--r--ydb/library/yql/parser/pg_wrapper/CMakeLists.windows-x86_64.txt1
-rw-r--r--ydb/library/yql/parser/pg_wrapper/config.cpp14
-rw-r--r--ydb/library/yql/parser/pg_wrapper/interface/config.h8
-rw-r--r--ydb/library/yql/parser/pg_wrapper/interface/interface.h1
-rw-r--r--ydb/library/yql/sql/pg/pg_sql.cpp48
-rw-r--r--ydb/library/yql/sql/pg/pg_sql_ut.cpp23
-rw-r--r--ydb/library/yql/sql/pg/ut/CMakeLists.darwin-x86_64.txt1
-rw-r--r--ydb/library/yql/sql/pg/ut/CMakeLists.linux-aarch64.txt1
-rw-r--r--ydb/library/yql/sql/pg/ut/CMakeLists.linux-x86_64.txt1
-rw-r--r--ydb/library/yql/sql/pg/ut/CMakeLists.windows-x86_64.txt1
-rw-r--r--ydb/library/yql/sql/pg_dummy/pg_sql_dummy.cpp7
14 files changed, 109 insertions, 0 deletions
diff --git a/ydb/library/yql/parser/pg_wrapper/CMakeLists.darwin-x86_64.txt b/ydb/library/yql/parser/pg_wrapper/CMakeLists.darwin-x86_64.txt
index 7de35ea82f3..00ccd69eef1 100644
--- a/ydb/library/yql/parser/pg_wrapper/CMakeLists.darwin-x86_64.txt
+++ b/ydb/library/yql/parser/pg_wrapper/CMakeLists.darwin-x86_64.txt
@@ -142,6 +142,7 @@ target_sources(yql-parser-pg_wrapper PRIVATE
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/pg_kernels.1.cpp
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/pg_kernels.2.cpp
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/pg_kernels.3.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/config.cpp
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/postgresql/src/port/pg_crc32c_sse42.c
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/postgresql/src/port/pg_crc32c_sse42_choose.c
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/access/brin/brin.c
diff --git a/ydb/library/yql/parser/pg_wrapper/CMakeLists.linux-aarch64.txt b/ydb/library/yql/parser/pg_wrapper/CMakeLists.linux-aarch64.txt
index 1f70224dab2..42469f240ea 100644
--- a/ydb/library/yql/parser/pg_wrapper/CMakeLists.linux-aarch64.txt
+++ b/ydb/library/yql/parser/pg_wrapper/CMakeLists.linux-aarch64.txt
@@ -141,6 +141,7 @@ target_sources(yql-parser-pg_wrapper PRIVATE
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/pg_kernels.1.cpp
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/pg_kernels.2.cpp
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/pg_kernels.3.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/config.cpp
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/access/brin/brin.c
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/access/brin/brin_bloom.c
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/access/brin/brin_inclusion.c
diff --git a/ydb/library/yql/parser/pg_wrapper/CMakeLists.linux-x86_64.txt b/ydb/library/yql/parser/pg_wrapper/CMakeLists.linux-x86_64.txt
index c707a0b1ce0..d511972b2d2 100644
--- a/ydb/library/yql/parser/pg_wrapper/CMakeLists.linux-x86_64.txt
+++ b/ydb/library/yql/parser/pg_wrapper/CMakeLists.linux-x86_64.txt
@@ -143,6 +143,7 @@ target_sources(yql-parser-pg_wrapper PRIVATE
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/pg_kernels.1.cpp
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/pg_kernels.2.cpp
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/pg_kernels.3.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/config.cpp
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/postgresql/src/port/pg_crc32c_sse42.c
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/postgresql/src/port/pg_crc32c_sse42_choose.c
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/access/brin/brin.c
diff --git a/ydb/library/yql/parser/pg_wrapper/CMakeLists.windows-x86_64.txt b/ydb/library/yql/parser/pg_wrapper/CMakeLists.windows-x86_64.txt
index 52b528adf0b..f906ae09b9e 100644
--- a/ydb/library/yql/parser/pg_wrapper/CMakeLists.windows-x86_64.txt
+++ b/ydb/library/yql/parser/pg_wrapper/CMakeLists.windows-x86_64.txt
@@ -159,6 +159,7 @@ target_sources(yql-parser-pg_wrapper PRIVATE
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/pg_kernels.1.cpp
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/pg_kernels.2.cpp
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/pg_kernels.3.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/config.cpp
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/postgresql/src/port/pg_crc32c_sse42.c
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/postgresql/src/port/pg_crc32c_sse42_choose.c
${CMAKE_SOURCE_DIR}/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/access/brin/brin.c
diff --git a/ydb/library/yql/parser/pg_wrapper/config.cpp b/ydb/library/yql/parser/pg_wrapper/config.cpp
new file mode 100644
index 00000000000..1f832d65c59
--- /dev/null
+++ b/ydb/library/yql/parser/pg_wrapper/config.cpp
@@ -0,0 +1,14 @@
+#include <util/generic/string.h>
+#include <ydb/library/yql/parser/pg_wrapper/postgresql/src/include/pg_config.h>
+
+namespace NYql {
+
+TString GetPostgresServerVersionNum() {
+ return Y_STRINGIZE(PG_VERSION_NUM);
+}
+
+TString GetPostgresServerVersionStr() {
+ return PG_VERSION_STR;
+}
+
+} // NYql
diff --git a/ydb/library/yql/parser/pg_wrapper/interface/config.h b/ydb/library/yql/parser/pg_wrapper/interface/config.h
new file mode 100644
index 00000000000..3cf3fcda9fa
--- /dev/null
+++ b/ydb/library/yql/parser/pg_wrapper/interface/config.h
@@ -0,0 +1,8 @@
+#include <util/generic/fwd.h>
+
+namespace NYql {
+
+TString GetPostgresServerVersionNum();
+TString GetPostgresServerVersionStr();
+
+} // NYql \ No newline at end of file
diff --git a/ydb/library/yql/parser/pg_wrapper/interface/interface.h b/ydb/library/yql/parser/pg_wrapper/interface/interface.h
index d28594d80dd..0f5ff7bcc6b 100644
--- a/ydb/library/yql/parser/pg_wrapper/interface/interface.h
+++ b/ydb/library/yql/parser/pg_wrapper/interface/interface.h
@@ -2,6 +2,7 @@
#include "arrow.h"
#include "codec.h"
+#include "config.h"
#include "compare.h"
#include "comp_factory.h"
#include "context.h"
diff --git a/ydb/library/yql/sql/pg/pg_sql.cpp b/ydb/library/yql/sql/pg/pg_sql.cpp
index 2ac619bc584..70888b6f885 100644
--- a/ydb/library/yql/sql/pg/pg_sql.cpp
+++ b/ydb/library/yql/sql/pg/pg_sql.cpp
@@ -1,7 +1,9 @@
#include "util/charset/utf8.h"
#include "utils.h"
#include <ydb/library/yql/sql/settings/partitioning.h>
+#include <ydb/library/yql/parser/pg_wrapper/interface/config.h>
#include <ydb/library/yql/parser/pg_wrapper/interface/parser.h>
+#include <ydb/library/yql/parser/pg_wrapper/interface/utils.h>
#include <ydb/library/yql/parser/pg_wrapper/parser.h>
#include <ydb/library/yql/parser/pg_catalog/catalog.h>
#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
@@ -285,6 +287,8 @@ public:
return ParseVariableSetStmt(CAST_NODE(VariableSetStmt, node)) != nullptr;
case T_DeleteStmt:
return ParseDeleteStmt(CAST_NODE(DeleteStmt, node)) != nullptr;
+ case T_VariableShowStmt:
+ return ParseVariableShowStmt(CAST_NODE(VariableShowStmt, node)) != nullptr;
case T_TransactionStmt:
return true;
default:
@@ -1518,6 +1522,50 @@ public:
));
return Statements.back();
}
+
+ TMaybe<TString> GetConfigVariable(const TString& varName) {
+ if (varName == "server_version") {
+ return GetPostgresServerVersionStr();
+ }
+ if (varName == "server_version_num") {
+ return GetPostgresServerVersionNum();
+ }
+ return {};
+ }
+
+ [[nodiscard]]
+ TAstNode* ParseVariableShowStmt(const VariableShowStmt* value) {
+ const auto varName = to_lower(TString(value->name));
+
+ const auto varValue = GetConfigVariable(varName);
+ if (!varValue) {
+ AddError("unrecognized configuration parameter \"" + varName + "\"");
+ return nullptr;
+ }
+
+ const auto columnName = QAX(varName);
+ const auto varValueNode =
+ L(A("PgConst"), QAX(*varValue), L(A("PgType"), QA("text")));
+
+ const auto lambda = L(A("lambda"), QL(), varValueNode);
+ const auto res = QL(L(A("PgResultItem"), columnName, L(A("Void")), lambda));
+
+ const auto setItem = L(A("PgSetItem"), QL(QL(QA("result"), res)));
+ const auto setItems = QL(QA("set_items"), QL(setItem));
+ const auto setOps = QL(QA("set_ops"), QVL(QA("push")));
+ const auto selectOptions = QL(setItems, setOps);
+
+ const auto output = L(A("PgSelect"), selectOptions);
+ Statements.push_back(L(A("let"), A("output"), output));
+ Statements.push_back(L(A("let"), A("result_sink"), L(A("DataSink"), QA(TString(NYql::ResultProviderName)))));
+
+ const auto resOptions = QL(QL(QA("type")), QL(QA("autoref")));
+ Statements.push_back(L(A("let"), A("world"), L(A("Write!"),
+ A("world"), A("result_sink"), L(A("Key")), A("output"), resOptions)));
+ Statements.push_back(L(A("let"), A("world"), L(A("Commit!"),
+ A("world"), A("result_sink"))));
+ return Statements.back();
+ }
TFromDesc ParseFromClause(const Node* node) {
switch (NodeTag(node)) {
diff --git a/ydb/library/yql/sql/pg/pg_sql_ut.cpp b/ydb/library/yql/sql/pg/pg_sql_ut.cpp
index c851ddf1fc0..b85d4e0ff02 100644
--- a/ydb/library/yql/sql/pg/pg_sql_ut.cpp
+++ b/ydb/library/yql/sql/pg/pg_sql_ut.cpp
@@ -1,9 +1,13 @@
+#include <contrib/libs/fmt/include/fmt/format.h>
+
#include <ydb/library/yql/ast/yql_expr.h>
#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
#include <ydb/library/yql/sql/sql.h>
+#include <ydb/library/yql/parser/pg_wrapper/interface/config.h>
#include <library/cpp/testing/unittest/registar.h>
+
using namespace NSQLTranslation;
enum class EDebugOutput {
@@ -200,4 +204,23 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
const auto expectedAst = NYql::ParseAst(program);
UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
}
+
+ Y_UNIT_TEST(VariableShowStmt) {
+ auto res = PgSqlToYql("Show server_version_num");
+ UNIT_ASSERT(res.Root);
+
+ TString program = fmt::format(R"(
+ (
+ (let world (Configure! world (DataSource 'config) 'OrderedColumns))
+ (let output (PgSelect '('('set_items '((PgSetItem '('('result '((PgResultItem '"server_version_num" (Void) (lambda '() (PgConst '"{}" (PgType 'text)))))))))) '('set_ops '('push)))))
+ (let result_sink (DataSink 'result))
+ (let world (Write! world result_sink (Key) output '('('type) '('autoref))))
+ (let world (Commit! world result_sink))
+ (let world (CommitAll! world))
+ (return world)
+ )
+ )", NYql::GetPostgresServerVersionNum());
+ const auto expectedAst = NYql::ParseAst(program);
+ UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
+ }
}
diff --git a/ydb/library/yql/sql/pg/ut/CMakeLists.darwin-x86_64.txt b/ydb/library/yql/sql/pg/ut/CMakeLists.darwin-x86_64.txt
index 314a5e2d14f..a97ae7640d0 100644
--- a/ydb/library/yql/sql/pg/ut/CMakeLists.darwin-x86_64.txt
+++ b/ydb/library/yql/sql/pg/ut/CMakeLists.darwin-x86_64.txt
@@ -17,6 +17,7 @@ target_link_libraries(ydb-library-yql-sql-pg-ut PUBLIC
library-cpp-cpuid_check
cpp-testing-unittest_main
yql-sql-pg
+ contrib-libs-fmt
udf-service-exception_policy
library-yql-sql
)
diff --git a/ydb/library/yql/sql/pg/ut/CMakeLists.linux-aarch64.txt b/ydb/library/yql/sql/pg/ut/CMakeLists.linux-aarch64.txt
index 6d69edbaeda..25ac8f596b4 100644
--- a/ydb/library/yql/sql/pg/ut/CMakeLists.linux-aarch64.txt
+++ b/ydb/library/yql/sql/pg/ut/CMakeLists.linux-aarch64.txt
@@ -17,6 +17,7 @@ target_link_libraries(ydb-library-yql-sql-pg-ut PUBLIC
yutil
cpp-testing-unittest_main
yql-sql-pg
+ contrib-libs-fmt
udf-service-exception_policy
library-yql-sql
)
diff --git a/ydb/library/yql/sql/pg/ut/CMakeLists.linux-x86_64.txt b/ydb/library/yql/sql/pg/ut/CMakeLists.linux-x86_64.txt
index 4ee5843378d..2a9f4f65f65 100644
--- a/ydb/library/yql/sql/pg/ut/CMakeLists.linux-x86_64.txt
+++ b/ydb/library/yql/sql/pg/ut/CMakeLists.linux-x86_64.txt
@@ -18,6 +18,7 @@ target_link_libraries(ydb-library-yql-sql-pg-ut PUBLIC
library-cpp-cpuid_check
cpp-testing-unittest_main
yql-sql-pg
+ contrib-libs-fmt
udf-service-exception_policy
library-yql-sql
)
diff --git a/ydb/library/yql/sql/pg/ut/CMakeLists.windows-x86_64.txt b/ydb/library/yql/sql/pg/ut/CMakeLists.windows-x86_64.txt
index 610d1437d51..883f4b55026 100644
--- a/ydb/library/yql/sql/pg/ut/CMakeLists.windows-x86_64.txt
+++ b/ydb/library/yql/sql/pg/ut/CMakeLists.windows-x86_64.txt
@@ -17,6 +17,7 @@ target_link_libraries(ydb-library-yql-sql-pg-ut PUBLIC
library-cpp-cpuid_check
cpp-testing-unittest_main
yql-sql-pg
+ contrib-libs-fmt
udf-service-exception_policy
library-yql-sql
)
diff --git a/ydb/library/yql/sql/pg_dummy/pg_sql_dummy.cpp b/ydb/library/yql/sql/pg_dummy/pg_sql_dummy.cpp
index a9756438dc8..c29c58c0c8b 100644
--- a/ydb/library/yql/sql/pg_dummy/pg_sql_dummy.cpp
+++ b/ydb/library/yql/sql/pg_dummy/pg_sql_dummy.cpp
@@ -436,4 +436,11 @@ TConvertResult PgNativeTextFromNativeBinary(const TString& binary, ui32 pgTypeId
throw yexception() << "PG types are not supported";
}
+TString GetPostgresServerVersionNum() {
+ return "-1";
+}
+TString GetPostgresServerVersionStr() {
+ return "pg_sql_dummy";
+}
+
} // namespace NKikimr::NPg