summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormrlolthe1st <[email protected]>2023-06-13 12:04:19 +0300
committermrlolthe1st <[email protected]>2023-06-13 12:04:19 +0300
commit2432d57a6100fc5cde46761547140706b62a2816 (patch)
treec9a8ea8646a66940d9bee06fbfc97bbfb529c187
parentec56ac8ea80090dba89dc6fda194b0d68ce11bab (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.cpp36
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_expr.cpp2
-rw-r--r--ydb/library/yql/core/yql_callable_transform.h3
-rw-r--r--ydb/library/yql/core/yql_expr_type_annotation.cpp4
-rw-r--r--ydb/library/yql/core/yql_expr_type_annotation.h2
-rw-r--r--ydb/library/yql/sql/v1/node.cpp4
-rw-r--r--ydb/library/yql/sql/v1/sql.cpp10
-rw-r--r--ydb/library/yql/sql/v1/sql_ut.cpp6
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)"));