From b23413733232926594299c974f6be0dd84ef3c60 Mon Sep 17 00:00:00 2001 From: Nikolay Shumkov Date: Tue, 16 Apr 2024 12:44:03 +0300 Subject: [PATCH] Support drop sequence in pg parser (#3733) --- ydb/library/yql/sql/pg/pg_sql.cpp | 43 ++++++++++++++++++++++++++++ ydb/library/yql/sql/pg/pg_sql_ut.cpp | 14 +++++++++ 2 files changed, 57 insertions(+) diff --git a/ydb/library/yql/sql/pg/pg_sql.cpp b/ydb/library/yql/sql/pg/pg_sql.cpp index 782c2e2205b3..9d4e998ad7c7 100644 --- a/ydb/library/yql/sql/pg/pg_sql.cpp +++ b/ydb/library/yql/sql/pg/pg_sql.cpp @@ -2091,6 +2091,9 @@ class TConverter : public IPGParseEvents { case OBJECT_INDEX: { return ParseDropIndexStmt(value, nameListNodes); } + case OBJECT_SEQUENCE: { + return ParseDropSequenceStmt(value, nameListNodes); + } default: { AddError("Not supported object type for DROP"); return nullptr; @@ -2207,6 +2210,46 @@ class TConverter : public IPGParseEvents { return State.Statements.back(); } + TAstNode* ParseDropSequenceStmt(const DropStmt* value, const TVector& names) { + if (value->behavior == DROP_CASCADE) { + AddError("CASCADE is not implemented"); + return nullptr; + } + + if (names.size() != 1) { + AddError("DROP SEQUENCE requires exactly one sequence"); + return nullptr; + } + + for (const auto& nameList : names) { + const auto [clusterName, indexName] = getSchemaAndObjectName(nameList); + const auto [sink, key] = ParseQualifiedPgObjectName( + /* catalogName */ "", + clusterName, + indexName, + "pgSequence" + ); + + TString mode = (value->missing_ok) ? "drop_if_exists" : "drop"; + State.Statements.push_back(L( + A("let"), + A("world"), + L( + A("Write!"), + A("world"), + sink, + key, + L(A("Void")), + QL( + QL(QA("mode"), QA(mode)) + ) + ) + )); + } + + return State.Statements.back(); + } + [[nodiscard]] TAstNode* ParseVariableSetStmt(const VariableSetStmt* value, bool isSetConfig = false) { if (value->kind != VAR_SET_VALUE) { diff --git a/ydb/library/yql/sql/pg/pg_sql_ut.cpp b/ydb/library/yql/sql/pg/pg_sql_ut.cpp index 0b9f30529d33..f4e1e33eb51e 100644 --- a/ydb/library/yql/sql/pg/pg_sql_ut.cpp +++ b/ydb/library/yql/sql/pg/pg_sql_ut.cpp @@ -282,6 +282,20 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) { UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString()); } + Y_UNIT_TEST(DropSequenceStmt) { + auto res = PgSqlToYql("DROP SEQUENCE IF EXISTS seq;"); + UNIT_ASSERT_C(res.Root, res.Issues.ToString()); + TString program = R"( + ( + (let world (Configure! world (DataSource 'config) 'OrderedColumns)) (let world (Write! world (DataSink '"kikimr" '"") (Key '('pgObject (String '"seq") (String 'pgSequence))) (Void) '('('mode 'drop_if_exists)))) + (let world (CommitAll! world)) + (return world) + ) + )"; + 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);