@@ -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
0 commit comments