diff options
author | mrlolthe1st <[email protected]> | 2023-06-13 12:04:19 +0300 |
---|---|---|
committer | mrlolthe1st <[email protected]> | 2023-06-13 12:04:19 +0300 |
commit | 2432d57a6100fc5cde46761547140706b62a2816 (patch) | |
tree | c9a8ea8646a66940d9bee06fbfc97bbfb529c187 | |
parent | ec56ac8ea80090dba89dc6fda194b0d68ce11bab (diff) |
YQL-15288: Fix for no more warning many times
YQL-15288: Fix for no more warning many times
-rw-r--r-- | ydb/library/yql/core/type_ann/type_ann_core.cpp | 36 | ||||
-rw-r--r-- | ydb/library/yql/core/type_ann/type_ann_expr.cpp | 2 | ||||
-rw-r--r-- | ydb/library/yql/core/yql_callable_transform.h | 3 | ||||
-rw-r--r-- | ydb/library/yql/core/yql_expr_type_annotation.cpp | 4 | ||||
-rw-r--r-- | ydb/library/yql/core/yql_expr_type_annotation.h | 2 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/node.cpp | 4 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/sql.cpp | 10 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/sql_ut.cpp | 6 |
8 files changed, 48 insertions, 19 deletions
diff --git a/ydb/library/yql/core/type_ann/type_ann_core.cpp b/ydb/library/yql/core/type_ann/type_ann_core.cpp index 88262e00628..e28a0e4583e 100644 --- a/ydb/library/yql/core/type_ann/type_ann_core.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_core.cpp @@ -2226,19 +2226,29 @@ namespace NTypeAnnImpl { // Using to detect warnings when operating (+, /, %, -, *) with integral types namespace { - IGraphTransformer::TStatus CheckIntegralsWidth(const TExprNode::TPtr& input, TContext& ctx, EDataSlot first, EDataSlot second) { - if (!IsDataTypeIntegral(first) || !IsDataTypeIntegral(second)) { + IGraphTransformer::TStatus CheckIntegralsWidth(const TExprNode::TPtr& input, TContext& ctx, EDataSlot first, EDataSlot second, TExprNode::TPtr& output) { + if (!input->Content().EndsWith("MayWarn")) { return IGraphTransformer::TStatus::Ok; } + + output = ctx.Expr.RenameNode(*input, TString(input->Content()).substr(0, input->Content().size() - 7)); + + if (!IsDataTypeIntegral(first) || !IsDataTypeIntegral(second)) { + return IGraphTransformer::TStatus::Repeat; + } + ui32 first_width = GetDataTypeInfo(first).FixedSize, second_width = GetDataTypeInfo(second).FixedSize; + // invariant: first_width >= second_width if (first_width < second_width) { std::swap(first, second); std::swap(first_width, second_width); } + bool first_signed = IsDataTypeSigned(first); bool second_signed = IsDataTypeSigned(second); + if (first_width > second_width && !first_signed && second_signed || first_width == second_width && first_signed != second_signed) { @@ -2251,7 +2261,7 @@ namespace NTypeAnnImpl { return IGraphTransformer::TStatus::Error; } } - return IGraphTransformer::TStatus::Ok; + return IGraphTransformer::TStatus::Repeat; } } @@ -2283,7 +2293,7 @@ namespace NTypeAnnImpl { } if (!checked) { - auto check_result = CheckIntegralsWidth(input, ctx, dataType[0]->GetSlot(), dataType[1]->GetSlot()); + auto check_result = CheckIntegralsWidth(input, ctx, dataType[0]->GetSlot(), dataType[1]->GetSlot(), output); if (check_result != IGraphTransformer::TStatus::Ok) { return check_result; } @@ -2376,7 +2386,7 @@ namespace NTypeAnnImpl { } if (!checked) { - auto check_result = CheckIntegralsWidth(input, ctx, dataType[0]->GetSlot(), dataType[1]->GetSlot()); + auto check_result = CheckIntegralsWidth(input, ctx, dataType[0]->GetSlot(), dataType[1]->GetSlot(), output); if (check_result != IGraphTransformer::TStatus::Ok) { return check_result; } @@ -2467,7 +2477,7 @@ namespace NTypeAnnImpl { } if (!checked) { - auto check_result = CheckIntegralsWidth(input, ctx, dataType[0]->GetSlot(), dataType[1]->GetSlot()); + auto check_result = CheckIntegralsWidth(input, ctx, dataType[0]->GetSlot(), dataType[1]->GetSlot(), output); if (check_result != IGraphTransformer::TStatus::Ok) { return check_result; } @@ -2545,7 +2555,7 @@ namespace NTypeAnnImpl { } if (!checked) { - auto check_result = CheckIntegralsWidth(input, ctx, dataType[0]->GetSlot(), dataType[1]->GetSlot()); + auto check_result = CheckIntegralsWidth(input, ctx, dataType[0]->GetSlot(), dataType[1]->GetSlot(), output); if (check_result != IGraphTransformer::TStatus::Ok) { return check_result; } @@ -2618,7 +2628,7 @@ namespace NTypeAnnImpl { } if (!checked) { - auto check_result = CheckIntegralsWidth(input, ctx, dataType[0]->GetSlot(), dataType[1]->GetSlot()); + auto check_result = CheckIntegralsWidth(input, ctx, dataType[0]->GetSlot(), dataType[1]->GetSlot(), output); if (check_result != IGraphTransformer::TStatus::Ok) { return check_result; } @@ -11439,19 +11449,29 @@ template <NKikimr::NUdf::EDataSlot DataSlot> Functions["+"] = &AddWrapper; Functions["Add"] = &AddWrapper; Functions["CheckedAdd"] = &AddWrapper; + Functions["+MayWarn"] = &AddWrapper; + Functions["AddMayWarn"] = &AddWrapper; Functions["AggrAdd"] = &AggrAddWrapper; Functions["-"] = &SubWrapper; Functions["Sub"] = &SubWrapper; Functions["CheckedSub"] = &SubWrapper; + Functions["-MayWarn"] = &SubWrapper; + Functions["SubMayWarn"] = &SubWrapper; Functions["*"] = &MulWrapper; Functions["Mul"] = &MulWrapper; Functions["CheckedMul"] = &MulWrapper; + Functions["*MayWarn"] = &MulWrapper; + Functions["MulMayWarn"] = &MulWrapper; Functions["/"] = &DivWrapper; Functions["Div"] = &DivWrapper; Functions["CheckedDiv"] = &DivWrapper; + Functions["/MayWarn"] = &DivWrapper; + Functions["DivMayWarn"] = &DivWrapper; Functions["%"] = &ModWrapper; Functions["Mod"] = &ModWrapper; Functions["CheckedMod"] = &ModWrapper; + Functions["%MayWarn"] = &ModWrapper; + Functions["ModMayWarn"] = &ModWrapper; Functions["BitAnd"] = &BitOpsWrapper<2>; Functions["BitOr"] = &BitOpsWrapper<2>; Functions["BitXor"] = &BitOpsWrapper<2>; diff --git a/ydb/library/yql/core/type_ann/type_ann_expr.cpp b/ydb/library/yql/core/type_ann/type_ann_expr.cpp index 9fd10cd5ba1..83f9b875a65 100644 --- a/ydb/library/yql/core/type_ann/type_ann_expr.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_expr.cpp @@ -194,7 +194,7 @@ private: CurrentFunctions.top().second = true; } - str << "function: " << input->Content(); + str << "function: " << NormalizeCallableName(input->Content()); break; case TExprNode::List: if (CurrentFunctions.empty()) { diff --git a/ydb/library/yql/core/yql_callable_transform.h b/ydb/library/yql/core/yql_callable_transform.h index f0c0a837291..3d0021abb69 100644 --- a/ydb/library/yql/core/yql_callable_transform.h +++ b/ydb/library/yql/core/yql_callable_transform.h @@ -38,7 +38,8 @@ public: auto name = input->Content(); TIssueScopeGuard issueScope(ctx.IssueManager, [&]() { - return MakeIntrusive<TIssue>(ctx.GetPosition(input->Pos()), TStringBuilder() << "At function: " << name); + return MakeIntrusive<TIssue>(ctx.GetPosition(input->Pos()), + TStringBuilder() << "At function: " << NormalizeCallableName(name)); }); TStatus status = TStatus::Ok; diff --git a/ydb/library/yql/core/yql_expr_type_annotation.cpp b/ydb/library/yql/core/yql_expr_type_annotation.cpp index da3f156efc9..703efc6a5b0 100644 --- a/ydb/library/yql/core/yql_expr_type_annotation.cpp +++ b/ydb/library/yql/core/yql_expr_type_annotation.cpp @@ -6105,5 +6105,9 @@ TExprNode::TPtr ConvertToMultiLambda(const TExprNode::TPtr& lambda, TExprContext return ctx.NewLambda(lambda->Pos(), ctx.NewArguments(lambda->Pos(), { newArg }), std::move(bodies)); } +TStringBuf NormalizeCallableName(TStringBuf name) { + name.ChopSuffix("MayWarn"sv); + return name; +} } // NYql diff --git a/ydb/library/yql/core/yql_expr_type_annotation.h b/ydb/library/yql/core/yql_expr_type_annotation.h index 3c935c7f9b7..c4d560ec48e 100644 --- a/ydb/library/yql/core/yql_expr_type_annotation.h +++ b/ydb/library/yql/core/yql_expr_type_annotation.h @@ -329,4 +329,6 @@ bool ApplyOriginalType(TExprNode::TPtr input, bool isMany, const TTypeAnnotation TExprNode::TPtr ConvertToMultiLambda(const TExprNode::TPtr& lambda, TExprContext& ctx); const TStringBuf BlockLengthColumnName = "_yql_block_length"; + +TStringBuf NormalizeCallableName(TStringBuf name); } diff --git a/ydb/library/yql/sql/v1/node.cpp b/ydb/library/yql/sql/v1/node.cpp index 53f8f8d6c09..a4dc208b951 100644 --- a/ydb/library/yql/sql/v1/node.cpp +++ b/ydb/library/yql/sql/v1/node.cpp @@ -3462,7 +3462,9 @@ TNodePtr BuildBinaryOp(TContext& ctx, TPosition pos, const TString& opName, TNod const bool oneArgNull = a->IsNull() || b->IsNull(); if (bothArgNull || (opName != "Or" && oneArgNull)) { - ctx.Warning(pos, TIssuesIds::YQL_OPERATION_WILL_RETURN_NULL) << "Binary operation " << opName << " will return NULL here"; + ctx.Warning(pos, TIssuesIds::YQL_OPERATION_WILL_RETURN_NULL) << "Binary operation " + << opName.substr(0, opName.Size() - 7 * opName.EndsWith("MayWarn")) + << " will return NULL here"; } } diff --git a/ydb/library/yql/sql/v1/sql.cpp b/ydb/library/yql/sql/v1/sql.cpp index d0449e9746f..f7cd6a85101 100644 --- a/ydb/library/yql/sql/v1/sql.cpp +++ b/ydb/library/yql/sql/v1/sql.cpp @@ -5959,19 +5959,19 @@ TNodePtr TSqlExpression::BinOpList(const TNode& node, TGetNode getNode, TIter be Ctx.IncrementMonCounter("sql_binary_operations", "GreaterOrEq"); break; case SQLv1LexerTokens::TOKEN_PLUS: - opName = Ctx.Scoped->PragmaCheckedOps ? "CheckedAdd" : "+"; + opName = Ctx.Scoped->PragmaCheckedOps ? "CheckedAdd" : "+MayWarn"; Ctx.IncrementMonCounter("sql_binary_operations", "Plus"); break; case SQLv1LexerTokens::TOKEN_MINUS: - opName = Ctx.Scoped->PragmaCheckedOps ? "CheckedSub" : "-"; + opName = Ctx.Scoped->PragmaCheckedOps ? "CheckedSub" : "-MayWarn"; Ctx.IncrementMonCounter("sql_binary_operations", "Minus"); break; case SQLv1LexerTokens::TOKEN_ASTERISK: - opName = Ctx.Scoped->PragmaCheckedOps ? "CheckedMul" : "*"; + opName = Ctx.Scoped->PragmaCheckedOps ? "CheckedMul" : "*MayWarn"; Ctx.IncrementMonCounter("sql_binary_operations", "Multiply"); break; case SQLv1LexerTokens::TOKEN_SLASH: - opName = "/"; + opName = "/MayWarn"; Ctx.IncrementMonCounter("sql_binary_operations", "Divide"); if (!Ctx.Scoped->PragmaClassicDivision && partialResult) { partialResult = new TCallNodeImpl(pos, "SafeCast", {std::move(partialResult), BuildDataType(pos, "Double")}); @@ -5980,7 +5980,7 @@ TNodePtr TSqlExpression::BinOpList(const TNode& node, TGetNode getNode, TIter be } break; case SQLv1LexerTokens::TOKEN_PERCENT: - opName = Ctx.Scoped->PragmaCheckedOps ? "CheckedMod" : "%"; + opName = Ctx.Scoped->PragmaCheckedOps ? "CheckedMod" : "%MayWarn"; Ctx.IncrementMonCounter("sql_binary_operations", "Mod"); break; default: diff --git a/ydb/library/yql/sql/v1/sql_ut.cpp b/ydb/library/yql/sql/v1/sql_ut.cpp index dde1881eb3f..71ac2854298 100644 --- a/ydb/library/yql/sql/v1/sql_ut.cpp +++ b/ydb/library/yql/sql/v1/sql_ut.cpp @@ -538,7 +538,7 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) { UNIT_ASSERT(res.Root); TVerifyLineFunc verifyLine = [](const TString& word, const TString& line) { if (word == "Sort") { - UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("\"+\"")); + UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("\"+MayWarn\"")); UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("key")); UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("subkey")); UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("(Bool 'true)")); @@ -557,7 +557,7 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) { UNIT_ASSERT(res.Root); TVerifyLineFunc verifyLine = [](const TString& word, const TString& line) { if (word == "Sort") { - UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("\"-\"")); + UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("\"-MayWarn\"")); UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("\"key\"")); UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("\"subkey\"")); UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("(Bool 'false)")); @@ -580,7 +580,7 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) { UNIT_ASSERT(res.Root); TVerifyLineFunc verifyLine = [](const TString& word, const TString& line) { if (word == "Sort") { - UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("\"%\"")); + UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("\"%MayWarn\"")); UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("\"key\"")); UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("\"subkey\"")); UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("(Bool 'true)")); |