summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/builtin.cpp
diff options
context:
space:
mode:
authorvvvv <[email protected]>2025-02-03 11:29:11 +0300
committervvvv <[email protected]>2025-02-03 11:53:49 +0300
commit3a1d187623efee16d2825e37ee54294c8fb0f6e7 (patch)
tree8ea179d4cfca44bb72bbbc7644feb298ab369f75 /yql/essentials/sql/v1/builtin.cpp
parent10cd04107980396de90d116fd67f75c50cd5beeb (diff)
YQL-19530 pass cpu & mem settings to Udf/ScriptUdf
commit_hash:21577e2038f1d80c16e671d74e0c9e1e00b6c448
Diffstat (limited to 'yql/essentials/sql/v1/builtin.cpp')
-rw-r--r--yql/essentials/sql/v1/builtin.cpp101
1 files changed, 71 insertions, 30 deletions
diff --git a/yql/essentials/sql/v1/builtin.cpp b/yql/essentials/sql/v1/builtin.cpp
index 8e49ba39f22..2cd2aeaee06 100644
--- a/yql/essentials/sql/v1/builtin.cpp
+++ b/yql/essentials/sql/v1/builtin.cpp
@@ -2286,7 +2286,8 @@ TVector<TNodePtr> BuildUdfArgs(const TContext& ctx, TPosition pos, const TVector
}
TNodePtr BuildSqlCall(TContext& ctx, TPosition pos, const TString& module, const TString& name, const TVector<TNodePtr>& args,
- TNodePtr positionalArgs, TNodePtr namedArgs, TNodePtr customUserType, const TDeferredAtom& typeConfig, TNodePtr runConfig)
+ TNodePtr positionalArgs, TNodePtr namedArgs, TNodePtr customUserType, const TDeferredAtom& typeConfig, TNodePtr runConfig,
+ TNodePtr options)
{
const TString fullName = module + "." + name;
TNodePtr callable;
@@ -2318,18 +2319,24 @@ TNodePtr BuildSqlCall(TContext& ctx, TPosition pos, const TString& module, const
// optional arguments
if (customUserType) {
sqlCallArgs.push_back(customUserType);
- } else if (!typeConfig.Empty()) {
+ } else if (!typeConfig.Empty() || runConfig || options) {
sqlCallArgs.push_back(new TCallNodeImpl(pos, "TupleType", {}));
}
if (!typeConfig.Empty()) {
sqlCallArgs.push_back(typeConfig.Build());
- } else if (runConfig) {
+ } else if (runConfig || options) {
sqlCallArgs.push_back(BuildQuotedAtom(pos, ""));
}
if (runConfig) {
sqlCallArgs.push_back(runConfig);
+ } else if (options) {
+ sqlCallArgs.push_back(new TCallNodeImpl(pos, "Void", {}));
+ }
+
+ if (options) {
+ sqlCallArgs.push_back(options);
}
return new TCallNodeImpl(pos, "SqlCall", sqlCallArgs);
@@ -2463,45 +2470,47 @@ TNodePtr BuildUdf(TContext& ctx, TPosition pos, const TString& module, const TSt
class TScriptUdf final: public INode {
public:
- TScriptUdf(TPosition pos, const TString& moduleName, const TString& funcName, const TVector<TNodePtr>& args)
+ TScriptUdf(TPosition pos, const TString& moduleName, const TString& funcName, const TVector<TNodePtr>& args,
+ TNodePtr options)
: INode(pos)
- , ModuleName(moduleName)
- , FuncName(funcName)
- , Args(args)
+ , ModuleName_(moduleName)
+ , FuncName_(funcName)
+ , Args_(args)
+ , Options_(options)
{}
bool DoInit(TContext& ctx, ISource* src) override {
- const bool isPython = ModuleName.find(TStringBuf("Python")) != TString::npos;
+ const bool isPython = ModuleName_.find(TStringBuf("Python")) != TString::npos;
if (!isPython) {
- if (Args.size() != 2) {
- ctx.Error(Pos) << ModuleName << " script declaration requires exactly two parameters";
+ if (Args_.size() != 2) {
+ ctx.Error(Pos) << ModuleName_ << " script declaration requires exactly two parameters";
return false;
}
} else {
- if (Args.size() < 1 || Args.size() > 2) {
- ctx.Error(Pos) << ModuleName << " script declaration requires one or two parameters";
+ if (Args_.size() < 1 || Args_.size() > 2) {
+ ctx.Error(Pos) << ModuleName_ << " script declaration requires one or two parameters";
return false;
}
}
- auto nameAtom = BuildQuotedAtom(Pos, FuncName);
- auto scriptNode = Args.back();
+ auto nameAtom = BuildQuotedAtom(Pos, FuncName_);
+ auto scriptNode = Args_.back();
if (!scriptNode->Init(ctx, src)) {
return false;
}
- auto scriptStrPtr = Args.back()->GetLiteral("String");
+ auto scriptStrPtr = Args_.back()->GetLiteral("String");
if (!ctx.CompactNamedExprs && scriptStrPtr && scriptStrPtr->size() > SQL_MAX_INLINE_SCRIPT_LEN) {
scriptNode = ctx.UniversalAlias("scriptudf", std::move(scriptNode));
}
INode::TPtr type;
- if (Args.size() == 2) {
- type = Args[0];
+ if (Args_.size() == 2) {
+ type = Args_[0];
} else {
// Python supports getting functions signatures right from docstrings
type = Y("EvaluateType", Y("ParseTypeHandle", Y("Apply",
Y("bind", "core_module", Q("PythonFuncSignature")),
- Q(ModuleName),
+ Q(ModuleName_),
scriptNode,
Y("String", nameAtom)
)));
@@ -2511,14 +2520,18 @@ public:
return false;
}
- Node = Y("ScriptUdf", Q(ModuleName), nameAtom, type, scriptNode);
+ Node_ = Y("ScriptUdf", Q(ModuleName_), nameAtom, type, scriptNode);
+ if (Options_) {
+ Node_ = L(Node_, Options_);
+ }
+
return true;
}
TAstNode* Translate(TContext& ctx) const override {
Y_UNUSED(ctx);
- Y_DEBUG_ABORT_UNLESS(Node);
- return Node->Translate(ctx);
+ Y_DEBUG_ABORT_UNLESS(Node_);
+ return Node_->Translate(ctx);
}
void DoUpdateState() const override {
@@ -2526,20 +2539,47 @@ public:
}
TNodePtr DoClone() const final {
- return new TScriptUdf(GetPos(), ModuleName, FuncName, CloneContainer(Args));
+ return new TScriptUdf(GetPos(), ModuleName_, FuncName_, CloneContainer(Args_), Options_);
}
void DoVisitChildren(const TVisitFunc& func, TVisitNodeSet& visited) const final {
- Y_DEBUG_ABORT_UNLESS(Node);
- Node->VisitTree(func, visited);
+ Y_DEBUG_ABORT_UNLESS(Node_);
+ Node_->VisitTree(func, visited);
+ }
+
+ const TString* FuncName() const final {
+ return &FuncName_;
+ }
+
+ const TString* ModuleName() const final {
+ return &ModuleName_;
+ }
+
+ bool IsScript() const final {
+ return true;
}
+
+ size_t GetTupleSize() const final {
+ return Args_.size();
+ }
+
+ TPtr GetTupleElement(size_t index) const final {
+ return Args_[index];
+ }
+
private:
- TString ModuleName;
- TString FuncName;
- TVector<TNodePtr> Args;
- TNodePtr Node;
+ TString ModuleName_;
+ TString FuncName_;
+ TVector<TNodePtr> Args_;
+ TNodePtr Node_;
+ TNodePtr Options_;
};
+TNodePtr BuildScriptUdf(TPosition pos, const TString& moduleName, const TString& funcName, const TVector<TNodePtr>& args,
+ TNodePtr options) {
+ return new TScriptUdf(pos, moduleName, funcName, args, options);
+}
+
template <bool Sorted, bool Hashed>
class TYqlToDict final: public TCallNode {
public:
@@ -3549,7 +3589,7 @@ TNodePtr BuildBuiltinFunc(TContext& ctx, TPosition pos, TString name, const TVec
return BuildUdf(ctx, pos, nameSpace, name, makeUdfArgs());
} else if (scriptType != NKikimr::NMiniKQL::EScriptType::Unknown) {
auto scriptName = NKikimr::NMiniKQL::IsCustomPython(scriptType) ? nameSpace : TString(NKikimr::NMiniKQL::ScriptTypeAsStr(scriptType));
- return new TScriptUdf(pos, scriptName, name, args);
+ return BuildScriptUdf(pos, scriptName, name, args, nullptr);
} else if (ns.empty()) {
if (auto simpleType = LookupSimpleType(normalizedName, ctx.FlexibleTypes, /* isPgType = */ false)) {
const auto type = *simpleType;
@@ -3871,7 +3911,8 @@ TNodePtr BuildBuiltinFunc(TContext& ctx, TPosition pos, TString name, const TVec
}
TNodePtr typeConfig = MakeTypeConfig(pos, ns, usedArgs);
- return BuildSqlCall(ctx, pos, nameSpace, name, usedArgs, positionalArgs, namedArgs, customUserType, TDeferredAtom(typeConfig, ctx), nullptr);
+ return BuildSqlCall(ctx, pos, nameSpace, name, usedArgs, positionalArgs, namedArgs, customUserType,
+ TDeferredAtom(typeConfig, ctx), nullptr, nullptr);
}
} // namespace NSQLTranslationV1