Skip to content

Commit 8d954a5

Browse files
authored
More tests for CTAS (#9497)
1 parent dc2ef5c commit 8d954a5

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
@@ -857,7 +857,8 @@ class TKqpSessionActor : public TActorBootstrapped<TKqpSessionActor> {
857857
QueryState->TxCtx->HasOlapTable |= ::NKikimr::NKqp::HasOlapTableReadInTx(phyQuery) || ::NKikimr::NKqp::HasOlapTableWriteInTx(phyQuery);
858858
QueryState->TxCtx->HasOltpTable |= ::NKikimr::NKqp::HasOltpTableReadInTx(phyQuery) || ::NKikimr::NKqp::HasOltpTableWriteInTx(phyQuery);
859859
QueryState->TxCtx->HasTableWrite |= ::NKikimr::NKqp::HasOlapTableWriteInTx(phyQuery) || ::NKikimr::NKqp::HasOltpTableWriteInTx(phyQuery);
860-
if (QueryState->TxCtx->HasOlapTable && QueryState->TxCtx->HasOltpTable && QueryState->TxCtx->HasTableWrite && !Settings.TableService.GetEnableHtapTx()) {
860+
if (QueryState->TxCtx->HasOlapTable && QueryState->TxCtx->HasOltpTable && QueryState->TxCtx->HasTableWrite
861+
&& !Settings.TableService.GetEnableHtapTx() && !QueryState->IsSplitted()) {
861862
ReplyQueryError(Ydb::StatusIds::PRECONDITION_FAILED,
862863
"Write transactions between column and row tables are disabled at current time.");
863864
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
@@ -1614,7 +1614,8 @@ Y_UNIT_TEST_SUITE(KqpQuery) {
16141614
appConfig.MutableTableServiceConfig()->SetEnablePerStatementQueryExecution(true);
16151615
auto settings = TKikimrSettings()
16161616
.SetAppConfig(appConfig)
1617-
.SetWithSampleTables(false);
1617+
.SetWithSampleTables(false)
1618+
.SetEnableTempTables(true);
16181619
TKikimrRunner kikimr(settings);
16191620

16201621
auto client = kikimr.GetQueryClient();
@@ -1779,6 +1780,238 @@ Y_UNIT_TEST_SUITE(KqpQuery) {
17791780
CompareYson(R"([[8u]])", FormatResultSetYson(it.GetResultSet(0)));
17801781
}
17811782
}
1783+
1784+
Y_UNIT_TEST(CreateAsSelect_BadCases) {
1785+
NKikimrConfig::TAppConfig appConfig;
1786+
appConfig.MutableTableServiceConfig()->SetEnableOlapSink(true);
1787+
appConfig.MutableTableServiceConfig()->SetEnableOltpSink(false);
1788+
appConfig.MutableTableServiceConfig()->SetEnableHtapTx(false);
1789+
appConfig.MutableTableServiceConfig()->SetEnableCreateTableAs(true);
1790+
appConfig.MutableTableServiceConfig()->SetEnablePerStatementQueryExecution(false);
1791+
auto settings = TKikimrSettings()
1792+
.SetAppConfig(appConfig)
1793+
.SetWithSampleTables(false)
1794+
.SetEnableTempTables(true);
1795+
TKikimrRunner kikimr(settings);
1796+
1797+
const TString query = R"(
1798+
CREATE TABLE `/Root/ColSrc` (
1799+
Col1 Uint64 NOT NULL,
1800+
Col2 Int32,
1801+
PRIMARY KEY (Col1)
1802+
)
1803+
PARTITION BY HASH(Col1)
1804+
WITH (STORE = COLUMN, AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 10);
1805+
1806+
CREATE TABLE `/Root/RowSrc` (
1807+
Col1 Uint64 NOT NULL,
1808+
Col2 Int32,
1809+
PRIMARY KEY (Col1)
1810+
)
1811+
WITH (STORE = ROW, AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 10);
1812+
)";
1813+
1814+
auto client = kikimr.GetQueryClient();
1815+
auto result = client.ExecuteQuery(query, NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1816+
UNIT_ASSERT_C(result.GetStatus() == NYdb::EStatus::SUCCESS, result.GetIssues().ToString());
1817+
1818+
{
1819+
auto prepareResult = client.ExecuteQuery(R"(
1820+
REPLACE INTO `/Root/ColSrc` (Col1, Col2) VALUES (1u, 1), (100u, 100), (10u, 10);
1821+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
1822+
UNIT_ASSERT_C(prepareResult.IsSuccess(), prepareResult.GetIssues().ToString());
1823+
}
1824+
1825+
{
1826+
auto prepareResult = client.ExecuteQuery(R"(
1827+
REPLACE INTO `/Root/RowSrc` (Col1, Col2) VALUES (1u, 1), (100u, 100), (10u, 10);
1828+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
1829+
UNIT_ASSERT_C(prepareResult.IsSuccess(), prepareResult.GetIssues().ToString());
1830+
}
1831+
1832+
{
1833+
auto result = client.ExecuteQuery(R"(
1834+
CREATE OR REPLACE TABLE `/Root/RowDst` (
1835+
PRIMARY KEY (Col1)
1836+
)
1837+
WITH (STORE = ROW) AS
1838+
SELECT * FROM `/Root/RowSrc`;
1839+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1840+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
1841+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "OR REPLACE feature is supported only for EXTERNAL DATA SOURCE and EXTERNAL TABLE", result.GetIssues().ToString());
1842+
}
1843+
1844+
{
1845+
auto result = client.ExecuteQuery(R"(
1846+
CREATE IF NOT EXISTS TABLE `/Root/RowDst` (
1847+
PRIMARY KEY (Col1)
1848+
)
1849+
WITH (STORE = ROW) AS
1850+
SELECT * FROM `/Root/RowSrc`;
1851+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1852+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
1853+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Unexpected token", result.GetIssues().ToString());
1854+
}
1855+
1856+
{
1857+
auto result = client.ExecuteQuery(R"(
1858+
CREATE TABLE `/Root/RowDst` (
1859+
INDEX idx GLOBAL ON Col2,
1860+
PRIMARY KEY (Col1)
1861+
)
1862+
WITH (STORE = ROW) AS
1863+
SELECT * FROM `/Root/RowSrc`;
1864+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1865+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
1866+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Unexpected token", result.GetIssues().ToString());
1867+
}
1868+
1869+
{
1870+
auto result = client.ExecuteQuery(R"(
1871+
CREATE TABLE `/Root/RowDst` (
1872+
PRIMARY KEY (Col1)
1873+
)
1874+
WITH (STORE = ROW) AS
1875+
SELECT Col1, 1 / (Col2 - 100) As Col2 FROM `/Root/RowSrc`;
1876+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1877+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1878+
1879+
result = client.ExecuteQuery(R"(
1880+
SELECT * FROM `/Root/RowDst` ORDER BY Col1;
1881+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1882+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1883+
CompareYson(R"([[[1u];[0]];[[10u];[0]];[[100u];#]])", FormatResultSetYson(result.GetResultSet(0)));
1884+
1885+
result = client.ExecuteQuery(R"(
1886+
DROP TABLE `/Root/RowDst`;
1887+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1888+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1889+
}
1890+
1891+
{
1892+
auto result = client.ExecuteQuery(R"(
1893+
CREATE TABLE `/Root/RowDst` (
1894+
PRIMARY KEY (Col1)
1895+
)
1896+
WITH (STORE = ROW) AS
1897+
SELECT Col2 AS Col1, Col1 As Col2 FROM `/Root/RowSrc`;
1898+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1899+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1900+
1901+
result = client.ExecuteQuery(R"(
1902+
SELECT * FROM `/Root/RowDst`;
1903+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1904+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1905+
1906+
1907+
result = client.ExecuteQuery(R"(
1908+
DROP TABLE `/Root/RowDst`;
1909+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1910+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1911+
}
1912+
1913+
{
1914+
auto result = client.ExecuteQuery(R"(
1915+
CREATE TABLE `/Root/ColDst` (
1916+
PRIMARY KEY (Col1)
1917+
)
1918+
WITH (STORE = COLUMN) AS
1919+
SELECT Col2 AS Col1, Col1 As Col2 FROM `/Root/ColSrc`;
1920+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1921+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
1922+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Can't set NULL or optional value to not null column: Col1.", result.GetIssues().ToString());
1923+
1924+
result = client.ExecuteQuery(R"(
1925+
SELECT * FROM `/Root/ColDst`;
1926+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1927+
// TODO: Wait for RENAME from columnshards
1928+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1929+
1930+
result = client.ExecuteQuery(R"(
1931+
DROP TABLE `/Root/ColDst`;
1932+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1933+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1934+
}
1935+
1936+
{
1937+
auto result = client.ExecuteQuery(R"(
1938+
CREATE TABLE `/Root/ColDst` (
1939+
PRIMARY KEY (Col1)
1940+
)
1941+
WITH (STORE = COLUMN) AS
1942+
SELECT Unwrap(Col2) AS Col1, Col1 As Col2 FROM `/Root/ColSrc`;
1943+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1944+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1945+
1946+
result = client.ExecuteQuery(R"(
1947+
SELECT * FROM `/Root/ColDst`;
1948+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1949+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1950+
1951+
result = client.ExecuteQuery(R"(
1952+
DROP TABLE `/Root/ColDst`;
1953+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1954+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1955+
}
1956+
1957+
{
1958+
auto result = client.ExecuteQuery(R"(
1959+
CREATE TABLE `/Root/RowlDst` (
1960+
PRIMARY KEY (Col1)
1961+
)
1962+
WITH (STORE = COLUMN) AS
1963+
SELECT NotFound AS Col1, Col1 As Col2 FROM `/Root/RowSrc`;
1964+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1965+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
1966+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "not found", result.GetIssues().ToString());
1967+
}
1968+
1969+
{
1970+
auto result = client.ExecuteQuery(R"(
1971+
CREATE TABLE `/Root/RowSrc` (
1972+
PRIMARY KEY (Col1)
1973+
)
1974+
WITH (STORE = ROW) AS
1975+
SELECT 1 AS Col1, 2 As Col2;
1976+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1977+
UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString());
1978+
UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "path exist", result.GetIssues().ToString());
1979+
}
1980+
1981+
{
1982+
auto result = client.ExecuteQuery(R"(
1983+
CREATE TABLE `/Root/RowDst` (
1984+
PRIMARY KEY (Col1)
1985+
)
1986+
WITH (STORE = ROW) AS
1987+
SELECT * FROM `/Root/ColSrc`;
1988+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1989+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1990+
1991+
result = client.ExecuteQuery(R"(
1992+
SELECT COUNT(*) FROM `/Root/RowDst`;
1993+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
1994+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
1995+
CompareYson(R"([[3u]])", FormatResultSetYson(result.GetResultSet(0)));
1996+
}
1997+
1998+
{
1999+
auto result = client.ExecuteQuery(R"(
2000+
CREATE TABLE `/Root/ColDst` (
2001+
PRIMARY KEY (Col1)
2002+
)
2003+
WITH (STORE = ROW) AS
2004+
SELECT * FROM `/Root/RowSrc`;
2005+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2006+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
2007+
2008+
result = client.ExecuteQuery(R"(
2009+
SELECT COUNT(*) FROM `/Root/ColDst`;
2010+
)", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
2011+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
2012+
CompareYson(R"([[3u]])", FormatResultSetYson(result.GetResultSet(0)));
2013+
}
2014+
}
17822015
}
17832016

17842017
} // 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
@@ -4256,6 +4256,7 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
42564256
NKikimrConfig::TAppConfig appConfig;
42574257
appConfig.MutableTableServiceConfig()->SetEnableOlapSink(true);
42584258
appConfig.MutableTableServiceConfig()->SetEnableOltpSink(true);
4259+
appConfig.MutableTableServiceConfig()->SetEnableHtapTx(false);
42594260
auto settings = TKikimrSettings()
42604261
.SetAppConfig(appConfig)
42614262
.SetWithSampleTables(false);
@@ -4846,6 +4847,83 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
48464847
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)));
48474848
}
48484849
}
4850+
4851+
Y_UNIT_TEST(MixedReadQueryWithoutStreamLookup) {
4852+
NKikimrConfig::TAppConfig appConfig;
4853+
appConfig.MutableTableServiceConfig()->SetEnableOlapSink(true);
4854+
appConfig.MutableTableServiceConfig()->SetEnableOltpSink(false);
4855+
appConfig.MutableTableServiceConfig()->SetEnableHtapTx(false);
4856+
appConfig.MutableTableServiceConfig()->SetEnableKqpDataQueryStreamLookup(false);
4857+
4858+
auto settings = TKikimrSettings()
4859+
.SetAppConfig(appConfig)
4860+
.SetWithSampleTables(false);
4861+
4862+
TKikimrRunner kikimr(settings);
4863+
Tests::NCommon::TLoggerInit(kikimr).Initialize();
4864+
4865+
auto client = kikimr.GetQueryClient();
4866+
4867+
{
4868+
auto createTable = client.ExecuteQuery(R"sql(
4869+
CREATE TABLE `/Root/DataShard` (
4870+
Col1 Uint64 NOT NULL,
4871+
Col2 Int32 NOT NULL,
4872+
Col3 String,
4873+
PRIMARY KEY (Col1, Col2)
4874+
) WITH (STORE = ROW);
4875+
CREATE TABLE `/Root/ColumnShard` (
4876+
Col1 Uint64 NOT NULL,
4877+
Col2 Int32 NOT NULL,
4878+
Col3 String,
4879+
PRIMARY KEY (Col1, Col2)
4880+
) WITH (STORE = COLUMN);
4881+
)sql", NYdb::NQuery::TTxControl::NoTx()).ExtractValueSync();
4882+
UNIT_ASSERT_C(createTable.IsSuccess(), createTable.GetIssues().ToString());
4883+
}
4884+
4885+
{
4886+
auto replaceValues = client.ExecuteQuery(R"sql(
4887+
REPLACE INTO `/Root/DataShard` (Col1, Col2, Col3) VALUES
4888+
(1u, 1, "row"), (1u, 2, "row"), (1u, 3, "row"), (2u, 3, "row");
4889+
)sql", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4890+
UNIT_ASSERT_C(replaceValues.IsSuccess(), replaceValues.GetIssues().ToString());
4891+
}
4892+
{
4893+
auto replaceValues = client.ExecuteQuery(R"sql(
4894+
REPLACE INTO `/Root/ColumnShard` (Col1, Col2, Col3) VALUES
4895+
(1u, 1, "row"), (1u, 2, "row"), (1u, 3, "row"), (2u, 3, "row");
4896+
)sql", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4897+
UNIT_ASSERT_C(replaceValues.IsSuccess(), replaceValues.GetIssues().ToString());
4898+
}
4899+
4900+
{
4901+
auto it = client.StreamExecuteQuery(R"sql(
4902+
SELECT Col3 FROM `/Root/DataShard` WHERE Col1 = 1u
4903+
UNION ALL
4904+
SELECT Col3 FROM `/Root/ColumnShard` WHERE Col1 = 1u;
4905+
)sql", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4906+
UNIT_ASSERT_VALUES_EQUAL_C(it.GetStatus(), EStatus::SUCCESS, it.GetIssues().ToString());
4907+
TString output = StreamResultToYson(it);
4908+
CompareYson(
4909+
output,
4910+
R"([[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]]])");
4911+
}
4912+
4913+
{
4914+
auto it = client.StreamExecuteQuery(R"sql(
4915+
SELECT r.Col3
4916+
FROM `/Root/DataShard` AS r
4917+
JOIN `/Root/ColumnShard` AS c
4918+
ON r.Col1 = c.Col1;
4919+
)sql", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4920+
UNIT_ASSERT_VALUES_EQUAL_C(it.GetStatus(), EStatus::SUCCESS, it.GetIssues().ToString());
4921+
TString output = StreamResultToYson(it);
4922+
CompareYson(
4923+
output,
4924+
R"([[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]]])");
4925+
}
4926+
}
48494927
}
48504928

48514929
} // namespace NKqp

0 commit comments

Comments
 (0)