summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/query.cpp
diff options
context:
space:
mode:
authorudovichenko-r <[email protected]>2024-11-12 22:07:02 +0300
committerudovichenko-r <[email protected]>2024-11-12 22:21:07 +0300
commitfa5655229271d7a09cce8033d1097f1b03daf94e (patch)
tree5922c2db17789e411b6cc46069c66188e834f28b /yql/essentials/sql/v1/query.cpp
parent77c13da33ae29c033359e516ac2eb55a6c3d5e9e (diff)
Apply GH commits
Apply GH: Extract prefix and entries in backup-related sql (#10807) Apply GH: Fix syntax for Column Family (#10781) Apply GH: Case-insensitive mode for searching modules and functions (#10842) Apply GH: Fixed i/o for pg_proc (#10914) Apply GH: An option to render SQL transalation with Seq! (#11015) commit_hash:d2d2fcdef2bbd0434236aef325aa071c7e39c526
Diffstat (limited to 'yql/essentials/sql/v1/query.cpp')
-rw-r--r--yql/essentials/sql/v1/query.cpp169
1 files changed, 123 insertions, 46 deletions
diff --git a/yql/essentials/sql/v1/query.cpp b/yql/essentials/sql/v1/query.cpp
index 5548587090e..56dd8bd63d7 100644
--- a/yql/essentials/sql/v1/query.cpp
+++ b/yql/essentials/sql/v1/query.cpp
@@ -2693,15 +2693,44 @@ TNodePtr BuildWriteResult(TPosition pos, const TString& label, TNodePtr settings
class TYqlProgramNode: public TAstListNode {
public:
- TYqlProgramNode(TPosition pos, const TVector<TNodePtr>& blocks, bool topLevel, TScopedStatePtr scoped)
+ TYqlProgramNode(TPosition pos, const TVector<TNodePtr>& blocks, bool topLevel, TScopedStatePtr scoped, bool useSeq)
: TAstListNode(pos)
, Blocks(blocks)
, TopLevel(topLevel)
, Scoped(scoped)
+ , UseSeq(useSeq)
{}
bool DoInit(TContext& ctx, ISource* src) override {
bool hasError = false;
+ INode::TPtr currentWorldsHolder;
+ INode::TPtr seqNode;
+ if (UseSeq) {
+ currentWorldsHolder = new TAstListNodeImpl(GetPos());
+ seqNode = new TAstListNodeImpl(GetPos());
+ seqNode->Add("Seq!","world");
+ }
+
+ INode* currentWorlds = UseSeq ? currentWorldsHolder.Get() : this;
+ auto flushCurrentWorlds = [&](bool changeSeq, bool finish) {
+ currentWorldsHolder->Add(Y("return","world"));
+ auto lambda = BuildLambda(GetPos(), Y("world"), Y("block", Q(currentWorldsHolder)));
+ seqNode->Add(lambda);
+
+ if (finish) {
+ Add(Y("let", "world", seqNode));
+ } else {
+ currentWorldsHolder = new TAstListNodeImpl(GetPos());
+ currentWorlds = currentWorldsHolder.Get();
+ }
+
+ if (changeSeq) {
+ Add(Y("let", "world", seqNode));
+ seqNode = new TAstListNodeImpl(GetPos());
+ seqNode->Add("Seq!","world");
+ }
+ };
+
if (TopLevel) {
for (auto& var: ctx.Variables) {
if (!var.second.second->Init(ctx, src)) {
@@ -2798,33 +2827,33 @@ public:
auto resultSink = Y("DataSink", BuildQuotedAtom(Pos, TString(ResultProviderName)));
for (const auto& warningPragma : ctx.WarningPolicy.GetRules()) {
- Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
BuildQuotedAtom(Pos, "Warning"), BuildQuotedAtom(Pos, warningPragma.GetPattern()),
BuildQuotedAtom(Pos, to_lower(ToString(warningPragma.GetAction()))))));
}
if (ctx.ResultSizeLimit > 0) {
- Add(Y("let", "world", Y(TString(ConfigureName), "world", resultSink,
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", resultSink,
BuildQuotedAtom(Pos, "SizeLimit"), BuildQuotedAtom(Pos, ToString(ctx.ResultSizeLimit)))));
}
if (!ctx.PragmaPullUpFlatMapOverJoin) {
- Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
BuildQuotedAtom(Pos, "DisablePullUpFlatMapOverJoin"))));
}
if (ctx.FilterPushdownOverJoinOptionalSide) {
- Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
BuildQuotedAtom(Pos, "FilterPushdownOverJoinOptionalSide"))));
}
if (!ctx.RotateJoinTree) {
- Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
BuildQuotedAtom(Pos, "RotateJoinTree"), BuildQuotedAtom(Pos, "false"))));
}
if (ctx.DiscoveryMode) {
- Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
BuildQuotedAtom(Pos, "DiscoveryMode"))));
}
@@ -2835,12 +2864,12 @@ public:
} else if (ctx.DqEngineForce) {
mode = "force";
}
- Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
BuildQuotedAtom(Pos, "DqEngine"), BuildQuotedAtom(Pos, mode))));
}
if (ctx.CostBasedOptimizer) {
- Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
BuildQuotedAtom(Pos, "CostBasedOptimizer"), BuildQuotedAtom(Pos, ctx.CostBasedOptimizer))));
}
@@ -2850,43 +2879,43 @@ public:
pragmaName = "JsonQueryReturnsJsonDocument";
}
- Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource, BuildQuotedAtom(Pos, pragmaName))));
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource, BuildQuotedAtom(Pos, pragmaName))));
}
if (ctx.OrderedColumns) {
- Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
BuildQuotedAtom(Pos, "OrderedColumns"))));
}
if (ctx.PqReadByRtmrCluster) {
auto pqSourceAll = Y("DataSource", BuildQuotedAtom(Pos, TString(PqProviderName)), BuildQuotedAtom(Pos, "$all"));
- Add(Y("let", "world", Y(TString(ConfigureName), "world", pqSourceAll,
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", pqSourceAll,
BuildQuotedAtom(Pos, "Attr"), BuildQuotedAtom(Pos, "PqReadByRtmrCluster_"), BuildQuotedAtom(Pos, ctx.PqReadByRtmrCluster))));
auto rtmrSourceAll = Y("DataSource", BuildQuotedAtom(Pos, TString(RtmrProviderName)), BuildQuotedAtom(Pos, "$all"));
- Add(Y("let", "world", Y(TString(ConfigureName), "world", rtmrSourceAll,
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", rtmrSourceAll,
BuildQuotedAtom(Pos, "Attr"), BuildQuotedAtom(Pos, "PqReadByRtmrCluster_"), BuildQuotedAtom(Pos, ctx.PqReadByRtmrCluster))));
if (ctx.PqReadByRtmrCluster != "dq") {
// set any dynamic settings for particular RTMR cluster for CommitAll!
auto rtmrSource = Y("DataSource", BuildQuotedAtom(Pos, TString(RtmrProviderName)), BuildQuotedAtom(Pos, ctx.PqReadByRtmrCluster));
- Add(Y("let", "world", Y(TString(ConfigureName), "world", rtmrSource,
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", rtmrSource,
BuildQuotedAtom(Pos, "Attr"), BuildQuotedAtom(Pos, "Dummy_"), BuildQuotedAtom(Pos, "1"))));
}
}
if (ctx.YsonCastToString.Defined()) {
const TString pragmaName = *ctx.YsonCastToString ? "YsonCastToString" : "DisableYsonCastToString";
- Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource, BuildQuotedAtom(Pos, pragmaName))));
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource, BuildQuotedAtom(Pos, pragmaName))));
}
if (ctx.UseBlocks) {
- Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource, BuildQuotedAtom(Pos, "UseBlocks"))));
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource, BuildQuotedAtom(Pos, "UseBlocks"))));
}
if (ctx.BlockEngineEnable) {
TString mode = ctx.BlockEngineForce ? "force" : "auto";
- Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
+ currentWorlds->Add(Y("let", "world", Y(TString(ConfigureName), "world", configSource,
BuildQuotedAtom(Pos, "BlockEngine"), BuildQuotedAtom(Pos, mode))));
}
}
@@ -2914,22 +2943,41 @@ public:
Add(Y("let", data.first, node));
}
+ if (UseSeq) {
+ flushCurrentWorlds(false, false);
+ }
+
for (auto& block: Blocks) {
const auto subqueryAliasPtr = block->SubqueryAlias();
if (subqueryAliasPtr) {
if (block->UsedSubquery()) {
+ if (UseSeq) {
+ flushCurrentWorlds(true, false);
+ }
+
const auto& ref = block->GetLabel();
YQL_ENSURE(!ref.empty());
Add(block);
- Add(Y("let", "world", Y("Nth", *subqueryAliasPtr, Q("0"))));
+ currentWorlds->Add(Y("let", "world", Y("Nth", *subqueryAliasPtr, Q("0"))));
Add(Y("let", ref, Y("Nth", *subqueryAliasPtr, Q("1"))));
}
} else {
const auto& ref = block->GetLabel();
- Add(Y("let", ref ? ref : "world", block));
+ if (ref) {
+ Add(Y("let", ref, block));
+ } else {
+ currentWorlds->Add(Y("let", "world", block));
+ if (UseSeq) {
+ flushCurrentWorlds(false, false);
+ }
+ }
}
}
+ if (UseSeq) {
+ flushCurrentWorlds(false, true);
+ }
+
if (TopLevel) {
if (ctx.UniversalAliases) {
decltype(Nodes) preparedNodes;
@@ -2974,10 +3022,11 @@ private:
TVector<TNodePtr> Blocks;
const bool TopLevel;
TScopedStatePtr Scoped;
+ const bool UseSeq;
};
-TNodePtr BuildQuery(TPosition pos, const TVector<TNodePtr>& blocks, bool topLevel, TScopedStatePtr scoped) {
- return new TYqlProgramNode(pos, blocks, topLevel, scoped);
+TNodePtr BuildQuery(TPosition pos, const TVector<TNodePtr>& blocks, bool topLevel, TScopedStatePtr scoped, bool useSeq) {
+ return new TYqlProgramNode(pos, blocks, topLevel, scoped, useSeq);
}
class TPragmaNode final: public INode {
@@ -3285,16 +3334,18 @@ class TBaseBackupCollectionNode
public:
TBaseBackupCollectionNode(
TPosition pos,
+ const TString& prefix,
const TString& objectId,
const TObjectOperatorContext& context)
: TBase(pos)
, TObjectOperatorContext(context)
+ , Prefix(prefix)
, Id(objectId)
{}
bool DoInit(TContext& ctx, ISource* src) final {
auto keys = Y("Key");
- keys = L(keys, Q(Y(Q("backupCollection"), Y("String", BuildQuotedAtom(Pos, Id)))));
+ keys = L(keys, Q(Y(Q("backupCollection"), Y("String", BuildQuotedAtom(Pos, Id)), Y("String", BuildQuotedAtom(Pos, Prefix)))));
auto options = this->FillOptions(ctx, Y());
Add("block", Q(Y(
@@ -3309,6 +3360,7 @@ public:
virtual INode::TPtr FillOptions(TContext& ctx, INode::TPtr options) const = 0;
protected:
+ TString Prefix;
TString Id;
};
@@ -3319,10 +3371,11 @@ class TCreateBackupCollectionNode
public:
TCreateBackupCollectionNode(
TPosition pos,
+ const TString& prefix,
const TString& objectId,
const TCreateBackupCollectionParameters& params,
const TObjectOperatorContext& context)
- : TBase(pos, objectId, context)
+ : TBase(pos, prefix, objectId, context)
, Params(params)
{}
@@ -3331,7 +3384,7 @@ public:
auto settings = Y();
for (auto& [key, value] : Params.Settings) {
- settings->Add(Q(Y(BuildQuotedAtom(Pos, key), value.Build())));
+ settings->Add(Q(Y(BuildQuotedAtom(Pos, key), Y("String", value.Build()))));
}
options->Add(Q(Y(Q("settings"), Q(settings))));
@@ -3349,7 +3402,7 @@ public:
}
TPtr DoClone() const final {
- return new TCreateBackupCollectionNode(GetPos(), Id, Params, *this);
+ return new TCreateBackupCollectionNode(GetPos(), Prefix, Id, Params, *this);
}
private:
@@ -3363,10 +3416,11 @@ class TAlterBackupCollectionNode
public:
TAlterBackupCollectionNode(
TPosition pos,
+ const TString& prefix,
const TString& objectId,
const TAlterBackupCollectionParameters& params,
const TObjectOperatorContext& context)
- : TBase(pos, objectId, context)
+ : TBase(pos, prefix, objectId, context)
, Params(params)
{}
@@ -3375,7 +3429,7 @@ public:
auto settings = Y();
for (auto& [key, value] : Params.Settings) {
- settings->Add(Q(Y(BuildQuotedAtom(Pos, key), value.Build())));
+ settings->Add(Q(Y(BuildQuotedAtom(Pos, key), Y("String", value.Build()))));
}
options->Add(Q(Y(Q("settings"), Q(settings))));
@@ -3403,7 +3457,7 @@ public:
}
TPtr DoClone() const final {
- return new TAlterBackupCollectionNode(GetPos(), Id, Params, *this);
+ return new TAlterBackupCollectionNode(GetPos(), Prefix, Id, Params, *this);
}
private:
@@ -3417,10 +3471,11 @@ class TDropBackupCollectionNode
public:
TDropBackupCollectionNode(
TPosition pos,
+ const TString& prefix,
const TString& objectId,
const TDropBackupCollectionParameters&,
const TObjectOperatorContext& context)
- : TBase(pos, objectId, context)
+ : TBase(pos, prefix, objectId, context)
{}
virtual INode::TPtr FillOptions(TContext&, INode::TPtr options) const final {
@@ -3431,29 +3486,38 @@ public:
TPtr DoClone() const final {
TDropBackupCollectionParameters params;
- return new TDropBackupCollectionNode(GetPos(), Id, params, *this);
+ return new TDropBackupCollectionNode(GetPos(), Prefix, Id, params, *this);
}
};
-TNodePtr BuildCreateBackupCollection(TPosition pos, const TString& id,
+TNodePtr BuildCreateBackupCollection(
+ TPosition pos,
+ const TString& prefix,
+ const TString& id,
const TCreateBackupCollectionParameters& params,
const TObjectOperatorContext& context)
{
- return new TCreateBackupCollectionNode(pos, id, params, context);
+ return new TCreateBackupCollectionNode(pos, prefix, id, params, context);
}
-TNodePtr BuildAlterBackupCollection(TPosition pos, const TString& id,
+TNodePtr BuildAlterBackupCollection(
+ TPosition pos,
+ const TString& prefix,
+ const TString& id,
const TAlterBackupCollectionParameters& params,
const TObjectOperatorContext& context)
{
- return new TAlterBackupCollectionNode(pos, id, params, context);
+ return new TAlterBackupCollectionNode(pos, prefix, id, params, context);
}
-TNodePtr BuildDropBackupCollection(TPosition pos, const TString& id,
+TNodePtr BuildDropBackupCollection(
+ TPosition pos,
+ const TString& prefix,
+ const TString& id,
const TDropBackupCollectionParameters& params,
const TObjectOperatorContext& context)
{
- return new TDropBackupCollectionNode(pos, id, params, context);
+ return new TDropBackupCollectionNode(pos, prefix, id, params, context);
}
class TBackupNode final
@@ -3464,11 +3528,13 @@ class TBackupNode final
public:
TBackupNode(
TPosition pos,
+ const TString& prefix,
const TString& id,
const TBackupParameters& params,
const TObjectOperatorContext& context)
: TBase(pos)
, TObjectOperatorContext(context)
+ , Prefix(prefix)
, Id(id)
, Params(params)
{
@@ -3477,13 +3543,14 @@ public:
bool DoInit(TContext& ctx, ISource* src) override {
auto keys = Y("Key");
- keys = L(keys, Q(Y(Q("backup"), Y("String", BuildQuotedAtom(Pos, Id)))));
+ keys = L(keys, Q(Y(Q("backup"), Y("String", BuildQuotedAtom(Pos, Id)), Y("String", BuildQuotedAtom(Pos, Prefix)))));
auto opts = Y();
- opts->Add(Q(Y(Q("mode"), Q("backup"))));
if (Params.Incremental) {
- opts->Add(Q(Y(Q("incremental"))));
+ opts->Add(Q(Y(Q("mode"), Q("backupIncremental"))));
+ } else {
+ opts->Add(Q(Y(Q("mode"), Q("backup"))));
}
Add("block", Q(Y(
@@ -3496,18 +3563,22 @@ public:
}
TPtr DoClone() const final {
- return new TBackupNode(GetPos(), Id, Params, *this);
+ return new TBackupNode(GetPos(), Prefix, Id, Params, *this);
}
private:
+ TString Prefix;
TString Id;
TBackupParameters Params;
};
-TNodePtr BuildBackup(TPosition pos, const TString& id,
+TNodePtr BuildBackup(
+ TPosition pos,
+ const TString& prefix,
+ const TString& id,
const TBackupParameters& params,
const TObjectOperatorContext& context)
{
- return new TBackupNode(pos, id, params, context);
+ return new TBackupNode(pos, prefix, id, params, context);
}
class TRestoreNode final
@@ -3518,11 +3589,13 @@ class TRestoreNode final
public:
TRestoreNode(
TPosition pos,
+ const TString& prefix,
const TString& id,
const TRestoreParameters& params,
const TObjectOperatorContext& context)
: TBase(pos)
, TObjectOperatorContext(context)
+ , Prefix(prefix)
, Id(id)
, Params(params)
{
@@ -3531,7 +3604,7 @@ public:
bool DoInit(TContext& ctx, ISource* src) override {
auto keys = Y("Key");
- keys = L(keys, Q(Y(Q("restore"), Y("String", BuildQuotedAtom(Pos, Id)))));
+ keys = L(keys, Q(Y(Q("restore"), Y("String", BuildQuotedAtom(Pos, Id)), Y("String", BuildQuotedAtom(Pos, Prefix)))));
auto opts = Y();
opts->Add(Q(Y(Q("mode"), Q("restore"))));
@@ -3550,18 +3623,22 @@ public:
}
TPtr DoClone() const final {
- return new TRestoreNode(GetPos(), Id, Params, *this);
+ return new TRestoreNode(GetPos(), Prefix, Id, Params, *this);
}
private:
+ TString Prefix;
TString Id;
TRestoreParameters Params;
};
-TNodePtr BuildRestore(TPosition pos, const TString& id,
+TNodePtr BuildRestore(
+ TPosition pos,
+ const TString& prefix,
+ const TString& id,
const TRestoreParameters& params,
const TObjectOperatorContext& context)
{
- return new TRestoreNode(pos, id, params, context);
+ return new TRestoreNode(pos, prefix, id, params, context);
}
} // namespace NSQLTranslationV1