aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/minikql/mkql_program_builder.cpp
diff options
context:
space:
mode:
authorvvvv <vvvv@yandex-team.com>2025-01-24 16:13:52 +0300
committervvvv <vvvv@yandex-team.com>2025-01-24 16:30:59 +0300
commitb931832ccbfa1d08d641dfe3b5f28687f5aac162 (patch)
tree3140696ec6fec1bcc10b7224481d31d91dd1098c /yql/essentials/minikql/mkql_program_builder.cpp
parentb6545608166d359be492bb14ea1c8bd539b85f6d (diff)
downloadydb-b931832ccbfa1d08d641dfe3b5f28687f5aac162.tar.gz
DynamicVariant YQL-19499
commit_hash:b609442fce4217e33f5d5421582e4a145afde95d
Diffstat (limited to 'yql/essentials/minikql/mkql_program_builder.cpp')
-rw-r--r--yql/essentials/minikql/mkql_program_builder.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/yql/essentials/minikql/mkql_program_builder.cpp b/yql/essentials/minikql/mkql_program_builder.cpp
index 320566c496..7b0322bfb4 100644
--- a/yql/essentials/minikql/mkql_program_builder.cpp
+++ b/yql/essentials/minikql/mkql_program_builder.cpp
@@ -3447,6 +3447,25 @@ TRuntimeNode TProgramBuilder::VariantItem(TRuntimeNode variant) {
return TRuntimeNode(callableBuilder.Build(), false);
}
+TRuntimeNode TProgramBuilder::DynamicVariant(TRuntimeNode item, TRuntimeNode index, TType* variantType) {
+ if constexpr (RuntimeVersion < 56U) {
+ THROW yexception() << "Runtime version (" << RuntimeVersion << ") too old for " << __func__;
+ }
+
+ auto type = AS_TYPE(TVariantType, variantType);
+ auto expectedIndexSlot = type->GetUnderlyingType()->IsTuple() ? NUdf::EDataSlot::Uint32 : NUdf::EDataSlot::Utf8;
+ auto indexType = AS_TYPE(TDataType, index.GetStaticType());
+ MKQL_ENSURE(indexType->GetDataSlot() == expectedIndexSlot, "Mismatch type of index");
+
+ auto resType = TOptionalType::Create(type, Env);
+
+ TCallableBuilder callableBuilder(Env, __func__, resType);
+ callableBuilder.Add(item);
+ callableBuilder.Add(index);
+ callableBuilder.Add(TRuntimeNode(variantType, true));
+ return TRuntimeNode(callableBuilder.Build(), false);
+}
+
TRuntimeNode TProgramBuilder::VisitAll(TRuntimeNode variant, std::function<TRuntimeNode(ui32, TRuntimeNode)> handler) {
const auto type = AS_TYPE(TVariantType, variant);
std::vector<TRuntimeNode> items;