diff options
author | lambda-delta <[email protected]> | 2025-07-25 02:04:53 +0300 |
---|---|---|
committer | lambda-delta <[email protected]> | 2025-07-25 02:20:01 +0300 |
commit | 6725115425a5b56000b9323e7f9aa837f0700be2 (patch) | |
tree | e53f8451802d74d04c038e11f99d619953298358 /yql/essentials/sql/v1/sql_query.cpp | |
parent | 7c412951b0b1ecdfd65c92e872c4102899ffd984 (diff) |
YQL-20165: Refactor pragma handling in TSqlQuery
Move complex handlers to the table
Extract simple pragma implementations
commit_hash:cb0ebc041fd6d848e9d7701b0ca7db19965cd314
Diffstat (limited to 'yql/essentials/sql/v1/sql_query.cpp')
-rw-r--r-- | yql/essentials/sql/v1/sql_query.cpp | 1480 |
1 files changed, 681 insertions, 799 deletions
diff --git a/yql/essentials/sql/v1/sql_query.cpp b/yql/essentials/sql/v1/sql_query.cpp index fefd8dde4de..d556698e440 100644 --- a/yql/essentials/sql/v1/sql_query.cpp +++ b/yql/essentials/sql/v1/sql_query.cpp @@ -241,11 +241,11 @@ bool TSqlQuery::Statement(TVector<TNodePtr>& blocks, const TRule_sql_stmt_core& switch (altCase) { case TRule_sql_stmt_core::kAltSqlStmtCore1: { - bool success = false; - TNodePtr nodeExpr = PragmaStatement(core.GetAlt_sql_stmt_core1().GetRule_pragma_stmt1(), success); + TMaybe<TNodePtr> success = PragmaStatement(core.GetAlt_sql_stmt_core1().GetRule_pragma_stmt1()); if (!success) { return false; } + auto& nodeExpr = *success; if (nodeExpr) { AddStatementToBlocks(blocks, nodeExpr); } @@ -2621,9 +2621,643 @@ void TSqlQuery::AlterTableDropChangefeed(const TRule_alter_table_drop_changefeed params.DropChangefeeds.emplace_back(IdEx(node.GetRule_an_id3(), *this)); } +namespace { +#define CB_SIG TVector<TDeferredAtom>& values [[maybe_unused]], bool pragmaValueDefault [[maybe_unused]], TStringBuf pragma [[maybe_unused]], TSqlQuery& query [[maybe_unused]] + +using PragmaStatementCb = std::function<TMaybe<TNodePtr>(CB_SIG)>; + +struct TPragmaDescr { + TString CanonicalName; + PragmaStatementCb Cb; +}; + +template<typename T, std::convertible_to<T> U> +PragmaStatementCb SetCtxField(T TContext::* ParamPtr, U ParamValue) requires std::movable<U> { + return [ParamPtr, ParamValue = std::move(ParamValue)](CB_SIG) { + auto& Ctx_ = query.Context(); + Ctx_.*ParamPtr = std::move(ParamValue); + return TNodePtr{}; + }; +} + +THashMap<TString, TPragmaDescr>::value_type TableElemExt(TString name, PragmaStatementCb cb) { + TString normalizedName(name); + TMaybe<TIssue> err = NormalizeName({}, normalizedName); + Y_ABORT_UNLESS(err.Empty(), "%s", err->GetMessage().c_str()); + return {std::move(normalizedName), TPragmaDescr{std::move(name), std::move(cb)}}; +} + +#define TABLE_ELEM(name, param, value) TableElemExt(name, SetCtxField((&TContext::param), (value))) +#define PAIRED_TABLE_ELEM(name, param) TABLE_ELEM(name, param, true), TABLE_ELEM("Disable" name, param, false) + +THashMap<TString, TPragmaDescr> PragmaDescrs{ + TableElemExt("Udf", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if ((values.size() != 1 && values.size() != 2) || pragmaValueDefault) { + query.Error() << "Expected file alias as pragma value"; + return {}; + } + + if (ctx.Settings.FileAliasPrefix) { + if (values.size() == 1) { + values.emplace_back(TDeferredAtom(ctx.Pos(), "")); + } + + TString prefix; + if (!values[1].GetLiteral(prefix, ctx)) { + query.Error() << "Expected literal UDF module prefix in views"; + return {}; + } + + values[1] = TDeferredAtom(ctx.Pos(), ctx.Settings.FileAliasPrefix + prefix); + } + + return BuildPragma(ctx.Pos(), TString(ConfigProviderName), "ImportUdfs", values, false); + }), + TableElemExt("PackageVersion", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 2 || pragmaValueDefault) { + query.Error() << "Expected package name and version"; + return {}; + } + + ui32 version = 0; + TString versionString; + TString packageName; + if (!values[0].GetLiteral(packageName, ctx) || !values[1].GetLiteral(versionString, ctx)) { + return {}; + } + + if (!PackageVersionFromString(versionString, version)) { + query.Error() << "Unable to parse package version, possible values 0, 1, draft, release"; + return {}; + } + + ctx.SetPackageVersion(packageName, version); + return BuildPragma(ctx.Pos(), TString(ConfigProviderName), "SetPackageVersion", TVector<TDeferredAtom>{values[0], TDeferredAtom(values[1].Build()->GetPos(), ToString(version))}, false); + }), + TableElemExt("File", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() < 2U || values.size() > 3U || pragmaValueDefault) { + query.Error() << "Expected file alias, url and optional token name as pragma values"; + return {}; + } + + return BuildPragma(ctx.Pos(), TString(ConfigProviderName), "AddFileByUrl", values, false); + }), + TableElemExt("FileOption", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() < 3U) { + query.Error() << "Expected file alias, option key and value"; + return {}; + } + + return BuildPragma(ctx.Pos(), TString(ConfigProviderName), "SetFileOption", values, false); + }), + TableElemExt("Folder", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() < 2U || values.size() > 3U || pragmaValueDefault) { + query.Error() << "Expected folder alias, url and optional token name as pragma values"; + return {}; + } + return BuildPragma(ctx.Pos(), TString(ConfigProviderName), "AddFolderByUrl", values, false); + }), + TableElemExt("Library", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() < 1) { + query.Error() << "Expected non-empty file alias"; + return {}; + } + if (values.size() > 3) { + query.Error() << "Expected file alias and optional url and token name as pragma values"; + return {}; + } + + TString alias; + if (!values.front().GetLiteral(alias, ctx)) { + return {}; + } + + TContext::TLibraryStuff library; + std::get<TPosition>(library) = values.front().Build()->GetPos(); + if (values.size() > 1) { + auto& first = std::get<1U>(library); + first.emplace(); + first->second = values[1].Build()->GetPos(); + if (!values[1].GetLiteral(first->first, ctx)) { + return {}; + } + + TSet<TString> names; + SubstParameters(first->first, Nothing(), &names); + for (const auto& name : names) { + auto namedNode = query.GetNamedNode(name); + if (!namedNode) { + return {}; + } + } + if (values.size() > 2) { + auto& second = std::get<2U>(library); + second.emplace(); + second->second = values[2].Build()->GetPos(); + if (!values[2].GetLiteral(second->first, ctx)) { + return {}; + } + } + } + + ctx.Libraries[alias] = std::move(library); + return TNodePtr{}; + }), + TableElemExt("Package", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() < 2U || values.size() > 3U) { + query.Error() << "Expected package name, url and optional token name as pragma values"; + return {}; + } + + TString packageName; + if (!values.front().GetLiteral(packageName, ctx)) { + return {}; + } + + TContext::TPackageStuff package; + std::get<TPosition>(package) = values.front().Build()->GetPos(); + + auto fillLiteral = [&](auto& literal, size_t index) { + if (values.size() <= index) { + return true; + } + + constexpr bool optional = std::is_base_of_v< + std::optional<TContext::TLiteralWithPosition>, + std::decay_t<decltype(literal)>>; + + TContext::TLiteralWithPosition* literalPtr; + + if constexpr (optional) { + literal.emplace(); + literalPtr = &*literal; + } else { + literalPtr = &literal; + } + + literalPtr->second = values[index].Build()->GetPos(); + + if (!values[index].GetLiteral(literalPtr->first, ctx)) { + return false; + } + + return true; + }; + + // fill url + auto& urlLiteral = std::get<1U>(package); + if (!fillLiteral(urlLiteral, 1U)) { + return {}; + } + + TSet<TString> names; + SubstParameters(urlLiteral.first, Nothing(), &names); + for (const auto& name : names) { + auto namedNode = query.GetNamedNode(name); + if (!namedNode) { + return {}; + } + } + + // fill token + if (!fillLiteral(std::get<2U>(package), 2U)) { + return {}; + } + + ctx.Packages[packageName] = std::move(package); + return TNodePtr{}; + }), + TableElemExt("OverrideLibrary", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1U) { + query.Error() << "Expected override library alias as pragma value"; + return {}; + } + + TString alias; + if (!values.front().GetLiteral(alias, ctx)) { + return {}; + } + + TContext::TOverrideLibraryStuff overrideLibrary; + std::get<TPosition>(overrideLibrary) = values.front().Build()->GetPos(); + + ctx.OverrideLibraries[alias] = std::move(overrideLibrary); + return TNodePtr{}; + }), + TableElemExt("EquiJoin", [](CB_SIG) -> TMaybe<TNodePtr> { + return TNodePtr{}; + }), + TableElemExt("TablePathPrefix", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + TString value; + TMaybe<TString> arg; + + if (values.size() == 1 || values.size() == 2) { + if (!values.front().GetLiteral(value, ctx)) { + return {}; + } + + if (values.size() == 2) { + arg = value; + if (!values.back().GetLiteral(value, ctx)) { + return {}; + } + } + + if (!ctx.SetPathPrefix(value, arg)) { + return {}; + } + } else { + query.Error() << "Expected path prefix or tuple of (Provider, PathPrefix) or" + << " (Cluster, PathPrefix) as pragma value"; + return {}; + } + + return TNodePtr{}; + }), + TableElemExt("GroupByLimit", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), ctx.PragmaGroupByLimit)) { + query.Error() << "Expected unsigned integer literal as a single argument for: " << pragma; + return {}; + } + return TNodePtr{}; + }), + TableElemExt("GroupByCubeLimit", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), ctx.PragmaGroupByCubeLimit)) { + query.Error() << "Expected unsigned integer literal as a single argument for: " << pragma; + return {}; + } + return TNodePtr{}; + }), + TableElemExt("ResultRowsLimit", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), ctx.ResultRowsLimit)) { + query.Error() << "Expected unsigned integer literal as a single argument for: " << pragma; + return {}; + } + + return TNodePtr{}; + }), + TableElemExt("ResultSizeLimit", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), ctx.ResultSizeLimit)) { + query.Error() << "Expected unsigned integer literal as a single argument for: " << pragma; + return {}; + } + + return TNodePtr{}; + }), + TableElemExt("RuntimeLogLevel", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1 || !values[0].GetLiteral()) { + query.Error() << "Expected LogLevel as a single argument for: " << pragma; + return {}; + } + + auto value = to_title(*values[0].GetLiteral()); + if (!NUdf::TryLevelFromString(value)) { + query.Error() << "Expected LogLevel as a single argument for: " << pragma; + return {}; + } + + ctx.RuntimeLogLevel = value; + return TNodePtr{}; + }), + TableElemExt("Warning", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 2U || values.front().Empty() || values.back().Empty()) { + query.Error() << "Expected arguments <action>, <issueId> for: " << pragma; + return {}; + } + + TString action; + TString codePattern; + if (!values[0].GetLiteral(action, ctx) || !values[1].GetLiteral(codePattern, ctx)) { + return {}; + } + + TWarningRule rule; + TString parseError; + auto parseResult = TWarningRule::ParseFrom(codePattern, action, rule, parseError); + switch (parseResult) { + case TWarningRule::EParseResult::PARSE_OK: + break; + case TWarningRule::EParseResult::PARSE_PATTERN_FAIL: + case TWarningRule::EParseResult::PARSE_ACTION_FAIL: + ctx.Error() << parseError; + return {}; + default: + Y_ENSURE(false, "Unknown parse result"); + } + + ctx.WarningPolicy.AddRule(rule); + if (rule.GetPattern() == "*" && rule.GetAction() == EWarningAction::ERROR) { + // Keep 'unused symbol' warning as warning unless explicitly set to error + ctx.SetWarningPolicyFor(TIssuesIds::YQL_UNUSED_SYMBOL, EWarningAction::DEFAULT); + } + + return TNodePtr{}; + }), + TableElemExt("Greetings", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() > 1) { + query.Error() << "Multiple arguments are not expected for " << pragma; + return {}; + } + + if (values.empty()) { + values.emplace_back(TDeferredAtom(ctx.Pos(), "Hello, world! And best wishes from the YQL Team!")); + } + + TString arg; + if (!values.front().GetLiteral(arg, ctx)) { + return {}; + } + ctx.Info(ctx.Pos()) << arg; + return TNodePtr{}; + }), + TableElemExt("WarningMsg", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1 || !values[0].GetLiteral()) { + query.Error() << "Expected string literal as a single argument for: " << pragma; + return {}; + } + ctx.Warning(ctx.Pos(), TIssuesIds::YQL_PRAGMA_WARNING_MSG) << *values[0].GetLiteral(); + return TNodePtr{}; + }), + TableElemExt("ErrorMsg", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1 || !values[0].GetLiteral()) { + query.Error() << "Expected string literal as a single argument for: " << pragma; + return {}; + } + ctx.Error(ctx.Pos()) << *values[0].GetLiteral(); + return TNodePtr{}; + }), + TableElemExt("ClassicDivision", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), ctx.Scoped->PragmaClassicDivision)) { + query.Error() << "Expected boolean literal as a single argument for: " << pragma; + return {}; + } + return TNodePtr{}; + }), + TableElemExt("CheckedOps", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), ctx.Scoped->PragmaCheckedOps)) { + query.Error() << "Expected boolean literal as a single argument for: " << pragma; + return {}; + } + return TNodePtr{}; + }), + TableElemExt("DisableUnordered", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + ctx.Warning(ctx.Pos(), TIssuesIds::YQL_DEPRECATED_PRAGMA) + << "Use of deprecated DisableUnordered pragma. It will be dropped soon"; + return TNodePtr{}; + }), + TableElemExt("RotateJoinTree", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), ctx.RotateJoinTree)) { + query.Error() << "Expected boolean literal as a single argument for: " << pragma; + return {}; + } + return TNodePtr{}; + }), + TableElemExt("EnableSystemColumns", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), ctx.EnableSystemColumns)) { + query.Error() << "Expected boolean literal as a single argument for: " << pragma; + return {}; + } + return TNodePtr{}; + }), + TableElemExt("AnsiOrderByLimitInUnionAll", [](CB_SIG) -> TMaybe<TNodePtr> { + return TNodePtr{}; + }), + TableElemExt("DisableAnsiOrderByLimitInUnionAll", [](CB_SIG) -> TMaybe<TNodePtr> { + query.Error() << "DisableAnsiOrderByLimitInUnionAll pragma is deprecated and no longer supported"; + return {}; + }), + TableElemExt("RegexUseRe2", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1U || !values.front().GetLiteral() || !TryFromString(*values.front().GetLiteral(), ctx.PragmaRegexUseRe2)) { + query.Error() << "Expected 'true' or 'false' for: " << pragma; + return {}; + } + return TNodePtr{}; + }), + TableElemExt("PositionalUnionAll", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + ctx.PositionalUnionAll = true; + // PositionalUnionAll implies OrderedColumns + ctx.OrderedColumns = true; + return TNodePtr{}; + }), + TableElemExt("PqReadBy", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1 || !values[0].GetLiteral()) { + query.Error() << "Expected string literal as a single argument for: " << pragma; + return {}; + } + + // special guard to raise error on situation: + // use cluster1; + // pragma PqReadPqBy="cluster2"; + const TString* currentClusterLiteral = ctx.Scoped->CurrCluster.GetLiteral(); + if (currentClusterLiteral && *values[0].GetLiteral() != "dq" && *currentClusterLiteral != *values[0].GetLiteral()) { + query.Error() << "Cluster in PqReadPqBy pragma differs from cluster specified in USE statement: " << *values[0].GetLiteral() << " != " << *currentClusterLiteral; + return {}; + } + + ctx.PqReadByRtmrCluster = *values[0].GetLiteral(); + return TNodePtr{}; + }), + // BEGIN TODO: Convert Scoped fields to PAIRED_TABLE_ELEM macro. + TableElemExt("StrictJoinKeyTypes", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + ctx.Scoped->StrictJoinKeyTypes = true; + return TNodePtr{}; + }), + TableElemExt("DisableStrictJoinKeyTypes", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + ctx.Scoped->StrictJoinKeyTypes = false; + return TNodePtr{}; + }), + TableElemExt("UnicodeLiterals", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + ctx.Scoped->UnicodeLiterals = true; + return TNodePtr{}; + }), + TableElemExt("DisableUnicodeLiterals", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + ctx.Scoped->UnicodeLiterals = false; + return TNodePtr{}; + }), + TableElemExt("WarnUntypedStringLiterals", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + ctx.Scoped->WarnUntypedStringLiterals = true; + return TNodePtr{}; + }), + TableElemExt("DisableWarnUntypedStringLiterals", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + ctx.Scoped->WarnUntypedStringLiterals = false; + return TNodePtr{}; + }), + // END TODO + + TableElemExt("DataWatermarks", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() != 1 || !values[0].GetLiteral() || !(*values[0].GetLiteral() == "enable" || *values[0].GetLiteral() == "disable")) + { + query.Error() << "Expected `enable|disable' argument for: " << pragma; + return {}; + } + + if (*values[0].GetLiteral() == "enable") { + ctx.PragmaDataWatermarks = true; + } else if (*values[0].GetLiteral() == "disable") { + ctx.PragmaDataWatermarks = false; + } + + return TNodePtr{}; + }), + TableElemExt("DisableFlexibleTypes", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + ctx.Warning(ctx.Pos(), TIssuesIds::YQL_DEPRECATED_PRAGMA) + << "Deprecated pragma DisableFlexibleTypes - it will be removed soon. " + "Consider submitting bug report if FlexibleTypes doesn't work for you"; + ctx.FlexibleTypes = false; + return TNodePtr{}; + }), + TableElemExt("FeatureR010", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() == 1 && values[0].GetLiteral()) { + const auto& value = *values[0].GetLiteral(); + if ("prototype" == value) { + ctx.FeatureR010 = true; + } else { + return {}; + } + } else { + return {}; + } + return TNodePtr{}; + }), + TableElemExt("CostBasedOptimizer", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + if (values.size() == 1 && values[0].GetLiteral()) { + ctx.CostBasedOptimizer = to_lower(*values[0].GetLiteral()); + } + if (values.size() != 1 || !values[0].GetLiteral() || !(ctx.CostBasedOptimizer == "disable" || ctx.CostBasedOptimizer == "pg" || ctx.CostBasedOptimizer == "native")) + { + query.Error() << "Expected `disable|pg|native' argument for: " << pragma; + return {}; + } + return TNodePtr{}; + }), + TableElemExt("DisableCompactNamedExprs", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + ctx.Warning(ctx.Pos(), TIssuesIds::YQL_DEPRECATED_PRAGMA) + << "Deprecated pragma DisableCompactNamedExprs - it will be removed soon. " + "Consider submitting bug report if CompactNamedExprs doesn't work for you"; + ctx.CompactNamedExprs = false; + return TNodePtr{}; + }), + TableElemExt("Engine", [](CB_SIG) -> TMaybe<TNodePtr> { + auto& ctx = query.Context(); + + const TString* literal = values.size() == 1 + ? values[0].GetLiteral() + : nullptr; + + if (!literal || !(*literal == "default" || *literal == "dq" || *literal == "ytflow")) { + query.Error() << "Expected `default|dq|ytflow' argument for: " << pragma; + return {}; + } + + if (*literal == "ytflow") { + if (ctx.DqEngineForce) { + query.Error() << "Expected `disable|auto` argument for DqEngine pragma " + << " with " << pragma << " pragma argument `ytflow`"; + return {}; + } + + ctx.DqEngineEnable = false; + } else if (*literal == "dq") { + ctx.DqEngineEnable = true; + ctx.DqEngineForce = true; + } + + ctx.Engine = *literal; + return TNodePtr{}; + }), + + // TMaybe<bool> fields. + PAIRED_TABLE_ELEM("AnsiInForEmptyOrNullableItemsCollections", AnsiInForEmptyOrNullableItemsCollections), + PAIRED_TABLE_ELEM("AnsiRankForNullableKeys", AnsiRankForNullableKeys), + PAIRED_TABLE_ELEM("JsonQueryReturnsJsonDocument", JsonQueryReturnsJsonDocument), + PAIRED_TABLE_ELEM("EmitAggApply", EmitAggApply), + PAIRED_TABLE_ELEM("CompactGroupBy", CompactGroupBy), + + // bool fields. + TABLE_ELEM("RefSelect", PragmaRefSelect, true), + TABLE_ELEM("SampleSelect", PragmaSampleSelect, true), + TABLE_ELEM("AllowDotInAlias", PragmaAllowDotInAlias, true), + TABLE_ELEM("DirectRead", PragmaDirectRead, true), + TABLE_ELEM("AutoCommit", PragmaAutoCommit, true), + TABLE_ELEM("UseTablePrefixForEach", PragmaUseTablePrefixForEach, true), + PAIRED_TABLE_ELEM("SimpleColumns", SimpleColumns), + PAIRED_TABLE_ELEM("CoalesceJoinKeysOnQualifiedAll", CoalesceJoinKeysOnQualifiedAll), + PAIRED_TABLE_ELEM("PullUpFlatMapOverJoin", PragmaPullUpFlatMapOverJoin), + PAIRED_TABLE_ELEM("FilterPushdownOverJoinOptionalSide", FilterPushdownOverJoinOptionalSide), + TABLE_ELEM("AllowUnnamedColumns", WarnUnnamedColumns, false), + TABLE_ELEM("WarnUnnamedColumns", WarnUnnamedColumns, true), + TABLE_ELEM("DiscoveryMode", DiscoveryMode, true), + // TODO DqEngine/blockengine + PAIRED_TABLE_ELEM("AnsiOptionalAs", AnsiOptionalAs), + PAIRED_TABLE_ELEM("WarnOnAnsiAliasShadowing", WarnOnAnsiAliasShadowing), + PAIRED_TABLE_ELEM("OrderedColumns", OrderedColumns), + PAIRED_TABLE_ELEM("DeriveColumnOrder", DeriveColumnOrder), + TABLE_ELEM("BogousStarInGroupByOverJoin", BogousStarInGroupByOverJoin, true), + PAIRED_TABLE_ELEM("UnorderedSubqueries", UnorderedSubqueries), + TABLE_ELEM("FlexibleTypes", FlexibleTypes, true), + PAIRED_TABLE_ELEM("AnsiCurrentRow", AnsiCurrentRow), + PAIRED_TABLE_ELEM("UseBlocks", UseBlocks), + PAIRED_TABLE_ELEM("EmitTableSource", EmitTableSource), + PAIRED_TABLE_ELEM("AnsiLike", AnsiLike), + PAIRED_TABLE_ELEM("UnorderedResult", UnorderedResult), + TABLE_ELEM("CompactNamedExprs", CompactNamedExprs, true), + PAIRED_TABLE_ELEM("ValidateUnusedExprs", ValidateUnusedExprs), + PAIRED_TABLE_ELEM("AnsiImplicitCrossJoin", AnsiImplicitCrossJoin), + PAIRED_TABLE_ELEM("DistinctOverWindow", DistinctOverWindow), + PAIRED_TABLE_ELEM("SeqMode", SeqMode), + PAIRED_TABLE_ELEM("EmitUnionMerge", EmitUnionMerge), + PAIRED_TABLE_ELEM("DistinctOverKeys", DistinctOverKeys), + PAIRED_TABLE_ELEM("GroupByExprAfterWhere", GroupByExprAfterWhere), + PAIRED_TABLE_ELEM("FailOnGroupByExprOverride", FailOnGroupByExprOverride), + PAIRED_TABLE_ELEM("OptimizeSimpleILIKE", OptimizeSimpleIlike), +}; + +#undef PAIRED_TABLE_ELEM +#undef TABLE_ELEM +#undef TableElemExt + +#undef CB_SIG +} // namespace + /// @see EnumeratePragmas too -TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success) { - success = false; +TMaybe<TNodePtr> TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt) { const TString& prefix = OptIdPrefixAsStr(stmt.GetRule_opt_id_prefix_or_type2(), *this); const TString& lowerPrefix = to_lower(prefix); const TString pragma(Id(stmt.GetRule_an_id3(), *this)); @@ -2638,10 +3272,14 @@ TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success TVector<TDeferredAtom> values; TVector<const TRule_pragma_value*> pragmaValues; bool pragmaValueDefault = false; + + // Gather all pragma values (if any). if (stmt.GetBlock4().HasAlt1()) { + // pragma=value pragmaValues.push_back(&stmt.GetBlock4().GetAlt1().GetRule_pragma_value2()); } else if (stmt.GetBlock4().HasAlt2()) { + // pragma(value,value...) pragmaValues.push_back(&stmt.GetBlock4().GetAlt2().GetRule_pragma_value2()); for (auto& additionalValue : stmt.GetBlock4().GetAlt2().GetBlock3()) { pragmaValues.push_back(&additionalValue.GetRule_pragma_value2()); @@ -2663,6 +3301,7 @@ TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success const bool withFileAlias = normalizedPragma == "file" || normalizedPragma == "folder" || normalizedPragma == "library" || normalizedPragma == "udf"; for (auto pragmaValue : pragmaValues) { if (pragmaValue->HasAlt_pragma_value3()) { + // Quoted string. auto value = Token(pragmaValue->GetAlt_pragma_value3().GetToken1()); auto parsed = StringContentOrIdContent(Ctx_, Ctx_.Pos(), value); if (!parsed) { @@ -2680,9 +3319,11 @@ TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success && pragmaValue->GetAlt_pragma_value2().GetRule_id1().HasAlt_id2() && "default" == to_lower(Id(pragmaValue->GetAlt_pragma_value2().GetRule_id1(), *this))) { + // 'DEFAULT' keyword. pragmaValueDefault = true; } else if (withConfigure && pragmaValue->HasAlt_pragma_value5()) { + // Bind parameter. TString bindName; if (!NamedNodeImpl(pragmaValue->GetAlt_pragma_value5().GetRule_bind_parameter1(), bindName, *this)) { return {}; @@ -2714,450 +3355,16 @@ TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success return{}; } - if (normalizedPragma == "refselect") { - Ctx_.PragmaRefSelect = true; - Ctx_.IncrementMonCounter("sql_pragma", "RefSelect"); - } else if (normalizedPragma == "sampleselect") { - Ctx_.PragmaSampleSelect = true; - Ctx_.IncrementMonCounter("sql_pragma", "SampleSelect"); - } else if (normalizedPragma == "allowdotinalias") { - Ctx_.PragmaAllowDotInAlias = true; - Ctx_.IncrementMonCounter("sql_pragma", "AllowDotInAlias"); - } else if (normalizedPragma == "udf") { - if ((values.size() != 1 && values.size() != 2) || pragmaValueDefault) { - Error() << "Expected file alias as pragma value"; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - if (Ctx_.Settings.FileAliasPrefix) { - if (values.size() == 1) { - values.emplace_back(TDeferredAtom(Ctx_.Pos(), "")); - } - - TString prefix; - if (!values[1].GetLiteral(prefix, Ctx_)) { - Error() << "Expected literal UDF module prefix in views"; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - values[1] = TDeferredAtom(Ctx_.Pos(), Ctx_.Settings.FileAliasPrefix + prefix); - } - - Ctx_.IncrementMonCounter("sql_pragma", "udf"); - success = true; - return BuildPragma(Ctx_.Pos(), TString(ConfigProviderName), "ImportUdfs", values, false); - } else if (normalizedPragma == "packageversion") { - if (values.size() != 2 || pragmaValueDefault) { - Error() << "Expected package name and version"; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - ui32 version = 0; - TString versionString; - TString packageName; - if (!values[0].GetLiteral(packageName, Ctx_) || !values[1].GetLiteral(versionString, Ctx_)) { - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - if (!PackageVersionFromString(versionString, version)) { - Error() << "Unable to parse package version, possible values 0, 1, draft, release"; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - Ctx_.SetPackageVersion(packageName, version); - Ctx_.IncrementMonCounter("sql_pragma", "PackageVersion"); - success = true; - return BuildPragma(Ctx_.Pos(), TString(ConfigProviderName), "SetPackageVersion", TVector<TDeferredAtom>{ values[0], TDeferredAtom(values[1].Build()->GetPos(), ToString(version)) }, false); - } else if (normalizedPragma == "file") { - if (values.size() < 2U || values.size() > 3U || pragmaValueDefault) { - Error() << "Expected file alias, url and optional token name as pragma values"; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } + if (auto descr = PragmaDescrs.FindPtr(normalizedPragma)) { + TMaybe<TNodePtr> result = descr->Cb(values, pragmaValueDefault, pragma, *this); - Ctx_.IncrementMonCounter("sql_pragma", "file"); - success = true; - return BuildPragma(Ctx_.Pos(), TString(ConfigProviderName), "AddFileByUrl", values, false); - } else if (normalizedPragma == "fileoption") { - if (values.size() < 3U) { - Error() << "Expected file alias, option key and value"; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - Ctx_.IncrementMonCounter("sql_pragma", "FileOption"); - success = true; - return BuildPragma(Ctx_.Pos(), TString(ConfigProviderName), "SetFileOption", values, false); - } else if (normalizedPragma == "folder") { - if (values.size() < 2U || values.size() > 3U || pragmaValueDefault) { - Error() << "Expected folder alias, url and optional token name as pragma values"; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - Ctx_.IncrementMonCounter("sql_pragma", "folder"); - success = true; - return BuildPragma(Ctx_.Pos(), TString(ConfigProviderName), "AddFolderByUrl", values, false); - } else if (normalizedPragma == "library") { - if (values.size() < 1) { - Error() << "Expected non-empty file alias"; + if (!result) { Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return{}; - } - if (values.size() > 3) { - Error() << "Expected file alias and optional url and token name as pragma values"; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return{}; - } - - TString alias; - if (!values.front().GetLiteral(alias, Ctx_)) { - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return{}; - } - - TContext::TLibraryStuff library; - std::get<TPosition>(library) = values.front().Build()->GetPos(); - if (values.size() > 1) { - auto& first = std::get<1U>(library); - first.emplace(); - first->second = values[1].Build()->GetPos(); - if (!values[1].GetLiteral(first->first, Ctx_)) { - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return{}; - } - - TSet<TString> names; - SubstParameters(first->first, Nothing(), &names); - for (const auto& name : names) { - auto namedNode = GetNamedNode(name); - if (!namedNode) { - return{}; - } - } - if (values.size() > 2) { - auto& second = std::get<2U>(library); - second.emplace(); - second->second = values[2].Build()->GetPos(); - if (!values[2].GetLiteral(second->first, Ctx_)) { - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return{}; - } - } - } - - Ctx_.Libraries[alias] = std::move(library); - Ctx_.IncrementMonCounter("sql_pragma", "library"); - } else if (normalizedPragma == "package") { - if (values.size() < 2U || values.size() > 3U) { - Error() << "Expected package name, url and optional token name as pragma values"; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - TString packageName; - if (!values.front().GetLiteral(packageName, Ctx_)) { - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - TContext::TPackageStuff package; - std::get<TPosition>(package) = values.front().Build()->GetPos(); - - auto fillLiteral = [&](auto& literal, size_t index) { - if (values.size() <= index) { - return true; - } - - constexpr bool optional = std::is_base_of_v< - std::optional<TContext::TLiteralWithPosition>, - std::decay_t<decltype(literal)> - >; - - TContext::TLiteralWithPosition* literalPtr; - - if constexpr (optional) { - literal.emplace(); - literalPtr = &*literal; - } else { - literalPtr = &literal; - } - - literalPtr->second = values[index].Build()->GetPos(); - - if (!values[index].GetLiteral(literalPtr->first, Ctx_)) { - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return false; - } - - return true; - }; - - // fill url - auto& urlLiteral = std::get<1U>(package); - if (!fillLiteral(urlLiteral, 1U)) { - return {}; - } - - TSet<TString> names; - SubstParameters(urlLiteral.first, Nothing(), &names); - for (const auto& name : names) { - auto namedNode = GetNamedNode(name); - if (!namedNode) { - return {}; - } - } - - // fill token - if (!fillLiteral(std::get<2U>(package), 2U)) { - return {}; - } - - Ctx_.Packages[packageName] = std::move(package); - Ctx_.IncrementMonCounter("sql_pragma", "package"); - } else if (normalizedPragma == "overridelibrary") { - if (values.size() != 1U) { - Error() << "Expected override library alias as pragma value"; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - TString alias; - if (!values.front().GetLiteral(alias, Ctx_)) { - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - TContext::TOverrideLibraryStuff overrideLibrary; - std::get<TPosition>(overrideLibrary) = values.front().Build()->GetPos(); - - Ctx_.OverrideLibraries[alias] = std::move(overrideLibrary); - Ctx_.IncrementMonCounter("sql_pragma", "overridelibrary"); - } else if (normalizedPragma == "directread") { - Ctx_.PragmaDirectRead = true; - Ctx_.IncrementMonCounter("sql_pragma", "DirectRead"); - } else if (normalizedPragma == "equijoin") { - Ctx_.IncrementMonCounter("sql_pragma", "EquiJoin"); - } else if (normalizedPragma == "autocommit") { - Ctx_.PragmaAutoCommit = true; - Ctx_.IncrementMonCounter("sql_pragma", "AutoCommit"); - } else if (normalizedPragma == "usetableprefixforeach") { - Ctx_.PragmaUseTablePrefixForEach = true; - Ctx_.IncrementMonCounter("sql_pragma", "UseTablePrefixForEach"); - } else if (normalizedPragma == "tablepathprefix") { - TString value; - TMaybe<TString> arg; - - if (values.size() == 1 || values.size() == 2) { - if (!values.front().GetLiteral(value, Ctx_)) { - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - if (values.size() == 2) { - arg = value; - if (!values.back().GetLiteral(value, Ctx_)) { - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - } - - if (!Ctx_.SetPathPrefix(value, arg)) { - return {}; - } } else { - Error() << "Expected path prefix or tuple of (Provider, PathPrefix) or" - << " (Cluster, PathPrefix) as pragma value"; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - Ctx_.IncrementMonCounter("sql_pragma", "PathPrefix"); - } else if (normalizedPragma == "groupbylimit") { - if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), Ctx_.PragmaGroupByLimit)) { - Error() << "Expected unsigned integer literal as a single argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - Ctx_.IncrementMonCounter("sql_pragma", "GroupByLimit"); - } else if (normalizedPragma == "groupbycubelimit") { - if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), Ctx_.PragmaGroupByCubeLimit)) { - Error() << "Expected unsigned integer literal as a single argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - Ctx_.IncrementMonCounter("sql_pragma", "GroupByCubeLimit"); - } else if (normalizedPragma == "simplecolumns") { - Ctx_.SimpleColumns = true; - Ctx_.IncrementMonCounter("sql_pragma", "SimpleColumns"); - } else if (normalizedPragma == "disablesimplecolumns") { - Ctx_.SimpleColumns = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableSimpleColumns"); - } else if (normalizedPragma == "coalescejoinkeysonqualifiedall") { - Ctx_.CoalesceJoinKeysOnQualifiedAll = true; - Ctx_.IncrementMonCounter("sql_pragma", "CoalesceJoinKeysOnQualifiedAll"); - } else if (normalizedPragma == "disablecoalescejoinkeysonqualifiedall") { - Ctx_.CoalesceJoinKeysOnQualifiedAll = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableCoalesceJoinKeysOnQualifiedAll"); - } else if (normalizedPragma == "resultrowslimit") { - if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), Ctx_.ResultRowsLimit)) { - Error() << "Expected unsigned integer literal as a single argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; + Ctx_.IncrementMonCounter("sql_pragma", descr->CanonicalName); } - Ctx_.IncrementMonCounter("sql_pragma", "ResultRowsLimit"); - } else if (normalizedPragma == "resultsizelimit") { - if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), Ctx_.ResultSizeLimit)) { - Error() << "Expected unsigned integer literal as a single argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - Ctx_.IncrementMonCounter("sql_pragma", "ResultSizeLimit"); - } else if (normalizedPragma == "runtimeloglevel") { - if (values.size() != 1 || !values[0].GetLiteral()) { - Error() << "Expected LogLevel as a single argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - auto value = to_title(*values[0].GetLiteral()); - if (!NUdf::TryLevelFromString(value)) { - Error() << "Expected LogLevel as a single argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - Ctx_.RuntimeLogLevel = value; - Ctx_.IncrementMonCounter("sql_pragma", "RuntimeLogLevel"); - } else if (normalizedPragma == "warning") { - if (values.size() != 2U || values.front().Empty() || values.back().Empty()) { - Error() << "Expected arguments <action>, <issueId> for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - TString action; - TString codePattern; - if (!values[0].GetLiteral(action, Ctx_) || !values[1].GetLiteral(codePattern, Ctx_)) { - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - TWarningRule rule; - TString parseError; - auto parseResult = TWarningRule::ParseFrom(codePattern, action, rule, parseError); - switch (parseResult) { - case TWarningRule::EParseResult::PARSE_OK: - break; - case TWarningRule::EParseResult::PARSE_PATTERN_FAIL: - case TWarningRule::EParseResult::PARSE_ACTION_FAIL: - Ctx_.Error() << parseError; - return {}; - default: - Y_ENSURE(false, "Unknown parse result"); - } - - Ctx_.WarningPolicy.AddRule(rule); - if (rule.GetPattern() == "*" && rule.GetAction() == EWarningAction::ERROR) { - // Keep 'unused symbol' warning as warning unless explicitly set to error - Ctx_.SetWarningPolicyFor(TIssuesIds::YQL_UNUSED_SYMBOL, EWarningAction::DEFAULT); - } - - Ctx_.IncrementMonCounter("sql_pragma", "warning"); - } else if (normalizedPragma == "greetings") { - if (values.size() > 1) { - Error() << "Multiple arguments are not expected for " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - if (values.empty()) { - values.emplace_back(TDeferredAtom(Ctx_.Pos(), "Hello, world! And best wishes from the YQL Team!")); - } - - TString arg; - if (!values.front().GetLiteral(arg, Ctx_)) { - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - Ctx_.Info(Ctx_.Pos()) << arg; - } else if (normalizedPragma == "warningmsg") { - if (values.size() != 1 || !values[0].GetLiteral()) { - Error() << "Expected string literal as a single argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - Ctx_.Warning(Ctx_.Pos(), TIssuesIds::YQL_PRAGMA_WARNING_MSG) << *values[0].GetLiteral(); - } else if (normalizedPragma == "errormsg") { - if (values.size() != 1 || !values[0].GetLiteral()) { - Error() << "Expected string literal as a single argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - Ctx_.Error(Ctx_.Pos()) << *values[0].GetLiteral(); - } else if (normalizedPragma == "classicdivision") { - if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), Ctx_.Scoped->PragmaClassicDivision)) { - Error() << "Expected boolean literal as a single argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - Ctx_.IncrementMonCounter("sql_pragma", "ClassicDivision"); - } else if (normalizedPragma == "checkedops") { - if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), Ctx_.Scoped->PragmaCheckedOps)) { - Error() << "Expected boolean literal as a single argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - Ctx_.IncrementMonCounter("sql_pragma", "CheckedOps"); - } else if (normalizedPragma == "disableunordered") { - Ctx_.Warning(Ctx_.Pos(), TIssuesIds::YQL_DEPRECATED_PRAGMA) - << "Use of deprecated DisableUnordered pragma. It will be dropped soon"; - } else if (normalizedPragma == "pullupflatmapoverjoin") { - Ctx_.PragmaPullUpFlatMapOverJoin = true; - Ctx_.IncrementMonCounter("sql_pragma", "PullUpFlatMapOverJoin"); - } else if (normalizedPragma == "disablepullupflatmapoverjoin") { - Ctx_.PragmaPullUpFlatMapOverJoin = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisablePullUpFlatMapOverJoin"); - } else if (normalizedPragma == "filterpushdownoverjoinoptionalside") { - Ctx_.FilterPushdownOverJoinOptionalSide = true; - Ctx_.IncrementMonCounter("sql_pragma", "FilterPushdownOverJoinOptionalSide"); - } else if (normalizedPragma == "disablefilterpushdownoverjoinoptionalside") { - Ctx_.FilterPushdownOverJoinOptionalSide = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableFilterPushdownOverJoinOptionalSide"); - } else if (normalizedPragma == "rotatejointree") { - if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), Ctx_.RotateJoinTree)) { - Error() << "Expected boolean literal as a single argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - } else if (normalizedPragma == "allowunnamedcolumns") { - Ctx_.WarnUnnamedColumns = false; - Ctx_.IncrementMonCounter("sql_pragma", "AllowUnnamedColumns"); - } else if (normalizedPragma == "warnunnamedcolumns") { - Ctx_.WarnUnnamedColumns = true; - Ctx_.IncrementMonCounter("sql_pragma", "WarnUnnamedColumns"); - } else if (normalizedPragma == "discoverymode") { - Ctx_.DiscoveryMode = true; - Ctx_.IncrementMonCounter("sql_pragma", "DiscoveryMode"); - } else if (normalizedPragma == "enablesystemcolumns") { - if (values.size() != 1 || !values[0].GetLiteral() || !TryFromString(*values[0].GetLiteral(), Ctx_.EnableSystemColumns)) { - Error() << "Expected boolean literal as a single argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - Ctx_.IncrementMonCounter("sql_pragma", "EnableSystemColumns"); - } else if (normalizedPragma == "ansiinforemptyornullableitemscollections") { - Ctx_.AnsiInForEmptyOrNullableItemsCollections = true; - Ctx_.IncrementMonCounter("sql_pragma", "AnsiInForEmptyOrNullableItemsCollections"); - } else if (normalizedPragma == "disableansiinforemptyornullableitemscollections") { - Ctx_.AnsiInForEmptyOrNullableItemsCollections = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableAnsiInForEmptyOrNullableItemsCollections"); + return result; } else if (normalizedPragma == "dqengine" || normalizedPragma == "blockengine") { Ctx_.IncrementMonCounter("sql_pragma", "DqEngine"); if (values.size() != 1 || !values[0].GetLiteral() @@ -3196,292 +3403,6 @@ TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success force = true; } } - } else if (normalizedPragma == "ansirankfornullablekeys") { - Ctx_.AnsiRankForNullableKeys = true; - Ctx_.IncrementMonCounter("sql_pragma", "AnsiRankForNullableKeys"); - } else if (normalizedPragma == "disableansirankfornullablekeys") { - Ctx_.AnsiRankForNullableKeys = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableAnsiRankForNullableKeys"); - } else if (normalizedPragma == "ansiorderbylimitinunionall") { - Ctx_.IncrementMonCounter("sql_pragma", "AnsiOrderByLimitInUnionAll"); - } else if (normalizedPragma == "disableansiorderbylimitinunionall") { - Error() << "DisableAnsiOrderByLimitInUnionAll pragma is deprecated and no longer supported"; - Ctx_.IncrementMonCounter("sql_errors", "DeprecatedPragma"); - return {}; - } else if (normalizedPragma == "ansioptionalas") { - Ctx_.AnsiOptionalAs = true; - Ctx_.IncrementMonCounter("sql_pragma", "AnsiOptionalAs"); - } else if (normalizedPragma == "disableansioptionalas") { - Ctx_.AnsiOptionalAs = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableAnsiOptionalAs"); - } else if (normalizedPragma == "warnonansialiasshadowing") { - Ctx_.WarnOnAnsiAliasShadowing = true; - Ctx_.IncrementMonCounter("sql_pragma", "WarnOnAnsiAliasShadowing"); - } else if (normalizedPragma == "disablewarnonansialiasshadowing") { - Ctx_.WarnOnAnsiAliasShadowing = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableWarnOnAnsiAliasShadowing"); - } else if (normalizedPragma == "regexusere2") { - if (values.size() != 1U || !values.front().GetLiteral() || !TryFromString(*values.front().GetLiteral(), Ctx_.PragmaRegexUseRe2)) { - Error() << "Expected 'true' or 'false' for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - Ctx_.IncrementMonCounter("sql_pragma", "RegexUseRe2"); - } else if (normalizedPragma == "jsonqueryreturnsjsondocument") { - Ctx_.JsonQueryReturnsJsonDocument = true; - Ctx_.IncrementMonCounter("sql_pragma", "JsonQueryReturnsJsonDocument"); - } else if (normalizedPragma == "disablejsonqueryreturnsjsondocument") { - Ctx_.JsonQueryReturnsJsonDocument = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableJsonQueryReturnsJsonDocument"); - } else if (normalizedPragma == "orderedcolumns") { - Ctx_.OrderedColumns = true; - Ctx_.IncrementMonCounter("sql_pragma", "OrderedColumns"); - } else if (normalizedPragma == "derivecolumnorder") { - Ctx_.DeriveColumnOrder = true; - Ctx_.IncrementMonCounter("sql_pragma", "DeriveColumnOrder"); - } else if (normalizedPragma == "disablederivecolumnorder") { - Ctx_.DeriveColumnOrder = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableDeriveColumnOrder"); - } else if (normalizedPragma == "disableorderedcolumns") { - Ctx_.OrderedColumns = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableOrderedColumns"); - } else if (normalizedPragma == "positionalunionall") { - Ctx_.PositionalUnionAll = true; - // PositionalUnionAll implies OrderedColumns - Ctx_.OrderedColumns = true; - Ctx_.IncrementMonCounter("sql_pragma", "PositionalUnionAll"); - } else if (normalizedPragma == "pqreadby") { - if (values.size() != 1 || !values[0].GetLiteral()) { - Error() << "Expected string literal as a single argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - // special guard to raise error on situation: - // use cluster1; - // pragma PqReadPqBy="cluster2"; - const TString* currentClusterLiteral = Ctx_.Scoped->CurrCluster.GetLiteral(); - if (currentClusterLiteral && *values[0].GetLiteral() != "dq" && *currentClusterLiteral != *values[0].GetLiteral()) { - Error() << "Cluster in PqReadPqBy pragma differs from cluster specified in USE statement: " << *values[0].GetLiteral() << " != " << *currentClusterLiteral; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - Ctx_.PqReadByRtmrCluster = *values[0].GetLiteral(); - Ctx_.IncrementMonCounter("sql_pragma", "PqReadBy"); - } else if (normalizedPragma == "bogousstaringroupbyoverjoin") { - Ctx_.BogousStarInGroupByOverJoin = true; - Ctx_.IncrementMonCounter("sql_pragma", "BogousStarInGroupByOverJoin"); - } else if (normalizedPragma == "strictjoinkeytypes") { - Ctx_.Scoped->StrictJoinKeyTypes = true; - Ctx_.IncrementMonCounter("sql_pragma", "StrictJoinKeyTypes"); - } else if (normalizedPragma == "disablestrictjoinkeytypes") { - Ctx_.Scoped->StrictJoinKeyTypes = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableStrictJoinKeyTypes"); - } else if (normalizedPragma == "unicodeliterals") { - Ctx_.Scoped->UnicodeLiterals = true; - Ctx_.IncrementMonCounter("sql_pragma", "UnicodeLiterals"); - } else if (normalizedPragma == "disableunicodeliterals") { - Ctx_.Scoped->UnicodeLiterals = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableUnicodeLiterals"); - } else if (normalizedPragma == "warnuntypedstringliterals") { - Ctx_.Scoped->WarnUntypedStringLiterals = true; - Ctx_.IncrementMonCounter("sql_pragma", "WarnUntypedStringLiterals"); - } else if (normalizedPragma == "disablewarnuntypedstringliterals") { - Ctx_.Scoped->WarnUntypedStringLiterals = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableWarnUntypedStringLiterals"); - } else if (normalizedPragma == "unorderedsubqueries") { - Ctx_.UnorderedSubqueries = true; - Ctx_.IncrementMonCounter("sql_pragma", "UnorderedSubqueries"); - } else if (normalizedPragma == "disableunorderedsubqueries") { - Ctx_.UnorderedSubqueries = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableUnorderedSubqueries"); - } else if (normalizedPragma == "datawatermarks") { - if (values.size() != 1 || !values[0].GetLiteral() - || ! (*values[0].GetLiteral() == "enable" || *values[0].GetLiteral() == "disable")) - { - Error() << "Expected `enable|disable' argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - if (*values[0].GetLiteral() == "enable") { - Ctx_.PragmaDataWatermarks = true; - } else if (*values[0].GetLiteral() == "disable") { - Ctx_.PragmaDataWatermarks = false; - } - - Ctx_.IncrementMonCounter("sql_pragma", "DataWatermarks"); - } else if (normalizedPragma == "flexibletypes") { - Ctx_.FlexibleTypes = true; - Ctx_.IncrementMonCounter("sql_pragma", "FlexibleTypes"); - } else if (normalizedPragma == "disableflexibletypes") { - Ctx_.Warning(Ctx_.Pos(), TIssuesIds::YQL_DEPRECATED_PRAGMA) - << "Deprecated pragma DisableFlexibleTypes - it will be removed soon. " - "Consider submitting bug report if FlexibleTypes doesn't work for you"; - Ctx_.FlexibleTypes = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableFlexibleTypes"); - } else if (normalizedPragma == "ansicurrentrow") { - Ctx_.AnsiCurrentRow = true; - Ctx_.IncrementMonCounter("sql_pragma", "AnsiCurrentRow"); - } else if (normalizedPragma == "disableansicurrentrow") { - Ctx_.AnsiCurrentRow = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableAnsiCurrentRow"); - } else if (normalizedPragma == "emitaggapply") { - Ctx_.EmitAggApply = true; - Ctx_.IncrementMonCounter("sql_pragma", "EmitAggApply"); - } else if (normalizedPragma == "disableemitaggapply") { - Ctx_.EmitAggApply = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableEmitAggApply"); - } else if (normalizedPragma == "useblocks") { - Ctx_.UseBlocks = true; - Ctx_.IncrementMonCounter("sql_pragma", "UseBlocks"); - } else if (normalizedPragma == "disableuseblocks") { - Ctx_.UseBlocks = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableUseBlocks"); - } else if (normalizedPragma == "emittablesource") { - Ctx_.EmitTableSource = true; - Ctx_.IncrementMonCounter("sql_pragma", "EmitTableSource"); - } else if (normalizedPragma == "disableemittablesource") { - Ctx_.EmitTableSource = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableEmitTableSource"); - } else if (normalizedPragma == "ansilike") { - Ctx_.AnsiLike = true; - Ctx_.IncrementMonCounter("sql_pragma", "AnsiLike"); - } else if (normalizedPragma == "disableansilike") { - Ctx_.AnsiLike = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableAnsiLike"); - } else if (normalizedPragma == "unorderedresult") { - Ctx_.UnorderedResult = true; - Ctx_.IncrementMonCounter("sql_pragma", "UnorderedResult"); - } else if (normalizedPragma == "disableunorderedresult") { - Ctx_.UnorderedResult = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableUnorderedResult"); - } else if (normalizedPragma == "featurer010") { - if (values.size() == 1 && values[0].GetLiteral()) { - const auto& value = *values[0].GetLiteral(); - if ("prototype" == value) - Ctx_.FeatureR010 = true; - else { - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - } - else { - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - Ctx_.IncrementMonCounter("sql_pragma", "FeatureR010"); - } else if (normalizedPragma == "compactgroupby") { - Ctx_.CompactGroupBy = true; - Ctx_.IncrementMonCounter("sql_pragma", "CompactGroupBy"); - } else if (normalizedPragma == "disablecompactgroupby") { - Ctx_.CompactGroupBy = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableCompactGroupBy"); - } else if (normalizedPragma == "costbasedoptimizer") { - Ctx_.IncrementMonCounter("sql_pragma", "CostBasedOptimizer"); - if (values.size() == 1 && values[0].GetLiteral()) { - Ctx_.CostBasedOptimizer = to_lower(*values[0].GetLiteral()); - } - if (values.size() != 1 || !values[0].GetLiteral() - || ! (Ctx_.CostBasedOptimizer == "disable" || Ctx_.CostBasedOptimizer == "pg" || Ctx_.CostBasedOptimizer == "native")) - { - Error() << "Expected `disable|pg|native' argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - } else if (normalizedPragma == "compactnamedexprs") { - Ctx_.CompactNamedExprs = true; - Ctx_.IncrementMonCounter("sql_pragma", "CompactNamedExprs"); - } else if (normalizedPragma == "disablecompactnamedexprs") { - Ctx_.Warning(Ctx_.Pos(), TIssuesIds::YQL_DEPRECATED_PRAGMA) - << "Deprecated pragma DisableCompactNamedExprs - it will be removed soon. " - "Consider submitting bug report if CompactNamedExprs doesn't work for you"; - Ctx_.CompactNamedExprs = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableCompactNamedExprs"); - } else if (normalizedPragma == "validateunusedexprs") { - Ctx_.ValidateUnusedExprs = true; - Ctx_.IncrementMonCounter("sql_pragma", "ValidateUnusedExprs"); - } else if (normalizedPragma == "disablevalidateunusedexprs") { - Ctx_.ValidateUnusedExprs = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableValidateUnusedExprs"); - } else if (normalizedPragma == "ansiimplicitcrossjoin") { - Ctx_.AnsiImplicitCrossJoin = true; - Ctx_.IncrementMonCounter("sql_pragma", "AnsiImplicitCrossJoin"); - } else if (normalizedPragma == "disableansiimplicitcrossjoin") { - Ctx_.AnsiImplicitCrossJoin = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableAnsiImplicitCrossJoin"); - } else if (normalizedPragma == "distinctoverwindow") { - Ctx_.DistinctOverWindow = true; - Ctx_.IncrementMonCounter("sql_pragma", "DistinctOverWindow"); - } else if (normalizedPragma == "disabledistinctoverwindow") { - Ctx_.DistinctOverWindow = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableDistinctOverWindow"); - } else if (normalizedPragma == "seqmode") { - Ctx_.SeqMode = true; - Ctx_.IncrementMonCounter("sql_pragma", "SeqMode"); - } else if (normalizedPragma == "disableseqmode") { - Ctx_.SeqMode = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableSeqMode"); - } else if (normalizedPragma == "emitunionmerge") { - Ctx_.EmitUnionMerge = true; - Ctx_.IncrementMonCounter("sql_pragma", "EmitUnionMerge"); - } else if (normalizedPragma == "disableemitunionmerge") { - Ctx_.EmitUnionMerge = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableEmitUnionMerge"); - } else if (normalizedPragma == "distinctoverkeys") { - Ctx_.DistinctOverKeys = true; - Ctx_.IncrementMonCounter("sql_pragma", "DistinctOverKeys"); - } else if (normalizedPragma == "disabledistinctoverkeys") { - Ctx_.DistinctOverKeys = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableDistinctOverKeys"); - } else if (normalizedPragma == "groupbyexprafterwhere") { - Ctx_.GroupByExprAfterWhere = true; - Ctx_.IncrementMonCounter("sql_pragma", "GroupByExprAfterWhere"); - } else if (normalizedPragma == "disablegroupbyexprafterwhere") { - Ctx_.GroupByExprAfterWhere = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableGroupByExprAfterWhere"); - } else if (normalizedPragma == "failongroupbyexproverride") { - Ctx_.FailOnGroupByExprOverride = true; - Ctx_.IncrementMonCounter("sql_pragma", "FailOnGroupByExprOverride"); - } else if (normalizedPragma == "disablefailongroupbyexproverride") { - Ctx_.FailOnGroupByExprOverride = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableFailOnGroupByExprOverride"); - } else if (normalizedPragma == "engine") { - Ctx_.IncrementMonCounter("sql_pragma", "Engine"); - - const TString* literal = values.size() == 1 - ? values[0].GetLiteral() - : nullptr; - - if (!literal || ! (*literal == "default" || *literal == "dq" || *literal == "ytflow")) { - Error() << "Expected `default|dq|ytflow' argument for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - if (*literal == "ytflow") { - if (Ctx_.DqEngineForce) { - Error() << "Expected `disable|auto` argument for DqEngine pragma " - << " with " << pragma << " pragma argument `ytflow`"; - - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); - return {}; - } - - Ctx_.DqEngineEnable = false; - } else if (*literal == "dq") { - Ctx_.DqEngineEnable = true; - Ctx_.DqEngineForce = true; - } - - Ctx_.Engine = *literal; - } else if (normalizedPragma == "optimizesimpleilike") { - Ctx_.OptimizeSimpleIlike = true; - Ctx_.IncrementMonCounter("sql_pragma", "OptimizeSimpleILIKE"); - } else if (normalizedPragma == "disableoptimizesimpleilike") { - Ctx_.OptimizeSimpleIlike = false; - Ctx_.IncrementMonCounter("sql_pragma", "DisableOptimizeSimpleILIKE"); } else { Error() << "Unknown pragma: " << pragma; Ctx_.IncrementMonCounter("sql_errors", "UnknownPragma"); @@ -3497,53 +3418,47 @@ TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success if (normalizedPragma == "fast") { Ctx_.Warning(Ctx_.Pos(), TIssuesIds::YQL_DEPRECATED_PRAGMA) << "Use of deprecated yson.Fast pragma. It will be dropped soon"; - success = true; - return {}; + return TNodePtr{}; } else if (normalizedPragma == "autoconvert") { Ctx_.PragmaYsonAutoConvert = true; - success = true; - return {}; + return TNodePtr{}; } else if (normalizedPragma == "strict") { if (values.size() == 0U) { Ctx_.PragmaYsonStrict = true; - success = true; + return TNodePtr{}; } else if (values.size() == 1U && values.front().GetLiteral() && TryFromString(*values.front().GetLiteral(), Ctx_.PragmaYsonStrict)) { - success = true; - } else { - Error() << "Expected 'true', 'false' or no parameter for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); + return TNodePtr{}; } + Error() << "Expected 'true', 'false' or no parameter for: " << pragma; + Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); return {}; } else if (normalizedPragma == "disablestrict") { if (values.size() == 0U) { Ctx_.PragmaYsonStrict = false; - success = true; - return {}; + return TNodePtr{}; } bool pragmaYsonDisableStrict; if (values.size() == 1U && values.front().GetLiteral() && TryFromString(*values.front().GetLiteral(), pragmaYsonDisableStrict)) { Ctx_.PragmaYsonStrict = !pragmaYsonDisableStrict; - success = true; - } else { - Error() << "Expected 'true', 'false' or no parameter for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); + return TNodePtr{}; } + + Error() << "Expected 'true', 'false' or no parameter for: " << pragma; + Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); return {}; } else if (normalizedPragma == "casttostring" || normalizedPragma == "disablecasttostring") { const bool allow = normalizedPragma == "casttostring"; if (values.size() == 0U) { Ctx_.YsonCastToString = allow; - success = true; - return {}; + return TNodePtr{}; } bool pragmaYsonCastToString; if (values.size() == 1U && values.front().GetLiteral() && TryFromString(*values.front().GetLiteral(), pragmaYsonCastToString)) { Ctx_.PragmaYsonStrict = allow ? pragmaYsonCastToString : !pragmaYsonCastToString; - success = true; - } else { - Error() << "Expected 'true', 'false' or no parameter for: " << pragma; - Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); + return TNodePtr{}; } + Error() << "Expected 'true', 'false' or no parameter for: " << pragma; + Ctx_.IncrementMonCounter("sql_errors", "BadPragmaValue"); return {}; } else { Error() << "Unknown pragma: '" << pragma << "'"; @@ -3574,12 +3489,10 @@ TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success } } - success = true; Ctx_.IncrementMonCounter("sql_pragma", pragma); return BuildPragma(Ctx_.Pos(), lowerPrefix, normalizedPragma, values, pragmaValueDefault); } - success = true; - return {}; + return TNodePtr{}; } TNodePtr TSqlQuery::Build(const TRule_delete_stmt& stmt) { @@ -4013,54 +3926,23 @@ bool TSqlQuery::ParseTableStoreFeatures(std::map<TString, TDeferredAtom> & resul } void EnumeratePragmas(std::function<void(std::string_view)> callback) { - callback("ClassicDivision"); - callback("StrictJoinKeyTypes"); - callback("DisableStrictJoinKeyTypes"); - callback("CheckedOps"); - callback("UnicodeLiterals"); - callback("DisableUnicodeLiterals"); - callback("WarnUntypedStringLiterals"); - callback("DisableWarnUntypedStringLiterals"); - callback("File"); - callback("FileOption"); - callback("Folder"); - callback("Udf"); - callback("Library"); - callback("Package"); - callback("PackageVersion"); - callback("RefSelect"); - callback("SampleSelect"); - callback("AllowDotInAlias"); - callback("OverrideLibrary"); - callback("DirectRead"); - callback("AutoCommit"); - callback("UseTablePrefixForEach"); - callback("PathPrefix"); - callback("GroupByLimit"); - callback("GroupByCubeLimit"); - callback("SimpleColumns"); - callback("DisableSimpleColumns"); - callback("ResultRowsLimit"); - callback("ResultSizeLimit"); - callback("RuntimeLogLevel"); - callback("Warning"); - callback("Greetings"); - callback("WarningMsg"); - callback("ErrorMsg"); - callback("AllowUnnamedColumns"); - callback("WarnUnnamedColumns"); - callback("DiscoveryMode"); - callback("EnableSystemColumns"); + THashSet<TStringBuf> deprecatedPragmas = { + "EquiJoin", + "DisableUnordered", + "AnsiOrderByLimitInUnionAll", + "DisableAnsiOrderByLimitInUnionAll", + }; + + for (const auto& [_, descr] : PragmaDescrs) { + if (deprecatedPragmas.contains(descr.CanonicalName)) { + continue; + } + callback(descr.CanonicalName); + } + callback("DqEngine"); callback("BlockEngine"); - callback("JsonQueryReturnsJsonDocument"); - callback("DisableJsonQueryReturnsJsonDocument"); - callback("PositionalUnionAll"); - callback("PqReadBy"); - callback("DataWatermarks"); - callback("FeatureR010"); - callback("CostBasedOptimizer"); - callback("Engine"); + callback("yson.AutoConvert"); callback("yson.Strict"); callback("yson.DisableStrict"); |