From b2984e1ff96423d82ebd86d4e9a7e2beb6fb40d1 Mon Sep 17 00:00:00 2001 From: Andy Yang Date: Mon, 5 Feb 2018 16:32:19 +0800 Subject: [PATCH 1/3] [TRAFODION-2772] - retrieve a value from Json string got an error --- core/sql/exp/exp_function.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/sql/exp/exp_function.cpp b/core/sql/exp/exp_function.cpp index 1f757fae1f..c439559340 100644 --- a/core/sql/exp/exp_function.cpp +++ b/core/sql/exp/exp_function.cpp @@ -6503,8 +6503,15 @@ ex_expr::exp_return_type ex_function_json_object_field_text::eval(char *op_data[ Int32 prec2 = ((SimpleType *)getOperand(2))->getPrecision(); len2 = Attributes::trimFillerSpaces( op_data[2], prec2, len2, cs ); } + char *rltStr = NULL; - JsonReturnType ret = json_extract_path_text(&rltStr, op_data[1], 1, op_data[2]); + char *jsonStr = new(heap) char[len1+1]; + char *jsonAttr = new(heap) char[len2+1]; + strncpy(jsonStr, op_data[1], len1); + jsonStr[len1] = '\0'; + strncpy(jsonAttr, op_data[2], len2); + jsonAttr[len2] = '\0'; + JsonReturnType ret = json_extract_path_text(&rltStr, jsonStr, 1, jsonAttr); if (ret != JSON_OK) { ExRaiseJSONError(heap, diagsArea, ret); From f9888bc0b2ec65af99f757d3b2d1299c57734e1a Mon Sep 17 00:00:00 2001 From: Andy Yang Date: Tue, 6 Feb 2018 18:13:31 +0800 Subject: [PATCH 2/3] [TRAFODION-2772] - retrieve a value from Json string got an error: release memory to heap --- core/sql/exp/exp_function.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/sql/exp/exp_function.cpp b/core/sql/exp/exp_function.cpp index c439559340..b802289881 100644 --- a/core/sql/exp/exp_function.cpp +++ b/core/sql/exp/exp_function.cpp @@ -6514,6 +6514,10 @@ ex_expr::exp_return_type ex_function_json_object_field_text::eval(char *op_data[ JsonReturnType ret = json_extract_path_text(&rltStr, jsonStr, 1, jsonAttr); if (ret != JSON_OK) { + if (jsonStr) + NADELETEBASIC(jsonStr,(heap)); + if (jsonAttr) + NADELETEBASIC(jsonAttr,(heap)); ExRaiseJSONError(heap, diagsArea, ret); return ex_expr::EXPR_ERROR; } @@ -6531,6 +6535,11 @@ ex_expr::exp_return_type ex_function_json_object_field_text::eval(char *op_data[ else getOperand(0)->setVarLength(0, op_data[-MAX_OPERANDS]); + if (jsonStr) + NADELETEBASIC(jsonStr,(heap)); + if (jsonAttr) + NADELETEBASIC(jsonAttr,(heap)); + return ex_expr::EXPR_OK; } From f8726b4d7efc6d9ca9115ce8e4ffbc69815c3b57 Mon Sep 17 00:00:00 2001 From: Andy Yang Date: Wed, 7 Feb 2018 15:55:32 +0800 Subject: [PATCH 3/3] [TRAFODION-2772] - retrieve a value from Json string got an error: using array to replace dynamic memory --- core/sql/exp/exp_function.cpp | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/core/sql/exp/exp_function.cpp b/core/sql/exp/exp_function.cpp index b802289881..13815a3e30 100644 --- a/core/sql/exp/exp_function.cpp +++ b/core/sql/exp/exp_function.cpp @@ -6505,8 +6505,8 @@ ex_expr::exp_return_type ex_function_json_object_field_text::eval(char *op_data[ } char *rltStr = NULL; - char *jsonStr = new(heap) char[len1+1]; - char *jsonAttr = new(heap) char[len2+1]; + char jsonStr[len1+1]; + char jsonAttr[len2+1]; strncpy(jsonStr, op_data[1], len1); jsonStr[len1] = '\0'; strncpy(jsonAttr, op_data[2], len2); @@ -6514,10 +6514,6 @@ ex_expr::exp_return_type ex_function_json_object_field_text::eval(char *op_data[ JsonReturnType ret = json_extract_path_text(&rltStr, jsonStr, 1, jsonAttr); if (ret != JSON_OK) { - if (jsonStr) - NADELETEBASIC(jsonStr,(heap)); - if (jsonAttr) - NADELETEBASIC(jsonAttr,(heap)); ExRaiseJSONError(heap, diagsArea, ret); return ex_expr::EXPR_ERROR; } @@ -6535,11 +6531,6 @@ ex_expr::exp_return_type ex_function_json_object_field_text::eval(char *op_data[ else getOperand(0)->setVarLength(0, op_data[-MAX_OPERANDS]); - if (jsonStr) - NADELETEBASIC(jsonStr,(heap)); - if (jsonAttr) - NADELETEBASIC(jsonAttr,(heap)); - return ex_expr::EXPR_OK; }