@@ -229,6 +229,7 @@ TTableMetadataResult GetExternalTableMetadataResult(const NSchemeCache::TSchemeC
229229 tableMeta->PathId = NYql::TKikimrPathId (description.GetPathId ().GetOwnerId (), description.GetPathId ().GetLocalId ());
230230 tableMeta->SchemaVersion = description.GetVersion ();
231231 tableMeta->Kind = NYql::EKikimrTableKind::External;
232+ tableMeta->TableType = NYql::ETableType::ExternalTable;
232233
233234 tableMeta->Attributes = entry.Attributes ;
234235
@@ -255,7 +256,7 @@ TTableMetadataResult GetExternalTableMetadataResult(const NSchemeCache::TSchemeC
255256}
256257
257258TTableMetadataResult GetExternalDataSourceMetadataResult (const NSchemeCache::TSchemeCacheNavigate::TEntry& entry,
258- const TString& cluster, const TString& tableName) {
259+ const TString& cluster, const TString& mainCluster, const TString& tableName) {
259260 const auto & description = entry.ExternalDataSourceInfo ->Description ;
260261 TTableMetadataResult result;
261262 result.SetSuccess ();
@@ -265,6 +266,11 @@ TTableMetadataResult GetExternalDataSourceMetadataResult(const NSchemeCache::TSc
265266 tableMeta->PathId = NYql::TKikimrPathId (description.GetPathId ().GetOwnerId (), description.GetPathId ().GetLocalId ());
266267 tableMeta->SchemaVersion = description.GetVersion ();
267268 tableMeta->Kind = NYql::EKikimrTableKind::External;
269+ if (cluster == mainCluster) { // resolved external data source itself
270+ tableMeta->TableType = NYql::ETableType::Unknown;
271+ } else {
272+ tableMeta->TableType = NYql::ETableType::Table; // wanted to resolve table in external data source
273+ }
268274
269275 tableMeta->Attributes = entry.Attributes ;
270276
@@ -302,7 +308,7 @@ TTableMetadataResult GetViewMetadataResult(
302308}
303309
304310TTableMetadataResult GetLoadTableMetadataResult (const NSchemeCache::TSchemeCacheNavigate::TEntry& entry,
305- const TString& cluster, const TString& tableName, std::optional<TString> queryName = std::nullopt ) {
311+ const TString& cluster, const TString& mainCluster, const TString& tableName, std::optional<TString> queryName = std::nullopt ) {
306312 using TResult = NYql::IKikimrGateway::TTableMetadataResult;
307313 using EStatus = NSchemeCache::TSchemeCacheNavigate::EStatus;
308314 using EKind = NSchemeCache::TSchemeCacheNavigate::EKind;
@@ -341,7 +347,7 @@ TTableMetadataResult GetLoadTableMetadataResult(const NSchemeCache::TSchemeCache
341347 result = GetExternalTableMetadataResult (entry, cluster, tableName);
342348 break ;
343349 case EKind::KindExternalDataSource:
344- result = GetExternalDataSourceMetadataResult (entry, cluster, tableName);
350+ result = GetExternalDataSourceMetadataResult (entry, cluster, mainCluster, tableName);
345351 break ;
346352 case EKind::KindView:
347353 result = GetViewMetadataResult (entry, cluster, tableName);
@@ -699,16 +705,30 @@ NThreading::TFuture<TTableMetadataResult> TKqpTableMetadataLoader::LoadTableMeta
699705 using EStatus = NSchemeCache::TSchemeCacheNavigate::EStatus;
700706 using EKind = NSchemeCache::TSchemeCacheNavigate::EKind;
701707
702- const auto externalEntryItem = CreateNavigateExternalEntry (id, settings.WithExternalDatasources_ );
703- Y_ABORT_UNLESS (!settings.WithExternalDatasources_ || externalEntryItem, " External data source must be resolved using path only" );
704- auto resNavigate = settings.WithExternalDatasources_ ? *externalEntryItem : CreateNavigateEntry (cluster,
705- id, settings, TempTablesState);
708+ // In the case of reading from an external data source,
709+ // we have a construction of the form: `/Root/external_data_source`.`/path_in_external_system` WITH (...)
710+ // In this syntax, information about path_in_external_system is already known and we only need information about external_data_source.
711+ // To do this, we go to the DefaultCluster and get information about external_data_source from scheme shard
712+ const bool resolveEntityInsideDataSource = (cluster != Cluster);
713+ TPath entityName = id;
714+ if constexpr (std::is_same_v<TPath, TString>) {
715+ if (resolveEntityInsideDataSource) {
716+ entityName = cluster;
717+ }
718+ } else {
719+ Y_ENSURE (!resolveEntityInsideDataSource);
720+ }
721+
722+ const auto externalEntryItem = CreateNavigateExternalEntry (entityName, resolveEntityInsideDataSource);
723+ Y_ABORT_UNLESS (!resolveEntityInsideDataSource || externalEntryItem, " External data source must be resolved using path only" );
724+ auto resNavigate = resolveEntityInsideDataSource ? *externalEntryItem : CreateNavigateEntry (Cluster,
725+ entityName, settings, TempTablesState);
706726 const auto entry = resNavigate.Entry ;
707727 const auto queryName = resNavigate.QueryName ;
708- const auto externalEntry = settings. WithExternalDatasources_ ? std::optional<NavigateEntryResult>{} : externalEntryItem;
709- const ui64 expectedSchemaVersion = GetExpectedVersion (id );
728+ const auto externalEntry = resolveEntityInsideDataSource ? std::optional<NavigateEntryResult>{} : externalEntryItem;
729+ const ui64 expectedSchemaVersion = GetExpectedVersion (entityName );
710730
711- LOG_DEBUG_S (*ActorSystem, NKikimrServices::KQP_GATEWAY, " Load table metadata from cache by path, request" << GetDebugString (id ));
731+ LOG_DEBUG_S (*ActorSystem, NKikimrServices::KQP_GATEWAY, " Load table metadata from cache by path, request" << GetDebugString (entityName ));
712732
713733 auto navigate = MakeHolder<TNavigate>();
714734 navigate->ResultSet .emplace_back (entry);
@@ -730,7 +750,7 @@ NThreading::TFuture<TTableMetadataResult> TKqpTableMetadataLoader::LoadTableMeta
730750 ActorSystem,
731751 schemeCacheId,
732752 ev.Release (),
733- [userToken, database, cluster, table, settings, expectedSchemaVersion, this , queryName]
753+ [userToken, database, cluster, mainCluster = Cluster, table, settings, expectedSchemaVersion, this , queryName]
734754 (TPromise<TResult> promise, TResponse&& response) mutable
735755 {
736756 try {
@@ -741,7 +761,7 @@ NThreading::TFuture<TTableMetadataResult> TKqpTableMetadataLoader::LoadTableMeta
741761 auto & entry = InferEntry (navigate.ResultSet );
742762
743763 if (entry.Status != EStatus::Ok) {
744- promise.SetValue (GetLoadTableMetadataResult (entry, cluster, table));
764+ promise.SetValue (GetLoadTableMetadataResult (entry, cluster, mainCluster, table));
745765 return ;
746766 }
747767
@@ -763,7 +783,7 @@ NThreading::TFuture<TTableMetadataResult> TKqpTableMetadataLoader::LoadTableMeta
763783
764784 switch (entry.Kind ) {
765785 case EKind::KindExternalDataSource: {
766- auto externalDataSourceMetadata = GetLoadTableMetadataResult (entry, cluster, table);
786+ auto externalDataSourceMetadata = GetLoadTableMetadataResult (entry, cluster, mainCluster, table);
767787 if (!externalDataSourceMetadata.Success ()) {
768788 promise.SetValue (externalDataSourceMetadata);
769789 return ;
@@ -779,7 +799,7 @@ NThreading::TFuture<TTableMetadataResult> TKqpTableMetadataLoader::LoadTableMeta
779799 case EKind::KindExternalTable: {
780800 YQL_ENSURE (entry.ExternalTableInfo , " expected external table info" );
781801 const auto & dataSourcePath = entry.ExternalTableInfo ->Description .GetDataSourcePath ();
782- auto externalTableMetadata = GetLoadTableMetadataResult (entry, cluster, table);
802+ auto externalTableMetadata = GetLoadTableMetadataResult (entry, cluster, mainCluster, table);
783803 if (!externalTableMetadata.Success ()) {
784804 promise.SetValue (externalTableMetadata);
785805 return ;
@@ -810,7 +830,7 @@ NThreading::TFuture<TTableMetadataResult> TKqpTableMetadataLoader::LoadTableMeta
810830 }
811831 break ;
812832 default : {
813- promise.SetValue (GetLoadTableMetadataResult (entry, cluster, table, queryName));
833+ promise.SetValue (GetLoadTableMetadataResult (entry, cluster, mainCluster, table, queryName));
814834 }
815835 }
816836 }
0 commit comments