@@ -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 <
@@ -595,32 +668,8 @@ class TKqpExecLiteralRequestHandler: public TActorBootstrapped<TKqpExecLiteralRe
595
668
}
596
669
597
670
void ProcessPureExecution (std::unique_ptr<TEvKqpExecuter::TEvTxResponse>& ev) {
598
- auto * response = ev->Record .MutableResponse ();
599
-
600
671
TResult result;
601
- if (response->GetStatus () == Ydb::StatusIds::SUCCESS) {
602
- result.SetSuccess ();
603
- result.ExecuterResult .Swap (response->MutableResult ());
604
- {
605
- auto g = Parameters->TypeEnv ().BindAllocator ();
606
-
607
- auto & txResults = ev->GetTxResults ();
608
- result.Results .reserve (txResults.size ());
609
- for (auto & tx : txResults) {
610
- result.Results .emplace_back (tx.GetMkql ());
611
- }
612
- Parameters->AddTxHolders (std::move (ev->GetTxHolders ()));
613
-
614
- if (!txResults.empty ()) {
615
- Parameters->AddTxResults (TxIndex, std::move (txResults));
616
- }
617
- }
618
- } else {
619
- for (auto & issue : response->GetIssues ()) {
620
- result.AddIssue (NYql::IssueFromMessage (issue));
621
- }
622
- }
623
-
672
+ FillPhysicalResult (ev, result, Parameters, TxIndex);
624
673
Promise.SetValue (std::move (result));
625
674
this ->PassAway ();
626
675
}
@@ -1785,79 +1834,60 @@ class TKikimrIcGateway : public IKqpGateway {
1785
1834
auto preparedQuery = std::make_unique<NKikimrKqp::TPreparedQuery>();
1786
1835
auto & phyQuery = *preparedQuery->MutablePhysicalQuery ();
1787
1836
NKikimr::NKqp::IKqpGateway::TExecPhysicalRequest literalRequest (txAlloc);
1788
-
1789
- literalRequest.NeedTxId = false ;
1790
- literalRequest.MaxAffectedShards = 0 ;
1791
- literalRequest.TotalReadSizeLimitBytes = 0 ;
1792
- literalRequest.MkqlMemoryLimit = 100_MB;
1793
-
1794
- auto & transaction = *phyQuery.AddTransactions ();
1795
- transaction.SetType (NKqpProto::TKqpPhyTx::TYPE_COMPUTE);
1796
-
1797
- auto & stage = *transaction.AddStages ();
1798
- auto & stageProgram = *stage.MutableProgram ();
1799
- stageProgram.SetRuntimeVersion (NYql::NDqProto::RUNTIME_VERSION_YQL_1_0);
1800
- stageProgram.SetRaw (program);
1801
- stage.SetOutputsCount (1 );
1802
-
1803
- auto & taskResult = *transaction.AddResults ();
1804
- *taskResult.MutableItemType () = resultType;
1805
- auto & taskConnection = *taskResult.MutableConnection ();
1806
- taskConnection.SetStageIndex (0 );
1837
+ PrepareLiteralRequest (literalRequest, phyQuery, program, resultType);
1807
1838
1808
1839
NKikimr::NKqp::TPreparedQueryHolder queryHolder (preparedQuery.release (), txAlloc->HolderFactory .GetFunctionRegistry ());
1809
-
1810
1840
NKikimr::NKqp::TQueryData::TPtr params = std::make_shared<NKikimr::NKqp::TQueryData>(txAlloc);
1811
-
1812
1841
literalRequest.Transactions .emplace_back (queryHolder.GetPhyTx (0 ), params);
1813
1842
1814
1843
return ExecuteLiteral (std::move (literalRequest), params, 0 ).Apply ([](const auto & future) {
1815
1844
const auto & result = future.GetValue ();
1816
-
1817
1845
TExecuteLiteralResult literalResult;
1818
-
1819
- if (result.Success ()) {
1820
- YQL_ENSURE (result.Results .size () == 1 );
1821
- literalResult.SetSuccess ();
1822
- literalResult.Result = result.Results [0 ];
1823
- } else {
1824
- literalResult.SetStatus (result.Status ());
1825
- literalResult.AddIssues (result.Issues ());
1826
- }
1827
-
1846
+ FillLiteralResult (result, literalResult);
1828
1847
return literalResult;
1829
1848
});
1830
1849
}
1831
1850
1851
+ TExecuteLiteralResult ExecuteLiteralInstant (const TString& program, const NKikimrMiniKQL::TType& resultType, NKikimr::NKqp::TTxAllocatorState::TPtr txAlloc) override {
1852
+ auto preparedQuery = std::make_unique<NKikimrKqp::TPreparedQuery>();
1853
+ auto & phyQuery = *preparedQuery->MutablePhysicalQuery ();
1854
+ NKikimr::NKqp::IKqpGateway::TExecPhysicalRequest literalRequest (txAlloc);
1855
+ PrepareLiteralRequest (literalRequest, phyQuery, program, resultType);
1856
+
1857
+ NKikimr::NKqp::TPreparedQueryHolder queryHolder (preparedQuery.release (), txAlloc->HolderFactory .GetFunctionRegistry ());
1858
+ NKikimr::NKqp::TQueryData::TPtr params = std::make_shared<NKikimr::NKqp::TQueryData>(txAlloc);
1859
+ literalRequest.Transactions .emplace_back (queryHolder.GetPhyTx (0 ), params);
1860
+
1861
+ auto result = ExecuteLiteralInstant1 (std::move (literalRequest), params, 0 );
1862
+
1863
+ TExecuteLiteralResult literalResult;
1864
+ FillLiteralResult (result, literalResult);
1865
+ return literalResult;
1866
+ }
1832
1867
1833
1868
TFuture<TExecPhysicalResult> ExecuteLiteral (TExecPhysicalRequest&& request, TQueryData::TPtr params, ui32 txIndex) override {
1834
1869
YQL_ENSURE (!request.Transactions .empty ());
1835
1870
YQL_ENSURE (request.DataShardLocks .empty ());
1836
1871
YQL_ENSURE (!request.NeedTxId );
1837
-
1838
- auto containOnlyLiteralStages = [](const auto & request) {
1839
- for (const auto & tx : request.Transactions ) {
1840
- if (tx.Body ->GetType () != NKqpProto::TKqpPhyTx::TYPE_COMPUTE) {
1841
- return false ;
1842
- }
1843
-
1844
- for (const auto & stage : tx.Body ->GetStages ()) {
1845
- if (stage.InputsSize () != 0 ) {
1846
- return false ;
1847
- }
1848
- }
1849
- }
1850
-
1851
- return true ;
1852
- };
1853
-
1854
- YQL_ENSURE (containOnlyLiteralStages (request));
1872
+ YQL_ENSURE (ContainOnlyLiteralStages (request));
1855
1873
auto promise = NewPromise<TExecPhysicalResult>();
1856
1874
IActor* requestHandler = new TKqpExecLiteralRequestHandler (std::move (request), Counters, promise, params, txIndex);
1857
1875
RegisterActor (requestHandler);
1858
1876
return promise.GetFuture ();
1859
1877
}
1860
1878
1879
+ TExecPhysicalResult ExecuteLiteralInstant1 (TExecPhysicalRequest&& request, TQueryData::TPtr params, ui32 txIndex) override {
1880
+ YQL_ENSURE (!request.Transactions .empty ());
1881
+ YQL_ENSURE (request.DataShardLocks .empty ());
1882
+ YQL_ENSURE (!request.NeedTxId );
1883
+ YQL_ENSURE (ContainOnlyLiteralStages (request));
1884
+
1885
+ auto ev = ::NKikimr::NKqp::ExecuteLiteral (std::move (request), Counters, TActorId{}, MakeIntrusive<TUserRequestContext>());
1886
+ TExecPhysicalResult result;
1887
+ FillPhysicalResult (ev, result, params, txIndex);
1888
+ return result;
1889
+ }
1890
+
1861
1891
TFuture<TQueryResult> ExecScanQueryAst (const TString& cluster, const TString& query,
1862
1892
TQueryData::TPtr params, const TAstQuerySettings& settings, ui64 rowsLimit) override
1863
1893
{
0 commit comments