@@ -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 <
@@ -619,32 +692,8 @@ class TKqpExecLiteralRequestHandler: public TActorBootstrapped<TKqpExecLiteralRe
619
692
}
620
693
621
694
void ProcessPureExecution (std::unique_ptr<TEvKqpExecuter::TEvTxResponse>& ev) {
622
- auto * response = ev->Record .MutableResponse ();
623
-
624
695
TResult result;
625
- if (response->GetStatus () == Ydb::StatusIds::SUCCESS) {
626
- result.SetSuccess ();
627
- result.ExecuterResult .Swap (response->MutableResult ());
628
- {
629
- auto g = Parameters->TypeEnv ().BindAllocator ();
630
-
631
- auto & txResults = ev->GetTxResults ();
632
- result.Results .reserve (txResults.size ());
633
- for (auto & tx : txResults) {
634
- result.Results .emplace_back (tx.GetMkql ());
635
- }
636
- Parameters->AddTxHolders (std::move (ev->GetTxHolders ()));
637
-
638
- if (!txResults.empty ()) {
639
- Parameters->AddTxResults (TxIndex, std::move (txResults));
640
- }
641
- }
642
- } else {
643
- for (auto & issue : response->GetIssues ()) {
644
- result.AddIssue (NYql::IssueFromMessage (issue));
645
- }
646
- }
647
-
696
+ FillPhysicalResult (ev, result, Parameters, TxIndex);
648
697
Promise.SetValue (std::move (result));
649
698
this ->PassAway ();
650
699
}
@@ -1796,79 +1845,60 @@ class TKikimrIcGateway : public IKqpGateway {
1796
1845
auto preparedQuery = std::make_unique<NKikimrKqp::TPreparedQuery>();
1797
1846
auto & phyQuery = *preparedQuery->MutablePhysicalQuery ();
1798
1847
NKikimr::NKqp::IKqpGateway::TExecPhysicalRequest literalRequest (txAlloc);
1799
-
1800
- literalRequest.NeedTxId = false ;
1801
- literalRequest.MaxAffectedShards = 0 ;
1802
- literalRequest.TotalReadSizeLimitBytes = 0 ;
1803
- literalRequest.MkqlMemoryLimit = 100_MB;
1804
-
1805
- auto & transaction = *phyQuery.AddTransactions ();
1806
- transaction.SetType (NKqpProto::TKqpPhyTx::TYPE_COMPUTE);
1807
-
1808
- auto & stage = *transaction.AddStages ();
1809
- auto & stageProgram = *stage.MutableProgram ();
1810
- stageProgram.SetRuntimeVersion (NYql::NDqProto::RUNTIME_VERSION_YQL_1_0);
1811
- stageProgram.SetRaw (program);
1812
- stage.SetOutputsCount (1 );
1813
-
1814
- auto & taskResult = *transaction.AddResults ();
1815
- *taskResult.MutableItemType () = resultType;
1816
- auto & taskConnection = *taskResult.MutableConnection ();
1817
- taskConnection.SetStageIndex (0 );
1848
+ PrepareLiteralRequest (literalRequest, phyQuery, program, resultType);
1818
1849
1819
1850
NKikimr::NKqp::TPreparedQueryHolder queryHolder (preparedQuery.release (), txAlloc->HolderFactory .GetFunctionRegistry ());
1820
-
1821
1851
NKikimr::NKqp::TQueryData::TPtr params = std::make_shared<NKikimr::NKqp::TQueryData>(txAlloc);
1822
-
1823
1852
literalRequest.Transactions .emplace_back (queryHolder.GetPhyTx (0 ), params);
1824
1853
1825
1854
return ExecuteLiteral (std::move (literalRequest), params, 0 ).Apply ([](const auto & future) {
1826
1855
const auto & result = future.GetValue ();
1827
-
1828
1856
TExecuteLiteralResult literalResult;
1829
-
1830
- if (result.Success ()) {
1831
- YQL_ENSURE (result.Results .size () == 1 );
1832
- literalResult.SetSuccess ();
1833
- literalResult.Result = result.Results [0 ];
1834
- } else {
1835
- literalResult.SetStatus (result.Status ());
1836
- literalResult.AddIssues (result.Issues ());
1837
- }
1838
-
1857
+ FillLiteralResult (result, literalResult);
1839
1858
return literalResult;
1840
1859
});
1841
1860
}
1842
1861
1862
+ TExecuteLiteralResult ExecuteLiteralInstant (const TString& program, const NKikimrMiniKQL::TType& resultType, NKikimr::NKqp::TTxAllocatorState::TPtr txAlloc) override {
1863
+ auto preparedQuery = std::make_unique<NKikimrKqp::TPreparedQuery>();
1864
+ auto & phyQuery = *preparedQuery->MutablePhysicalQuery ();
1865
+ NKikimr::NKqp::IKqpGateway::TExecPhysicalRequest literalRequest (txAlloc);
1866
+ PrepareLiteralRequest (literalRequest, phyQuery, program, resultType);
1867
+
1868
+ NKikimr::NKqp::TPreparedQueryHolder queryHolder (preparedQuery.release (), txAlloc->HolderFactory .GetFunctionRegistry ());
1869
+ NKikimr::NKqp::TQueryData::TPtr params = std::make_shared<NKikimr::NKqp::TQueryData>(txAlloc);
1870
+ literalRequest.Transactions .emplace_back (queryHolder.GetPhyTx (0 ), params);
1871
+
1872
+ auto result = ExecuteLiteralInstant (std::move (literalRequest), params, 0 );
1873
+
1874
+ TExecuteLiteralResult literalResult;
1875
+ FillLiteralResult (result, literalResult);
1876
+ return literalResult;
1877
+ }
1843
1878
1844
1879
TFuture<TExecPhysicalResult> ExecuteLiteral (TExecPhysicalRequest&& request, TQueryData::TPtr params, ui32 txIndex) override {
1845
1880
YQL_ENSURE (!request.Transactions .empty ());
1846
1881
YQL_ENSURE (request.DataShardLocks .empty ());
1847
1882
YQL_ENSURE (!request.NeedTxId );
1848
-
1849
- auto containOnlyLiteralStages = [](const auto & request) {
1850
- for (const auto & tx : request.Transactions ) {
1851
- if (tx.Body ->GetType () != NKqpProto::TKqpPhyTx::TYPE_COMPUTE) {
1852
- return false ;
1853
- }
1854
-
1855
- for (const auto & stage : tx.Body ->GetStages ()) {
1856
- if (stage.InputsSize () != 0 ) {
1857
- return false ;
1858
- }
1859
- }
1860
- }
1861
-
1862
- return true ;
1863
- };
1864
-
1865
- YQL_ENSURE (containOnlyLiteralStages (request));
1883
+ YQL_ENSURE (ContainOnlyLiteralStages (request));
1866
1884
auto promise = NewPromise<TExecPhysicalResult>();
1867
1885
IActor* requestHandler = new TKqpExecLiteralRequestHandler (std::move (request), Counters, promise, params, txIndex);
1868
1886
RegisterActor (requestHandler);
1869
1887
return promise.GetFuture ();
1870
1888
}
1871
1889
1890
+ TExecPhysicalResult ExecuteLiteralInstant (TExecPhysicalRequest&& request, TQueryData::TPtr params, ui32 txIndex) override {
1891
+ YQL_ENSURE (!request.Transactions .empty ());
1892
+ YQL_ENSURE (request.DataShardLocks .empty ());
1893
+ YQL_ENSURE (!request.NeedTxId );
1894
+ YQL_ENSURE (ContainOnlyLiteralStages (request));
1895
+
1896
+ auto ev = ::NKikimr::NKqp::ExecuteLiteral (std::move (request), Counters, TActorId{}, MakeIntrusive<TUserRequestContext>());
1897
+ TExecPhysicalResult result;
1898
+ FillPhysicalResult (ev, result, params, txIndex);
1899
+ return result;
1900
+ }
1901
+
1872
1902
TFuture<TQueryResult> ExecScanQueryAst (const TString& cluster, const TString& query,
1873
1903
TQueryData::TPtr params, const TAstQuerySettings& settings, ui64 rowsLimit) override
1874
1904
{
0 commit comments