diff options
author | fedor-miron <fedor-miron@yandex-team.com> | 2023-06-06 14:48:24 +0300 |
---|---|---|
committer | fedor-miron <fedor-miron@yandex-team.com> | 2023-06-06 14:48:24 +0300 |
commit | 440ce83181e1a979be7ca865667b28c5144d883b (patch) | |
tree | 6c1a5835a6b29c9e68d2b79d530dc56e75d4a08c | |
parent | 7f8e5bba976bab99984226a4d4a448f178095be0 (diff) | |
download | ydb-440ce83181e1a979be7ca865667b28c5144d883b.tar.gz |
YQL-16021: support show server_version
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 |