|
@@ -1571,7 +1571,7 @@ Y_UNIT_TEST_SUITE(KqpPg) {
|
|
|
|
|
|
Y_UNIT_TEST(CreateTempTable) {
|
|
|
NKikimrConfig::TAppConfig appConfig;
|
|
|
- appConfig.MutableTableServiceConfig()->SetEnablePreparedDdl(true);;
|
|
|
+ appConfig.MutableTableServiceConfig()->SetEnablePreparedDdl(true);
|
|
|
auto setting = NKikimrKqp::TKqpSetting();
|
|
|
auto serverSettings = TKikimrSettings()
|
|
|
.SetAppConfig(appConfig)
|
|
@@ -2271,6 +2271,179 @@ Y_UNIT_TEST_SUITE(KqpPg) {
|
|
|
CompareYson(R"([["6"]])", FormatResultSetYson(result.GetResultSet(0)));
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ Y_UNIT_TEST(InsertNoTargetColumns_Simple) {
|
|
|
+ NKikimrConfig::TAppConfig appConfig;
|
|
|
+ appConfig.MutableTableServiceConfig()->SetEnablePreparedDdl(true);
|
|
|
+ auto setting = NKikimrKqp::TKqpSetting();
|
|
|
+ auto serverSettings = TKikimrSettings()
|
|
|
+ .SetAppConfig(appConfig)
|
|
|
+ .SetKqpSettings({setting});
|
|
|
+ TKikimrRunner kikimr(serverSettings.SetWithSampleTables(false));
|
|
|
+ auto db = kikimr.GetQueryClient();
|
|
|
+ auto settings = NYdb::NQuery::TExecuteQuerySettings().Syntax(NYdb::NQuery::ESyntax::Pg);
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ CREATE TABLE t(columnA int4, columnB text, primary key(columnA));
|
|
|
+ )", NYdb::NQuery::TTxControl::NoTx(), settings).ExtractValueSync();
|
|
|
+ UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
|
|
|
+ }
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ INSERT INTO t VALUES (1, 'a'), (2, 'b'), (3, 'c');
|
|
|
+ )", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync();
|
|
|
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
|
|
|
+ }
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ SELECT * FROM t;
|
|
|
+ )", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).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";"a"];["2";"b"];["3";"c"]]
|
|
|
+ )", FormatResultSetYson(result.GetResultSet(0)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Y_UNIT_TEST(InsertNoTargetColumns_ColumnOrder) {
|
|
|
+ NKikimrConfig::TAppConfig appConfig;
|
|
|
+ appConfig.MutableTableServiceConfig()->SetEnablePreparedDdl(true);
|
|
|
+ auto setting = NKikimrKqp::TKqpSetting();
|
|
|
+ auto serverSettings = TKikimrSettings()
|
|
|
+ .SetAppConfig(appConfig)
|
|
|
+ .SetKqpSettings({setting});
|
|
|
+ TKikimrRunner kikimr(serverSettings.SetWithSampleTables(false));
|
|
|
+ auto db = kikimr.GetQueryClient();
|
|
|
+ auto settings = NYdb::NQuery::TExecuteQuerySettings().Syntax(NYdb::NQuery::ESyntax::Pg);
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ CREATE TABLE t(columnC int4, columnA text, columnB text, primary key(columnC));
|
|
|
+ )", NYdb::NQuery::TTxControl::NoTx(), settings).ExtractValueSync();
|
|
|
+ UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
|
|
|
+ }
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ INSERT INTO t VALUES (1, 'a', 'b'), (2, 'c', 'd'), (3, 'e', 'f');
|
|
|
+ )", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync();
|
|
|
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
|
|
|
+ }
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ SELECT * FROM t;
|
|
|
+ )", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).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";"a";"b"];["2";"c";"d"];["3";"e";"f"]]
|
|
|
+ )", FormatResultSetYson(result.GetResultSet(0)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Y_UNIT_TEST(InsertNoTargetColumns_Incorrect) {
|
|
|
+ NKikimrConfig::TAppConfig appConfig;
|
|
|
+ appConfig.MutableTableServiceConfig()->SetEnablePreparedDdl(true);
|
|
|
+ auto setting = NKikimrKqp::TKqpSetting();
|
|
|
+ auto serverSettings = TKikimrSettings()
|
|
|
+ .SetAppConfig(appConfig)
|
|
|
+ .SetKqpSettings({setting});
|
|
|
+ TKikimrRunner kikimr(serverSettings.SetWithSampleTables(false));
|
|
|
+ auto db = kikimr.GetQueryClient();
|
|
|
+ auto settings = NYdb::NQuery::TExecuteQuerySettings().Syntax(NYdb::NQuery::ESyntax::Pg);
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ CREATE TABLE t(id int4, value text, primary key(id));
|
|
|
+ )", NYdb::NQuery::TTxControl::NoTx(), settings).ExtractValueSync();
|
|
|
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
|
|
|
+
|
|
|
+ result = db.ExecuteQuery(R"(
|
|
|
+ CREATE TABLE nopg(id uint64, primary key(id));
|
|
|
+ )", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
|
|
|
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
|
|
|
+ }
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ INSERT INTO t VALUES (1);
|
|
|
+ )", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync();
|
|
|
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
|
|
|
+ UNIT_ASSERT(result.GetIssues().ToString().Contains("VALUES have 1 columns, INSERT INTO expects: 2"));
|
|
|
+ }
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ INSERT INTO t VALUES (1, 'a', 'a');
|
|
|
+ )", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync();
|
|
|
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
|
|
|
+ UNIT_ASSERT(result.GetIssues().ToString().Contains("VALUES have 3 columns, INSERT INTO expects: 2"));
|
|
|
+ }
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ INSERT INTO t VALUES ('a', 1);
|
|
|
+ )", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync();
|
|
|
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
|
|
|
+ UNIT_ASSERT(result.GetIssues().ToString().Contains("Failed to convert 'id': pgtext to pgint4"));
|
|
|
+ }
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ INSERT INTO nopg VALUES ('a');
|
|
|
+ )", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync();
|
|
|
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
|
|
|
+ UNIT_ASSERT(result.GetIssues().ToString().Contains("Failed to convert 'id': pgtext to Optional<Uint64>"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Y_UNIT_TEST(InsertNoTargetColumns_Alter) {
|
|
|
+ NKikimrConfig::TAppConfig appConfig;
|
|
|
+ appConfig.MutableTableServiceConfig()->SetEnablePreparedDdl(true);
|
|
|
+ auto setting = NKikimrKqp::TKqpSetting();
|
|
|
+ auto serverSettings = TKikimrSettings()
|
|
|
+ .SetAppConfig(appConfig)
|
|
|
+ .SetKqpSettings({setting});
|
|
|
+ TKikimrRunner kikimr(serverSettings.SetWithSampleTables(false));
|
|
|
+ auto db = kikimr.GetQueryClient();
|
|
|
+ auto tableClient = kikimr.GetTableClient();
|
|
|
+ auto settings = NYdb::NQuery::TExecuteQuerySettings().Syntax(NYdb::NQuery::ESyntax::Pg);
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ CREATE TABLE t(columnB int4, columnA int4, columnC text, primary key(columnA));
|
|
|
+ )", NYdb::NQuery::TTxControl::NoTx(), settings).ExtractValueSync();
|
|
|
+ UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
|
|
|
+ }
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ INSERT INTO t VALUES (1, 1, 'a'), (2, 2, 'b');
|
|
|
+ )", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync();
|
|
|
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
|
|
|
+ }
|
|
|
+ {
|
|
|
+ auto session = tableClient.CreateSession().GetValueSync().GetSession();
|
|
|
+ auto result = session.ExecuteSchemeQuery(R"(
|
|
|
+ ALTER TABLE t DROP COLUMN columnB;
|
|
|
+ )").ExtractValueSync();
|
|
|
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
|
|
|
+ }
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ INSERT INTO t VALUES (3, 'c');
|
|
|
+ )", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync();
|
|
|
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
|
|
|
+ }
|
|
|
+ {
|
|
|
+ auto result = db.ExecuteQuery(R"(
|
|
|
+ SELECT * FROM t;
|
|
|
+ )", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).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";"a"];["2";"b"];["3";"c"]]
|
|
|
+ )", FormatResultSetYson(result.GetResultSet(0)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
} // namespace NKqp
|