diff --git a/ydb/core/kqp/ut/olap/sys_view_ut.cpp b/ydb/core/kqp/ut/olap/sys_view_ut.cpp index c25961aa08a5..aa345c16abdb 100644 --- a/ydb/core/kqp/ut/olap/sys_view_ut.cpp +++ b/ydb/core/kqp/ut/olap/sys_view_ut.cpp @@ -633,6 +633,17 @@ Y_UNIT_TEST_SUITE(KqpOlapSysView) { auto tableClient = kikimr.GetTableClient(); + { + auto selectQuery = TString(R"( + SELECT * + FROM `/Root/olapStore/.sys/store_primary_index_stats` + ORDER BY PathId + LIMIT 10 + )"); + + auto rows = ExecuteScanQuery(tableClient, selectQuery); + } + { auto selectQuery = TString(R"( SELECT * diff --git a/ydb/core/tx/columnshard/engines/metadata_accessor.h b/ydb/core/tx/columnshard/engines/metadata_accessor.h index 825326f5e91a..a33e56fab922 100644 --- a/ydb/core/tx/columnshard/engines/metadata_accessor.h +++ b/ydb/core/tx/columnshard/engines/metadata_accessor.h @@ -24,6 +24,10 @@ class ITableMetadataAccessor { public: ITableMetadataAccessor(const TString& tablePath); + + virtual bool OrderByLimitAllowed() const { + return true; + } virtual bool NeedDuplicateFiltering() const { return true; } @@ -31,9 +35,6 @@ class ITableMetadataAccessor { return true; } virtual ~ITableMetadataAccessor() = default; - virtual TString GetOverridenScanType(const TString& defScanType) const { - return defScanType; - } virtual std::optional GetPathId() const { return std::nullopt; } diff --git a/ydb/core/tx/columnshard/engines/reader/common_reader/constructor/read_metadata.h b/ydb/core/tx/columnshard/engines/reader/common_reader/constructor/read_metadata.h index 76e232925f6d..17f6a63795fc 100644 --- a/ydb/core/tx/columnshard/engines/reader/common_reader/constructor/read_metadata.h +++ b/ydb/core/tx/columnshard/engines/reader/common_reader/constructor/read_metadata.h @@ -25,7 +25,7 @@ class ISourcesConstructor { virtual TString DoDebugString() const = 0; bool InitCursorFlag = false; virtual void DoFillReadStats(TReadStats& /*stats*/) const { - + } public: @@ -192,6 +192,10 @@ class TReadMetadata: public TReadMetadataBase { TReadMetadata(const TReadMetadata&) = delete; TReadMetadata& operator=(const TReadMetadata&) = delete; + bool OrderByLimitAllowed() const { + return TableMetadataAccessor->OrderByLimitAllowed() && !GetFakeSort(); + } + virtual std::vector GetKeyYqlSchema() const override { return GetResultSchema()->GetIndexInfo().GetPrimaryKeyColumns(); } diff --git a/ydb/core/tx/columnshard/engines/reader/simple_reader/iterator/scanner.cpp b/ydb/core/tx/columnshard/engines/reader/simple_reader/iterator/scanner.cpp index c6a0d4764913..d8aa655c3179 100644 --- a/ydb/core/tx/columnshard/engines/reader/simple_reader/iterator/scanner.cpp +++ b/ydb/core/tx/columnshard/engines/reader/simple_reader/iterator/scanner.cpp @@ -29,7 +29,7 @@ TScanHead::TScanHead(std::unique_ptr&& sourcesCons SyncPoints.emplace_back(std::make_shared( SourcesCollection, Context->GetSourcesAggregationScript(), Context->GetRestoreResultScript(), SyncPoints.size(), context)); } else if (readMetadataContext->IsSorted()) { - if (readMetadataContext->HasLimit() && !readMetadataContext->GetFakeSort()) { + if (readMetadataContext->HasLimit() && readMetadataContext->OrderByLimitAllowed()) { auto collection = std::make_shared(Context, std::move(sourcesConstructor)); SourcesCollection = collection; SyncPoints.emplace_back(std::make_shared( diff --git a/ydb/core/tx/columnshard/engines/reader/simple_reader/iterator/sys_view/abstract/metadata.h b/ydb/core/tx/columnshard/engines/reader/simple_reader/iterator/sys_view/abstract/metadata.h index 2eedf0022959..ace5f272037a 100644 --- a/ydb/core/tx/columnshard/engines/reader/simple_reader/iterator/sys_view/abstract/metadata.h +++ b/ydb/core/tx/columnshard/engines/reader/simple_reader/iterator/sys_view/abstract/metadata.h @@ -24,8 +24,8 @@ class TAccessor: public ITableMetadataAccessor { return PathId; } - virtual TString GetOverridenScanType(const TString& /*defScanType*/) const override { - return "SIMPLE"; + virtual bool OrderByLimitAllowed() const override { + return false; } virtual bool NeedDuplicateFiltering() const override { diff --git a/ydb/core/tx/columnshard/engines/reader/transaction/tx_scan.cpp b/ydb/core/tx/columnshard/engines/reader/transaction/tx_scan.cpp index 10a194065a9c..fabbf217a1ab 100644 --- a/ydb/core/tx/columnshard/engines/reader/transaction/tx_scan.cpp +++ b/ydb/core/tx/columnshard/engines/reader/transaction/tx_scan.cpp @@ -107,7 +107,7 @@ void TTxScan::Complete(const TActorContext& ctx) { return request.GetCSScanPolicy() ? request.GetCSScanPolicy() : defaultReader; }(); auto constructor = - NReader::IScannerConstructor::TFactory::MakeHolder(read.TableMetadataAccessor->GetOverridenScanType(scanType), context); + NReader::IScannerConstructor::TFactory::MakeHolder(scanType, context); if (!constructor) { return std::unique_ptr(); } @@ -157,7 +157,7 @@ void TTxScan::Complete(const TActorContext& ctx) { return SendError("cannot build metadata", newRange.GetErrorMessage(), ctx); } } - + if (AppDataVerified().ColumnShardConfig.GetEnableDiagnostics()) { auto graphOptional = read.GetProgram().GetGraphOptional(); TString dotGraph = graphOptional ? graphOptional->DebugDOT() : "";