Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
216 changes: 216 additions & 0 deletions ydb/core/kqp/ut/pg/kqp_pg_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3678,6 +3678,222 @@ Y_UNIT_TEST_SUITE(KqpPg) {
}
}

Y_UNIT_TEST(AlterColumnSetDefaultFromSequenceWithSchemaname) {
NKikimrConfig::TAppConfig appConfig;
appConfig.MutableTableServiceConfig()->SetEnablePreparedDdl(true);;
appConfig.MutableTableServiceConfig()->SetEnableSequences(true);
auto setting = NKikimrKqp::TKqpSetting();
auto serverSettings = TKikimrSettings()
.SetAppConfig(appConfig)
.SetKqpSettings({setting});
TKikimrRunner kikimr(
serverSettings.SetWithSampleTables(false));
auto clientConfig = NGRpcProxy::TGRpcClientConfig(kikimr.GetEndpoint());
auto client = kikimr.GetQueryClient();

auto session = client.GetSession().GetValueSync().GetSession();

auto tableClient = kikimr.GetTableClient();
auto tableClientSession = tableClient.CreateSession().GetValueSync().GetSession();

{
auto result = session.ExecuteQuery(R"(
--!syntax_pg
CREATE TABLE public.Pg (
key int8 PRIMARY KEY,
value int8
);
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
}

{
const auto query = Q_(R"(
--!syntax_pg
INSERT INTO Pg (key, value) values (1, 1);
)");

auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
}

{
const auto query = Q_(R"(
--!syntax_pg
SELECT * FROM public.Pg;
)");

auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());

UNIT_ASSERT_C(!result.GetResultSets().empty(), "results are empty");
CompareYson(R"(
[["1";"1"]]
)", FormatResultSetYson(result.GetResultSet(0)));
}

{
auto result = session.ExecuteQuery(R"(
--!syntax_pg
ALTER TABLE Pg ALTER COLUMN key SET DEFAULT nextval('seq');
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
UNIT_ASSERT(!result.IsSuccess());
}

{
const auto queryCreate = R"(
--!syntax_pg
CREATE SEQUENCE IF NOT EXISTS seq1
START WITH 10
INCREMENT BY 2
MINVALUE 1
CACHE 3
CYCLE;
)";

auto resultCreate = session.ExecuteQuery(queryCreate, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
UNIT_ASSERT_C(resultCreate.IsSuccess(), resultCreate.GetIssues().ToString());
}

{
auto result = session.ExecuteQuery(R"(
--!syntax_pg
ALTER TABLE Pg ALTER COLUMN key SET DEFAULT nextval('public.seq1'::regclass);
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
}

{
auto runtime = kikimr.GetTestServer().GetRuntime();
TActorId sender = runtime->AllocateEdgeActor();
auto describeResult = DescribeTable(&kikimr.GetTestServer(), sender, "/Root/Pg");
UNIT_ASSERT_VALUES_EQUAL(describeResult.GetStatus(), NKikimrScheme::StatusSuccess);
const auto& tableDescription = describeResult.GetPathDescription().GetTable();

for (const auto& column: tableDescription.GetColumns()) {
if (column.GetName() == "key") {
UNIT_ASSERT(column.HasDefaultFromSequence());
UNIT_ASSERT(column.GetDefaultFromSequence() == "/Root/seq1");
break;
}
}
}

{
const auto query = Q_(R"(
--!syntax_pg
INSERT INTO Pg (value) values (2), (3);
)");

auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
}

{
const auto query = Q_(R"(
--!syntax_pg
SELECT * FROM public.Pg;
)");

auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());

UNIT_ASSERT_C(!result.GetResultSets().empty(), "results are empty");
CompareYson(R"(
[["1";"1"];["10";"2"];["12";"3"]]
)", FormatResultSetYson(result.GetResultSet(0)));
}

{
const auto queryCreate = R"(
--!syntax_pg
CREATE SEQUENCE IF NOT EXISTS public.seq2
START WITH 5
INCREMENT BY 3
MINVALUE 1
CACHE 3
CYCLE;
)";

auto resultCreate = session.ExecuteQuery(queryCreate, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
UNIT_ASSERT_C(resultCreate.IsSuccess(), resultCreate.GetIssues().ToString());
}

{
auto result = session.ExecuteQuery(R"(
--!syntax_pg
ALTER TABLE Pg ALTER COLUMN key SET DEFAULT nextval('seq2');
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
}

{
const auto query = Q_(R"(
--!syntax_pg
INSERT INTO Pg (value) values (4), (5);
)");

auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
}

{
const auto query = Q_(R"(
--!syntax_pg
SELECT * FROM public.Pg;
)");

auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());

UNIT_ASSERT_C(!result.GetResultSets().empty(), "results are empty");
CompareYson(R"(
[["1";"1"];["5";"4"];["8";"5"];["10";"2"];["12";"3"]]
)", FormatResultSetYson(result.GetResultSet(0)));
}

{
auto result = session.ExecuteQuery(R"(
--!syntax_pg
ALTER TABLE Pg ALTER COLUMN key DROP DEFAULT;
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
}

{
auto result = session.ExecuteQuery(R"(
--!syntax_pg
ALTER TABLE Pg ALTER COLUMN value SET DEFAULT nextval('public.seq1');
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
}

{
const auto query = Q_(R"(
--!syntax_pg
INSERT INTO public.Pg (key) values (13), (14);
)");

auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
}

{
const auto query = Q_(R"(
--!syntax_pg
SELECT * FROM public.Pg;
)");

auto result = tableClientSession.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());

UNIT_ASSERT_C(!result.GetResultSets().empty(), "results are empty");
CompareYson(R"(
[["1";"1"];["5";"4"];["8";"5"];["10";"2"];["12";"3"];["13";"14"];["14";"16"]]
)", FormatResultSetYson(result.GetResultSet(0)));
}
}

Y_UNIT_TEST(DropTableIfExists_GenericQuery) {
NKikimrConfig::TAppConfig appConfig;
appConfig.MutableTableServiceConfig()->SetEnablePreparedDdl(true);
Expand Down
10 changes: 8 additions & 2 deletions ydb/library/yql/sql/pg/pg_sql.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ extern "C" {
#include <util/string/builder.h>
#include <util/string/cast.h>
#include <util/string/join.h>
#include <util/string/split.h>
#include <util/generic/scope.h>
#include <util/generic/stack.h>
#include <util/generic/hash_set.h>
Expand Down Expand Up @@ -3023,8 +3024,13 @@ class TConverter : public IPGParseEvents {
return nullptr;
}
auto seqName = StrVal(localConst->val);

alterColumns.push_back(QL(QAX(colName), QL(QA("setDefault"), QL(QA("nextval"), QA(seqName)))));
TVector<TString> seqNameList;
Split(seqName, ".", seqNameList);
if (seqNameList.size() != 2 && seqNameList.size() != 1) {
AddError(TStringBuilder() << "Expected list size is 1 or 2, but there are " << seqNameList.size());
return nullptr;
}
alterColumns.push_back(QL(QAX(colName), QL(QA("setDefault"), QL(QA("nextval"), QA(seqNameList.back())))));
break;
}
default:
Expand Down
15 changes: 15 additions & 0 deletions ydb/library/yql/sql/pg/pg_sql_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,21 @@ Y_UNIT_TEST_SUITE(PgSqlParsingOnly) {
UNIT_ASSERT_STRINGS_EQUAL(res.Root->ToString(), expectedAst.Root->ToString());
}

Y_UNIT_TEST(AlterTableSetDefaultNextvalStmtWithSchemaname) {
auto res = PgSqlToYql("ALTER TABLE public.t ALTER COLUMN id SET DEFAULT nextval('public.seq'::regclass);");
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 '('tablescheme (String '"t"))) (Void) '('('mode 'alter) '('actions '('('alterColumns '('('"id" '('setDefault '('nextval 'seq))))))))))
(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(AlterTableStmtWithCast) {
auto res = PgSqlToYql("ALTER TABLE public.t ALTER COLUMN id SET DEFAULT nextval('seq'::regclass);");
UNIT_ASSERT_C(res.Root, res.Issues.ToString());
Expand Down