@@ -77,6 +77,79 @@ struct TAppConfigResult : public IKqpGateway::TGenericResult {
77
77
std::shared_ptr<const NKikimrConfig::TAppConfig> Config;
78
78
};
79
79
80
+ bool ContainOnlyLiteralStages (NKikimr::NKqp::IKqpGateway::TExecPhysicalRequest& request) {
81
+ for (const auto & tx : request.Transactions ) {
82
+ if (tx.Body ->GetType () != NKqpProto::TKqpPhyTx::TYPE_COMPUTE) {
83
+ return false ;
84
+ }
85
+
86
+ for (const auto & stage : tx.Body ->GetStages ()) {
87
+ if (stage.InputsSize () != 0 ) {
88
+ return false ;
89
+ }
90
+ }
91
+ }
92
+
93
+ return true ;
94
+ }
95
+
96
+ void PrepareLiteralRequest (IKqpGateway::TExecPhysicalRequest& literalRequest, NKqpProto::TKqpPhyQuery& phyQuery, const TString& program, const NKikimrMiniKQL::TType& resultType) {
97
+ literalRequest.NeedTxId = false ;
98
+ literalRequest.MaxAffectedShards = 0 ;
99
+ literalRequest.TotalReadSizeLimitBytes = 0 ;
100
+ literalRequest.MkqlMemoryLimit = 100_MB;
101
+
102
+ auto & transaction = *phyQuery.AddTransactions ();
103
+ transaction.SetType (NKqpProto::TKqpPhyTx::TYPE_COMPUTE);
104
+
105
+ auto & stage = *transaction.AddStages ();
106
+ auto & stageProgram = *stage.MutableProgram ();
107
+ stageProgram.SetRuntimeVersion (NYql::NDqProto::RUNTIME_VERSION_YQL_1_0);
108
+ stageProgram.SetRaw (program);
109
+ stage.SetOutputsCount (1 );
110
+
111
+ auto & taskResult = *transaction.AddResults ();
112
+ *taskResult.MutableItemType () = resultType;
113
+ auto & taskConnection = *taskResult.MutableConnection ();
114
+ taskConnection.SetStageIndex (0 );
115
+ }
116
+
117
+ void FillLiteralResult (const IKqpGateway::TExecPhysicalResult& result, IKqpGateway::TExecuteLiteralResult& literalResult) {
118
+ if (result.Success ()) {
119
+ YQL_ENSURE (result.Results .size () == 1 );
120
+ literalResult.SetSuccess ();
121
+ literalResult.Result = result.Results [0 ];
122
+ } else {
123
+ literalResult.SetStatus (result.Status ());
124
+ literalResult.AddIssues (result.Issues ());
125
+ }
126
+ }
127
+
128
+ void FillPhysicalResult (std::unique_ptr<TEvKqpExecuter::TEvTxResponse>& ev, IKqpGateway::TExecPhysicalResult& result, TQueryData::TPtr params, ui32 txIndex) {
129
+ auto & response = *ev->Record .MutableResponse ();
130
+ if (response.GetStatus () == Ydb::StatusIds::SUCCESS) {
131
+ result.SetSuccess ();
132
+ result.ExecuterResult .Swap (response.MutableResult ());
133
+ {
134
+ auto g = params->TypeEnv ().BindAllocator ();
135
+
136
+ auto & txResults = ev->GetTxResults ();
137
+ result.Results .reserve (txResults.size ());
138
+ for (auto & tx : txResults) {
139
+ result.Results .emplace_back (tx.GetMkql ());
140
+ }
141
+ params->AddTxHolders (std::move (ev->GetTxHolders ()));
142
+
143
+ if (!txResults.empty ()) {
144
+ params->AddTxResults (txIndex, std::move (txResults));
145
+ }
146
+ }
147
+ } else {
148
+ for (auto & issue : response.GetIssues ()) {
149
+ result.AddIssue (NYql::IssueFromMessage (issue));
150
+ }
151
+ }
152
+ }
80
153
81
154
template <typename TRequest, typename TResponse, typename TResult>
82
155
class TProxyRequestHandler : public TRequestHandlerBase <
@@ -621,32 +694,8 @@ class TKqpExecLiteralRequestHandler: public TActorBootstrapped<TKqpExecLiteralRe
621
694
}
622
695
623
696
void ProcessPureExecution (std::unique_ptr<TEvKqpExecuter::TEvTxResponse>& ev) {
624
- auto * response = ev->Record .MutableResponse ();
625
-
626
697
TResult result;
627
- if (response->GetStatus () == Ydb::StatusIds::SUCCESS) {
628
- result.SetSuccess ();
629
- result.ExecuterResult .Swap (response->MutableResult ());
630
- {
631
- auto g = Parameters->TypeEnv ().BindAllocator ();
632
-
633
- auto & txResults = ev->GetTxResults ();
634
- result.Results .reserve (txResults.size ());
635
- for (auto & tx : txResults) {
636
- result.Results .emplace_back (tx.GetMkql ());
637
- }
638
- Parameters->AddTxHolders (std::move (ev->GetTxHolders ()));
639
-
640
- if (!txResults.empty ()) {
641
- Parameters->AddTxResults (TxIndex, std::move (txResults));
642
- }
643
- }
644
- } else {
645
- for (auto & issue : response->GetIssues ()) {
646
- result.AddIssue (NYql::IssueFromMessage (issue));
647
- }
648
- }
649
-
698
+ FillPhysicalResult (ev, result, Parameters, TxIndex);
650
699
Promise.SetValue (std::move (result));
651
700
this ->PassAway ();
652
701
}
@@ -1798,79 +1847,60 @@ class TKikimrIcGateway : public IKqpGateway {
1798
1847
auto preparedQuery = std::make_unique<NKikimrKqp::TPreparedQuery>();
1799
1848
auto & phyQuery = *preparedQuery->MutablePhysicalQuery ();
1800
1849
NKikimr::NKqp::IKqpGateway::TExecPhysicalRequest literalRequest (txAlloc);
1801
-
1802
- literalRequest.NeedTxId = false ;
1803
- literalRequest.MaxAffectedShards = 0 ;
1804
- literalRequest.TotalReadSizeLimitBytes = 0 ;
1805
- literalRequest.MkqlMemoryLimit = 100_MB;
1806
-
1807
- auto & transaction = *phyQuery.AddTransactions ();
1808
- transaction.SetType (NKqpProto::TKqpPhyTx::TYPE_COMPUTE);
1809
-
1810
- auto & stage = *transaction.AddStages ();
1811
- auto & stageProgram = *stage.MutableProgram ();
1812
- stageProgram.SetRuntimeVersion (NYql::NDqProto::RUNTIME_VERSION_YQL_1_0);
1813
- stageProgram.SetRaw (program);
1814
- stage.SetOutputsCount (1 );
1815
-
1816
- auto & taskResult = *transaction.AddResults ();
1817
- *taskResult.MutableItemType () = resultType;
1818
- auto & taskConnection = *taskResult.MutableConnection ();
1819
- taskConnection.SetStageIndex (0 );
1850
+ PrepareLiteralRequest (literalRequest, phyQuery, program, resultType);
1820
1851
1821
1852
NKikimr::NKqp::TPreparedQueryHolder queryHolder (preparedQuery.release (), txAlloc->HolderFactory .GetFunctionRegistry ());
1822
-
1823
1853
NKikimr::NKqp::TQueryData::TPtr params = std::make_shared<NKikimr::NKqp::TQueryData>(txAlloc);
1824
-
1825
1854
literalRequest.Transactions .emplace_back (queryHolder.GetPhyTx (0 ), params);
1826
1855
1827
1856
return ExecuteLiteral (std::move (literalRequest), params, 0 ).Apply ([](const auto & future) {
1828
1857
const auto & result = future.GetValue ();
1829
-
1830
1858
TExecuteLiteralResult literalResult;
1831
-
1832
- if (result.Success ()) {
1833
- YQL_ENSURE (result.Results .size () == 1 );
1834
- literalResult.SetSuccess ();
1835
- literalResult.Result = result.Results [0 ];
1836
- } else {
1837
- literalResult.SetStatus (result.Status ());
1838
- literalResult.AddIssues (result.Issues ());
1839
- }
1840
-
1859
+ FillLiteralResult (result, literalResult);
1841
1860
return literalResult;
1842
1861
});
1843
1862
}
1844
1863
1864
+ TExecuteLiteralResult ExecuteLiteralInstant (const TString& program, const NKikimrMiniKQL::TType& resultType, NKikimr::NKqp::TTxAllocatorState::TPtr txAlloc) override {
1865
+ auto preparedQuery = std::make_unique<NKikimrKqp::TPreparedQuery>();
1866
+ auto & phyQuery = *preparedQuery->MutablePhysicalQuery ();
1867
+ NKikimr::NKqp::IKqpGateway::TExecPhysicalRequest literalRequest (txAlloc);
1868
+ PrepareLiteralRequest (literalRequest, phyQuery, program, resultType);
1869
+
1870
+ NKikimr::NKqp::TPreparedQueryHolder queryHolder (preparedQuery.release (), txAlloc->HolderFactory .GetFunctionRegistry ());
1871
+ NKikimr::NKqp::TQueryData::TPtr params = std::make_shared<NKikimr::NKqp::TQueryData>(txAlloc);
1872
+ literalRequest.Transactions .emplace_back (queryHolder.GetPhyTx (0 ), params);
1873
+
1874
+ auto result = ExecuteLiteralInstant (std::move (literalRequest), params, 0 );
1875
+
1876
+ TExecuteLiteralResult literalResult;
1877
+ FillLiteralResult (result, literalResult);
1878
+ return literalResult;
1879
+ }
1845
1880
1846
1881
TFuture<TExecPhysicalResult> ExecuteLiteral (TExecPhysicalRequest&& request, TQueryData::TPtr params, ui32 txIndex) override {
1847
1882
YQL_ENSURE (!request.Transactions .empty ());
1848
1883
YQL_ENSURE (request.DataShardLocks .empty ());
1849
1884
YQL_ENSURE (!request.NeedTxId );
1850
-
1851
- auto containOnlyLiteralStages = [](const auto & request) {
1852
- for (const auto & tx : request.Transactions ) {
1853
- if (tx.Body ->GetType () != NKqpProto::TKqpPhyTx::TYPE_COMPUTE) {
1854
- return false ;
1855
- }
1856
-
1857
- for (const auto & stage : tx.Body ->GetStages ()) {
1858
- if (stage.InputsSize () != 0 ) {
1859
- return false ;
1860
- }
1861
- }
1862
- }
1863
-
1864
- return true ;
1865
- };
1866
-
1867
- YQL_ENSURE (containOnlyLiteralStages (request));
1885
+ YQL_ENSURE (ContainOnlyLiteralStages (request));
1868
1886
auto promise = NewPromise<TExecPhysicalResult>();
1869
1887
IActor* requestHandler = new TKqpExecLiteralRequestHandler (std::move (request), Counters, promise, params, txIndex);
1870
1888
RegisterActor (requestHandler);
1871
1889
return promise.GetFuture ();
1872
1890
}
1873
1891
1892
+ TExecPhysicalResult ExecuteLiteralInstant (TExecPhysicalRequest&& request, TQueryData::TPtr params, ui32 txIndex) override {
1893
+ YQL_ENSURE (!request.Transactions .empty ());
1894
+ YQL_ENSURE (request.DataShardLocks .empty ());
1895
+ YQL_ENSURE (!request.NeedTxId );
1896
+ YQL_ENSURE (ContainOnlyLiteralStages (request));
1897
+
1898
+ auto ev = ::NKikimr::NKqp::ExecuteLiteral (std::move (request), Counters, TActorId{}, MakeIntrusive<TUserRequestContext>());
1899
+ TExecPhysicalResult result;
1900
+ FillPhysicalResult (ev, result, params, txIndex);
1901
+ return result;
1902
+ }
1903
+
1874
1904
TFuture<TQueryResult> ExecScanQueryAst (const TString& cluster, const TString& query,
1875
1905
TQueryData::TPtr params, const TAstQuerySettings& settings, ui64 rowsLimit) override
1876
1906
{
0 commit comments