From 06c4789a415c6cdb7a319201432abbdec9bff93b Mon Sep 17 00:00:00 2001 From: nevermore <58863790@qq.com> Date: Fri, 24 Jul 2020 11:09:35 +0800 Subject: [PATCH] Fixed memory leak in type casting (#147) * release type cast * add test case: * fix error * fix compiler error * fix error * fix compiler error Co-authored-by: jimingquan <mingquan.ji@vesoft.com> Co-authored-by: dutor <440396+dutor@users.noreply.github.com> --- src/context/QueryExpressionContext.cpp | 1 - src/parser/parser.yy | 6 +- src/parser/test/CMakeLists.txt | 7 ++ src/parser/test/ParserTest.cpp | 105 +++++++++++++++++++++++++ src/planner/PlanNode.cpp | 2 +- 5 files changed, 116 insertions(+), 5 deletions(-) diff --git a/src/context/QueryExpressionContext.cpp b/src/context/QueryExpressionContext.cpp index dfd7bf2d..9283ed06 100644 --- a/src/context/QueryExpressionContext.cpp +++ b/src/context/QueryExpressionContext.cpp @@ -90,7 +90,6 @@ const Value& QueryExpressionContext::getInputProp(const std::string& prop) const void QueryExpressionContext::setVar(const std::string& var, Value val) { if (ectx_ == nullptr) { LOG(ERROR) << "Execution context was not provided."; - DCHECK_NOTNULL(ectx_); return; } ectx_->setValue(var, std::move(val)); diff --git a/src/parser/parser.yy b/src/parser/parser.yy index 8c4972da..79205e49 100644 --- a/src/parser/parser.yy +++ b/src/parser/parser.yy @@ -16,6 +16,7 @@ #include <cstddef> #include "parser/SequentialSentences.h" #include "parser/ColumnTypeDef.h" +#include "util/SchemaUtil.h" namespace nebula { @@ -480,11 +481,10 @@ unary_expression | KW_NOT unary_expression { $$ = new UnaryExpression(Expression::Kind::kUnaryNot, $2); } -/* | L_PAREN type_spec R_PAREN unary_expression { - $$ = new TypeCastingExpression($2->type, $4); + $$ = new TypeCastingExpression(graph::SchemaUtil::propTypeToValueType($2->type), $4); + delete $2; } -*/ ; type_spec diff --git a/src/parser/test/CMakeLists.txt b/src/parser/test/CMakeLists.txt index 36780d0a..b28cfef0 100644 --- a/src/parser/test/CMakeLists.txt +++ b/src/parser/test/CMakeLists.txt @@ -17,6 +17,13 @@ set(PARSER_TEST_LIBS $<TARGET_OBJECTS:common_datatypes_obj> $<TARGET_OBJECTS:common_base_obj> $<TARGET_OBJECTS:common_function_manager_obj> + $<TARGET_OBJECTS:common_meta_thrift_obj> + $<TARGET_OBJECTS:common_meta_obj> + $<TARGET_OBJECTS:common_meta_client_obj> + $<TARGET_OBJECTS:common_conf_obj> + $<TARGET_OBJECTS:common_file_based_cluster_id_man_obj> + $<TARGET_OBJECTS:util_obj> + $<TARGET_OBJECTS:context_obj> ) nebula_add_test( diff --git a/src/parser/test/ParserTest.cpp b/src/parser/test/ParserTest.cpp index 7b1fc686..a68fe3aa 100644 --- a/src/parser/test/ParserTest.cpp +++ b/src/parser/test/ParserTest.cpp @@ -2037,4 +2037,109 @@ TEST(Parser, IssueLabelAsExpression) { } } +TEST(Parser, TypeCast) { + { + GQLParser parser; + std::string query = "YIELD (INT)\"123\""; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (INT) \"123\""; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (INT)\".123\""; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (INT8)\".123\""; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (INT16)\".123\""; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (INT32)\".123\""; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (INT64)\"1.23\""; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (INT65)\"1.23\""; + auto result = parser.parse(query); + ASSERT_FALSE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (DOUBLE)\"123abc\""; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (INT)\"abc123\""; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (FLOAT)\"123\""; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (FLOAT)\"1.23\""; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (FLOAT)\".123\""; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (STRING)123"; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (STRING)1.23"; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (MAP)123"; + auto result = parser.parse(query); + ASSERT_FALSE(result.ok()); + } + { + GQLParser parser; + std::string query = "YIELD (INT)true"; + auto result = parser.parse(query); + ASSERT_TRUE(result.ok()); + } +} + } // namespace nebula diff --git a/src/planner/PlanNode.cpp b/src/planner/PlanNode.cpp index 4c1a9fa0..b5ca1cc8 100644 --- a/src/planner/PlanNode.cpp +++ b/src/planner/PlanNode.cpp @@ -11,7 +11,7 @@ namespace nebula { namespace graph { PlanNode::PlanNode(ExecutionPlan* plan, Kind kind) : kind_(kind), plan_(plan) { - DCHECK_NOTNULL(plan_); + DCHECK(plan_ != nullptr); plan_->addPlanNode(this); } -- GitLab