@@ -1792,6 +1792,175 @@ Y_UNIT_TEST_SUITE(KqpFederatedQuery) {
1792
1792
Y_UNIT_TEST (ExecuteScriptWithThinFile) {
1793
1793
ExecuteSelectQuery (" test_bucket_execute_script_with_large_file" , 5_MB, 500000 );
1794
1794
}
1795
+
1796
+ std::shared_ptr<TKikimrRunner> CreateSampleDataSource (const TString& externalDataSourceName, const TString& externalTableName) {
1797
+ const TString bucket = " test_bucket3" ;
1798
+ const TString object = " test_object" ;
1799
+
1800
+ NKikimrConfig::TAppConfig appConfig;
1801
+ appConfig.MutableTableServiceConfig ()->SetEnableOlapSink (true );
1802
+ appConfig.MutableTableServiceConfig ()->SetEnableOltpSink (true );
1803
+ appConfig.MutableTableServiceConfig ()->SetEnableCreateTableAs (true );
1804
+ appConfig.MutableTableServiceConfig ()->SetEnablePerStatementQueryExecution (true );
1805
+ appConfig.MutableFeatureFlags ()->SetEnableTempTables (true );
1806
+ auto kikimr = NTestUtils::MakeKikimrRunner (appConfig, " TestDomain" );
1807
+
1808
+ CreateBucketWithObject (bucket, " test_object" , TEST_CONTENT);
1809
+
1810
+ auto tc = kikimr->GetTableClient ();
1811
+ auto session = tc.CreateSession ().GetValueSync ().GetSession ();
1812
+ const TString query = fmt::format (R"(
1813
+ CREATE EXTERNAL DATA SOURCE `{external_source}` WITH (
1814
+ SOURCE_TYPE="ObjectStorage",
1815
+ LOCATION="{location}",
1816
+ AUTH_METHOD="NONE"
1817
+ );
1818
+ CREATE EXTERNAL TABLE `{external_table}` (
1819
+ key Utf8 NOT NULL,
1820
+ value Utf8 NOT NULL
1821
+ ) WITH (
1822
+ DATA_SOURCE="{external_source}",
1823
+ LOCATION="{object}",
1824
+ FORMAT="json_each_row"
1825
+ );)" ,
1826
+ " external_source" _a = externalDataSourceName,
1827
+ " external_table" _a = externalTableName,
1828
+ " location" _a = GetBucketLocation (bucket),
1829
+ " object" _a = object
1830
+ );
1831
+ auto result = session.ExecuteSchemeQuery (query).GetValueSync ();
1832
+ UNIT_ASSERT_C (result.GetStatus () == NYdb::EStatus::SUCCESS, result.GetIssues ().ToString ());
1833
+
1834
+ return kikimr;
1835
+ }
1836
+
1837
+ void ValidateResult (const TExecuteQueryResult& result) {
1838
+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
1839
+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetResultSets ().size (), 1 , " Unexpected result sets count" );
1840
+
1841
+ TResultSetParser resultSet (result.GetResultSet (0 ));
1842
+ UNIT_ASSERT_VALUES_EQUAL (resultSet.ColumnsCount (), 2 );
1843
+ UNIT_ASSERT_VALUES_EQUAL (resultSet.RowsCount (), 2 );
1844
+
1845
+ UNIT_ASSERT (resultSet.TryNextRow ());
1846
+ UNIT_ASSERT_VALUES_EQUAL (resultSet.ColumnParser (0 ).GetUtf8 (), " 1" );
1847
+ UNIT_ASSERT_VALUES_EQUAL (resultSet.ColumnParser (1 ).GetUtf8 (), " trololo" );
1848
+
1849
+ UNIT_ASSERT (resultSet.TryNextRow ());
1850
+ UNIT_ASSERT_VALUES_EQUAL (resultSet.ColumnParser (0 ).GetUtf8 (), " 2" );
1851
+ UNIT_ASSERT_VALUES_EQUAL (resultSet.ColumnParser (1 ).GetUtf8 (), " hello world" );
1852
+
1853
+ }
1854
+
1855
+ void ValidateTables (TQueryClient& client, const TString& oltpTable, const TString& olapTable) {
1856
+ {
1857
+ const TString query = TStringBuilder () << " SELECT Unwrap(key), Unwrap(value) FROM `" << oltpTable << " `;" ;
1858
+ ValidateResult (client.ExecuteQuery (query, NYdb::NQuery::TTxControl::BeginTx ().CommitTx ()).ExtractValueSync ());
1859
+ }
1860
+
1861
+ {
1862
+ const TString query = TStringBuilder () << " SELECT key, value FROM `" << olapTable << " ` ORDER BY key;" ;
1863
+ ValidateResult (client.ExecuteQuery (query, NYdb::NQuery::TTxControl::BeginTx ().CommitTx ()).ExtractValueSync ());
1864
+ }
1865
+ }
1866
+
1867
+ Y_UNIT_TEST (CreateTableAsSelectFromExternalDataSource) {
1868
+ const TString externalDataSourceName = " external_data_source" ;
1869
+ const TString externalTableName = " test_binding_resolve" ;
1870
+
1871
+ auto kikimr = CreateSampleDataSource (externalDataSourceName, externalTableName);
1872
+ auto client = kikimr->GetQueryClient ();
1873
+
1874
+ const TString oltpTable = " DestinationOltp" ;
1875
+ {
1876
+ const TString query = fmt::format (R"(
1877
+ PRAGMA TablePathPrefix = "TestDomain";
1878
+ CREATE TABLE `{destination}` (
1879
+ PRIMARY KEY (key, value)
1880
+ )
1881
+ AS SELECT *
1882
+ FROM `{external_source}`.`/` WITH (
1883
+ format="json_each_row",
1884
+ schema(
1885
+ key Utf8 NOT NULL,
1886
+ value Utf8 NOT NULL
1887
+ )
1888
+ );)" ,
1889
+ " destination" _a = oltpTable,
1890
+ " external_source" _a = externalDataSourceName
1891
+ );
1892
+ auto result = client.ExecuteQuery (query, NYdb::NQuery::TTxControl::NoTx ()).ExtractValueSync ();
1893
+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
1894
+ }
1895
+
1896
+ const TString olapTable = " DestinationOlap" ;
1897
+ {
1898
+ const TString query = fmt::format (R"(
1899
+ PRAGMA TablePathPrefix = "TestDomain";
1900
+ CREATE TABLE `{destination}` (
1901
+ PRIMARY KEY (key, value)
1902
+ )
1903
+ WITH (STORE = COLUMN)
1904
+ AS SELECT *
1905
+ FROM `{external_source}`.`/` WITH (
1906
+ format="json_each_row",
1907
+ schema(
1908
+ key Utf8 NOT NULL,
1909
+ value Utf8 NOT NULL
1910
+ )
1911
+ );)" ,
1912
+ " destination" _a = olapTable,
1913
+ " external_source" _a = externalDataSourceName
1914
+ );
1915
+ auto result = client.ExecuteQuery (query, NYdb::NQuery::TTxControl::NoTx ()).ExtractValueSync ();
1916
+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
1917
+ }
1918
+
1919
+ ValidateTables (client, oltpTable, olapTable);
1920
+ }
1921
+
1922
+ Y_UNIT_TEST (CreateTableAsSelectFromExternalTable) {
1923
+ const TString externalDataSourceName = " external_data_source" ;
1924
+ const TString externalTableName = " test_binding_resolve" ;
1925
+
1926
+ auto kikimr = CreateSampleDataSource (externalDataSourceName, externalTableName);
1927
+ auto client = kikimr->GetQueryClient ();
1928
+
1929
+ const TString oltpTable = " DestinationOltp" ;
1930
+ {
1931
+ const TString query = fmt::format (R"(
1932
+ PRAGMA TablePathPrefix = "TestDomain";
1933
+ CREATE TABLE `{destination}` (
1934
+ PRIMARY KEY (key, value)
1935
+ )
1936
+ AS SELECT *
1937
+ FROM `{external_table}`;)" ,
1938
+ " destination" _a = oltpTable,
1939
+ " external_table" _a = externalTableName
1940
+ );
1941
+ auto result = client.ExecuteQuery (query, NYdb::NQuery::TTxControl::NoTx ()).ExtractValueSync ();
1942
+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
1943
+ }
1944
+
1945
+ const TString olapTable = " DestinationOlap" ;
1946
+ {
1947
+ const TString query = fmt::format (R"(
1948
+ PRAGMA TablePathPrefix = "TestDomain";
1949
+ CREATE TABLE `{destination}` (
1950
+ PRIMARY KEY (key, value)
1951
+ )
1952
+ WITH (STORE = COLUMN)
1953
+ AS SELECT *
1954
+ FROM `{external_table}`;)" ,
1955
+ " destination" _a = olapTable,
1956
+ " external_table" _a = externalTableName
1957
+ );
1958
+ auto result = client.ExecuteQuery (query, NYdb::NQuery::TTxControl::NoTx ()).ExtractValueSync ();
1959
+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
1960
+ }
1961
+
1962
+ ValidateTables (client, oltpTable, olapTable);
1963
+ }
1795
1964
}
1796
1965
1797
1966
} // namespace NKikimr::NKqp
0 commit comments