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