Skip to content

Commit 19e374f

Browse files
committed
More tests for CTAS (#9497)
1 parent a7e8722 commit 19e374f

File tree

4 files changed

+379
-2
lines changed

4 files changed

+379
-2
lines changed

ydb/core/kqp/session_actor/kqp_session_actor.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,8 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
856856
QueryState->TxCtx->HasOlapTable |= ::NKikimr::NKqp::HasOlapTableReadInTx(phyQuery) || ::NKikimr::NKqp::HasOlapTableWriteInTx(phyQuery);
857857
QueryState->TxCtx->HasOltpTable |= ::NKikimr::NKqp::HasOltpTableReadInTx(phyQuery) || ::NKikimr::NKqp::HasOltpTableWriteInTx(phyQuery);
858858
QueryState->TxCtx->HasTableWrite |= ::NKikimr::NKqp::HasOlapTableWriteInTx(phyQuery) || ::NKikimr::NKqp::HasOltpTableWriteInTx(phyQuery);
859-
if (QueryState->TxCtx->HasOlapTable && QueryState->TxCtx->HasOltpTable && QueryState->TxCtx->HasTableWrite && !Settings.TableService.GetEnableHtapTx()) {
859+
if (QueryState->TxCtx->HasOlapTable && QueryState->TxCtx->HasOltpTable && QueryState->TxCtx->HasTableWrite
860+
&& !Settings.TableService.GetEnableHtapTx() && !QueryState->IsSplitted()) {
860861
ReplyQueryError(Ydb::StatusIds::PRECONDITION_FAILED,
861862
"Write transactions between column and row tables are disabled at current time.");
862863
return false;

ydb/core/kqp/ut/query/kqp_query_ut.cpp

Lines changed: 234 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1707,7 +1707,8 @@ Y_UNIT_TEST_SUITE(KqpQuery) {
17071707
appConfig.MutableTableServiceConfig()->SetEnablePerStatementQueryExecution(true);
17081708
auto settings = TKikimrSettings()
17091709
.SetAppConfig(appConfig)
1710-
.SetWithSampleTables(false);
1710+
.SetWithSampleTables(false)
1711+
.SetEnableTempTables(true);
17111712
TKikimrRunner kikimr(settings);
17121713

17131714
auto client = kikimr.GetQueryClient();
@@ -1872,6 +1873,238 @@ Y_UNIT_TEST_SUITE(KqpQuery) {
18721873
CompareYson(R"([[8u]])", FormatResultSetYson(it.GetResultSet(0)));
18731874
}
18741875
}
1876+
1877+
Y_UNIT_TEST(CreateAsSelect_BadCases) {
1878+
NKikimrConfig::TAppConfig appConfig;
1879+
appConfig.MutableTableServiceConfig()->SetEnableOlapSink(true);
1880+
appConfig.MutableTableServiceConfig()->SetEnableOltpSink(false);
1881+
appConfig.MutableTableServiceConfig()->SetEnableHtapTx(false);
1882+
appConfig.MutableTableServiceConfig()->SetEnableCreateTableAs(true);
1883+
appConfig.MutableTableServiceConfig()->SetEnablePerStatementQueryExecution(false);
1884+
auto settings = TKikimrSettings()
1885+
.SetAppConfig(appConfig)
1886+
.SetWithSampleTables(false)
1887+
.SetEnableTempTables(true);
1888+
TKikimrRunner kikimr(settings);
1889+
1890+
const TString query = R"(
1891+
CREATE TABLE `/Root/ColSrc` (
1892+
Col1 Uint64 NOT NULL,
1893+
Col2 Int32,
1894+
PRIMARY KEY (Col1)
1895+
)
1896+
PARTITION BY HASH(Col1)
1897+
WITH (STORE = COLUMN, AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 10);
1898+
1899+
CREATE TABLE `/Root/RowSrc` (
1900+
Col1 Uint64 NOT NULL,
1901+
Col2 Int32,
1902+
PRIMARY KEY (Col1)
1903+
)
1904+
WITH (STORE = ROW, AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 10);
1905+
)";
1906+
1907+
auto client = kikimr.GetQueryClient();
1908+
auto result = client.ExecuteQuery(query, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1909+
UNIT_ASSERT_C(result.GetStatus() == NYdb::EStatus::SUCCESS, result.GetIssues().ToString());
1910+
1911+
{
1912+
auto prepareResult = client.ExecuteQuery(R"(
1913+
REPLACE INTO `/Root/ColSrc` (Col1, Col2) VALUES (1u, 1), (100u, 100), (10u, 10);
1914+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
1915+
UNIT_ASSERT_C(prepareResult.IsSuccess(), prepareResult.GetIssues().ToString());
1916+
}
1917+
1918+
{
1919+
auto prepareResult = client.ExecuteQuery(R"(
1920+
REPLACE INTO `/Root/RowSrc` (Col1, Col2) VALUES (1u, 1), (100u, 100), (10u, 10);
1921+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
1922+
UNIT_ASSERT_C(prepareResult.IsSuccess(), prepareResult.GetIssues().ToString());
1923+
}
1924+
1925+
{
1926+
auto result = client.ExecuteQuery(R"(
1927+
CREATE OR REPLACE TABLE `/Root/RowDst` (
1928+
PRIMARY KEY (Col1)
1929+
)
1930+
WITH (STORE = ROW) AS
1931+
SELECT * FROM `/Root/RowSrc`;
1932+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1933+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
1934+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "OR REPLACE feature is supported only for EXTERNAL DATA SOURCE and EXTERNAL TABLE", result.GetIssues().ToString());
1935+
}
1936+
1937+
{
1938+
auto result = client.ExecuteQuery(R"(
1939+
CREATE IF NOT EXISTS TABLE `/Root/RowDst` (
1940+
PRIMARY KEY (Col1)
1941+
)
1942+
WITH (STORE = ROW) AS
1943+
SELECT * FROM `/Root/RowSrc`;
1944+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1945+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
1946+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Unexpected token", result.GetIssues().ToString());
1947+
}
1948+
1949+
{
1950+
auto result = client.ExecuteQuery(R"(
1951+
CREATE TABLE `/Root/RowDst` (
1952+
INDEX idx GLOBAL ON Col2,
1953+
PRIMARY KEY (Col1)
1954+
)
1955+
WITH (STORE = ROW) AS
1956+
SELECT * FROM `/Root/RowSrc`;
1957+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1958+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
1959+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Unexpected token", result.GetIssues().ToString());
1960+
}
1961+
1962+
{
1963+
auto result = client.ExecuteQuery(R"(
1964+
CREATE TABLE `/Root/RowDst` (
1965+
PRIMARY KEY (Col1)
1966+
)
1967+
WITH (STORE = ROW) AS
1968+
SELECT Col1, 1 / (Col2 - 100) As Col2 FROM `/Root/RowSrc`;
1969+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1970+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1971+
1972+
result = client.ExecuteQuery(R"(
1973+
SELECT * FROM `/Root/RowDst` ORDER BY Col1;
1974+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1975+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1976+
CompareYson(R"([[[1u];[0]];[[10u];[0]];[[100u];#]])", FormatResultSetYson(result.GetResultSet(0)));
1977+
1978+
result = client.ExecuteQuery(R"(
1979+
DROP TABLE `/Root/RowDst`;
1980+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1981+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1982+
}
1983+
1984+
{
1985+
auto result = client.ExecuteQuery(R"(
1986+
CREATE TABLE `/Root/RowDst` (
1987+
PRIMARY KEY (Col1)
1988+
)
1989+
WITH (STORE = ROW) AS
1990+
SELECT Col2 AS Col1, Col1 As Col2 FROM `/Root/RowSrc`;
1991+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1992+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1993+
1994+
result = client.ExecuteQuery(R"(
1995+
SELECT * FROM `/Root/RowDst`;
1996+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1997+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1998+
1999+
2000+
result = client.ExecuteQuery(R"(
2001+
DROP TABLE `/Root/RowDst`;
2002+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2003+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
2004+
}
2005+
2006+
{
2007+
auto result = client.ExecuteQuery(R"(
2008+
CREATE TABLE `/Root/ColDst` (
2009+
PRIMARY KEY (Col1)
2010+
)
2011+
WITH (STORE = COLUMN) AS
2012+
SELECT Col2 AS Col1, Col1 As Col2 FROM `/Root/ColSrc`;
2013+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2014+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
2015+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Can't set NULL or optional value to not null column: Col1.", result.GetIssues().ToString());
2016+
2017+
result = client.ExecuteQuery(R"(
2018+
SELECT * FROM `/Root/ColDst`;
2019+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2020+
// TODO: Wait for RENAME from columnshards
2021+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
2022+
2023+
result = client.ExecuteQuery(R"(
2024+
DROP TABLE `/Root/ColDst`;
2025+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2026+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
2027+
}
2028+
2029+
{
2030+
auto result = client.ExecuteQuery(R"(
2031+
CREATE TABLE `/Root/ColDst` (
2032+
PRIMARY KEY (Col1)
2033+
)
2034+
WITH (STORE = COLUMN) AS
2035+
SELECT Unwrap(Col2) AS Col1, Col1 As Col2 FROM `/Root/ColSrc`;
2036+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2037+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
2038+
2039+
result = client.ExecuteQuery(R"(
2040+
SELECT * FROM `/Root/ColDst`;
2041+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2042+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
2043+
2044+
result = client.ExecuteQuery(R"(
2045+
DROP TABLE `/Root/ColDst`;
2046+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2047+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
2048+
}
2049+
2050+
{
2051+
auto result = client.ExecuteQuery(R"(
2052+
CREATE TABLE `/Root/RowlDst` (
2053+
PRIMARY KEY (Col1)
2054+
)
2055+
WITH (STORE = COLUMN) AS
2056+
SELECT NotFound AS Col1, Col1 As Col2 FROM `/Root/RowSrc`;
2057+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2058+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
2059+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "not found", result.GetIssues().ToString());
2060+
}
2061+
2062+
{
2063+
auto result = client.ExecuteQuery(R"(
2064+
CREATE TABLE `/Root/RowSrc` (
2065+
PRIMARY KEY (Col1)
2066+
)
2067+
WITH (STORE = ROW) AS
2068+
SELECT 1 AS Col1, 2 As Col2;
2069+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2070+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
2071+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "path exist", result.GetIssues().ToString());
2072+
}
2073+
2074+
{
2075+
auto result = client.ExecuteQuery(R"(
2076+
CREATE TABLE `/Root/RowDst` (
2077+
PRIMARY KEY (Col1)
2078+
)
2079+
WITH (STORE = ROW) AS
2080+
SELECT * FROM `/Root/ColSrc`;
2081+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2082+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
2083+
2084+
result = client.ExecuteQuery(R"(
2085+
SELECT COUNT(*) FROM `/Root/RowDst`;
2086+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2087+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
2088+
CompareYson(R"([[3u]])", FormatResultSetYson(result.GetResultSet(0)));
2089+
}
2090+
2091+
{
2092+
auto result = client.ExecuteQuery(R"(
2093+
CREATE TABLE `/Root/ColDst` (
2094+
PRIMARY KEY (Col1)
2095+
)
2096+
WITH (STORE = ROW) AS
2097+
SELECT * FROM `/Root/RowSrc`;
2098+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2099+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
2100+
2101+
result = client.ExecuteQuery(R"(
2102+
SELECT COUNT(*) FROM `/Root/ColDst`;
2103+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2104+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
2105+
CompareYson(R"([[3u]])", FormatResultSetYson(result.GetResultSet(0)));
2106+
}
2107+
}
18752108
}
18762109

18772110
} // namespace NKqp

ydb/core/kqp/ut/service/kqp_qs_queries_ut.cpp

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4075,6 +4075,7 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
40754075
NKikimrConfig::TAppConfig appConfig;
40764076
appConfig.MutableTableServiceConfig()->SetEnableOlapSink(true);
40774077
appConfig.MutableTableServiceConfig()->SetEnableOltpSink(true);
4078+
appConfig.MutableTableServiceConfig()->SetEnableHtapTx(false);
40784079
auto settings = TKikimrSettings()
40794080
.SetAppConfig(appConfig)
40804081
.SetWithSampleTables(false);
@@ -4486,6 +4487,83 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
44864487
CompareYson(R"([[1u;["test1"];10];[2u;["test2"];11];[3u;["test3"];12];[4u;#;13];[101u;["test1"];10];[102u;["test2"];11];[103u;["test3"];12];[104u;#;13]])", FormatResultSetYson(result.GetResultSet(1)));
44874488
}
44884489
}
4490+
4491+
Y_UNIT_TEST(MixedReadQueryWithoutStreamLookup) {
4492+
NKikimrConfig::TAppConfig appConfig;
4493+
appConfig.MutableTableServiceConfig()->SetEnableOlapSink(true);
4494+
appConfig.MutableTableServiceConfig()->SetEnableOltpSink(false);
4495+
appConfig.MutableTableServiceConfig()->SetEnableHtapTx(false);
4496+
appConfig.MutableTableServiceConfig()->SetEnableKqpDataQueryStreamLookup(false);
4497+
4498+
auto settings = TKikimrSettings()
4499+
.SetAppConfig(appConfig)
4500+
.SetWithSampleTables(false);
4501+
4502+
TKikimrRunner kikimr(settings);
4503+
Tests::NCommon::TLoggerInit(kikimr).Initialize();
4504+
4505+
auto client = kikimr.GetQueryClient();
4506+
4507+
{
4508+
auto createTable = client.ExecuteQuery(R"sql(
4509+
CREATE TABLE `/Root/DataShard` (
4510+
Col1 Uint64 NOT NULL,
4511+
Col2 Int32 NOT NULL,
4512+
Col3 String,
4513+
PRIMARY KEY (Col1, Col2)
4514+
) WITH (STORE = ROW);
4515+
CREATE TABLE `/Root/ColumnShard` (
4516+
Col1 Uint64 NOT NULL,
4517+
Col2 Int32 NOT NULL,
4518+
Col3 String,
4519+
PRIMARY KEY (Col1, Col2)
4520+
) WITH (STORE = COLUMN);
4521+
)sql", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
4522+
UNIT_ASSERT_C(createTable.IsSuccess(), createTable.GetIssues().ToString());
4523+
}
4524+
4525+
{
4526+
auto replaceValues = client.ExecuteQuery(R"sql(
4527+
REPLACE INTO `/Root/DataShard` (Col1, Col2, Col3) VALUES
4528+
(1u, 1, "row"), (1u, 2, "row"), (1u, 3, "row"), (2u, 3, "row");
4529+
)sql", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4530+
UNIT_ASSERT_C(replaceValues.IsSuccess(), replaceValues.GetIssues().ToString());
4531+
}
4532+
{
4533+
auto replaceValues = client.ExecuteQuery(R"sql(
4534+
REPLACE INTO `/Root/ColumnShard` (Col1, Col2, Col3) VALUES
4535+
(1u, 1, "row"), (1u, 2, "row"), (1u, 3, "row"), (2u, 3, "row");
4536+
)sql", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4537+
UNIT_ASSERT_C(replaceValues.IsSuccess(), replaceValues.GetIssues().ToString());
4538+
}
4539+
4540+
{
4541+
auto it = client.StreamExecuteQuery(R"sql(
4542+
SELECT Col3 FROM `/Root/DataShard` WHERE Col1 = 1u
4543+
UNION ALL
4544+
SELECT Col3 FROM `/Root/ColumnShard` WHERE Col1 = 1u;
4545+
)sql", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4546+
UNIT_ASSERT_VALUES_EQUAL_C(it.GetStatus(), EStatus::SUCCESS, it.GetIssues().ToString());
4547+
TString output = StreamResultToYson(it);
4548+
CompareYson(
4549+
output,
4550+
R"([[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]]])");
4551+
}
4552+
4553+
{
4554+
auto it = client.StreamExecuteQuery(R"sql(
4555+
SELECT r.Col3
4556+
FROM `/Root/DataShard` AS r
4557+
JOIN `/Root/ColumnShard` AS c
4558+
ON r.Col1 = c.Col1;
4559+
)sql", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4560+
UNIT_ASSERT_VALUES_EQUAL_C(it.GetStatus(), EStatus::SUCCESS, it.GetIssues().ToString());
4561+
TString output = StreamResultToYson(it);
4562+
CompareYson(
4563+
output,
4564+
R"([[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]]])");
4565+
}
4566+
}
44894567
}
44904568

44914569
} // namespace NKqp

0 commit comments

Comments
 (0)