Browse Source

fix(func): array_join support more types (#2189)

Signed-off-by: Jiyong Huang <huangjy@emqx.io>
ngjaying 1 year ago
parent
commit
49bdc3d36f

+ 8 - 14
internal/binder/function/funcs_array.go

@@ -554,7 +554,7 @@ func registerArrayFunc() {
 	builtins["array_join"] = builtinFunc{
 		fType: ast.FuncTypeScalar,
 		exec: func(ctx api.FunctionContext, args []interface{}) (interface{}, bool) {
-			array, ok := args[0].([]interface{})
+			arr, ok := args[0].([]interface{})
 			if !ok {
 				return errorArrayFirstArgumentNotArrayError, false
 			}
@@ -572,27 +572,21 @@ func registerArrayFunc() {
 				}
 			}
 
-			var index int
-			for _, v := range array {
+			array := make([]string, 0, len(arr))
+			for _, v := range arr {
 				if v == nil {
 					if len(nullReplacement) != 0 {
-						array[index] = nullReplacement
-						index++
+						array = append(array, nullReplacement)
 					}
 				} else {
-					array[index], ok = v.(string)
-					index++
-					if !ok {
+					vs, err := cast.ToString(v, cast.CONVERT_ALL)
+					if err != nil {
 						return errorArrayNotStringElementError, false
 					}
+					array = append(array, vs)
 				}
 			}
-
-			strs, err := cast.ToStringSlice(array[:index], cast.CONVERT_ALL)
-			if err != nil {
-				return err, false
-			}
-			return strings.Join(strs, delimiter), true
+			return strings.Join(array, delimiter), true
 		},
 		val: func(ctx api.FunctionContext, args []ast.Expr) error {
 			if err := ValidateLen(2, len(args)); err != nil {

+ 1 - 1
internal/binder/function/funcs_array_test.go

@@ -614,7 +614,7 @@ func TestArrayCommonFunctions(t *testing.T) {
 			args: []interface{}{
 				[]interface{}{123, "b", "c"}, ":", "a",
 			},
-			result: errorArrayNotStringElementError,
+			result: "123:b:c",
 		},
 		{
 			name: "array_join",