|
@@ -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);
|