diff --git a/be/src/vec/functions/function_json.cpp b/be/src/vec/functions/function_json.cpp
index a299f547660467..56fb66a4072ebb 100644
--- a/be/src/vec/functions/function_json.cpp
+++ b/be/src/vec/functions/function_json.cpp
@@ -645,7 +645,7 @@ struct FunctionJsonArrayImpl {
                               rapidjson::Document::AllocatorType& allocator,
                               const std::vector<const ColumnUInt8*>& nullmaps) {
         for (int i = 0; i < data_columns.size() - 1; i++) {
-            constexpr_int_match<'0', '6', Reducer>::run(type_flags[i], objects, allocator,
+            constexpr_int_match<'0', '7', Reducer>::run(type_flags[i], objects, allocator,
                                                         data_columns[i], nullmaps[i]);
         }
     }
@@ -1523,7 +1523,7 @@ class FunctionJsonModifyImpl : public IFunction {
                               const std::vector<const ColumnUInt8*>& nullmaps,
                               std::vector<bool>& column_is_consts) {
         for (auto col = 1; col + 1 < data_columns.size() - 1; col += 2) {
-            constexpr_int_match<'0', '6', Reducer>::run(
+            constexpr_int_match<'0', '7', Reducer>::run(
                     type_flags[col + 1], objects, json_paths[col / 2], data_columns[col + 1],
                     nullmaps[col + 1], column_is_consts[col + 1]);
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonArray.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonArray.java
index 51d8d4f4e6c4f0..581b21bc589dee 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonArray.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonArray.java
@@ -20,24 +20,20 @@
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
-import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.functions.CustomSignature;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DataType;
+import org.apache.doris.nereids.types.JsonType;
 import org.apache.doris.nereids.types.VarcharType;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
-import com.google.common.collect.ImmutableList;
-
+import java.util.ArrayList;
 import java.util.List;
 
 /**
  * ScalarFunction 'json_array'. This class is generated by GenerateFunction.
  */
-public class JsonArray extends ScalarFunction
-        implements ExplicitlyCastableSignature, AlwaysNotNullable {
-
-    public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-            FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).varArgs(VarcharType.SYSTEM_DEFAULT)
-    );
+public class JsonArray extends ScalarFunction implements CustomSignature, AlwaysNotNullable {
 
     /**
      * constructor with 0 or more arguments.
@@ -46,6 +42,20 @@ public JsonArray(Expression... varArgs) {
         super("json_array", ExpressionUtils.mergeArguments(varArgs));
     }
 
+    @Override
+    public FunctionSignature customSignature() {
+        List<DataType> arguments = new ArrayList<>();
+        for (int i = 0; i < arity(); i++) {
+            if (getArgumentType(i).isComplexType() || getArgumentType(i).isJsonType()) {
+                // keep origin type for BE Serialization
+                arguments.add(JsonType.INSTANCE);
+            } else {
+                arguments.add(VarcharType.SYSTEM_DEFAULT);
+            }
+        }
+        return FunctionSignature.of(VarcharType.SYSTEM_DEFAULT, arguments);
+    }
+
     /**
      * withChildren.
      */
@@ -54,11 +64,6 @@ public JsonArray withChildren(List<Expression> children) {
         return new JsonArray(children.toArray(new Expression[0]));
     }
 
-    @Override
-    public List<FunctionSignature> getSignatures() {
-        return SIGNATURES;
-    }
-
     @Override
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitJsonArray(this, context);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonInsert.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonInsert.java
index 8f9c9900aec324..397067509c69ea 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonInsert.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonInsert.java
@@ -19,26 +19,23 @@
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.functions.CustomSignature;
 import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DataType;
+import org.apache.doris.nereids.types.JsonType;
 import org.apache.doris.nereids.types.VarcharType;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
  * ScalarFunction 'json_insert'. This class is generated by GenerateFunction.
  */
-public class JsonInsert extends ScalarFunction
-        implements ExplicitlyCastableSignature, PropagateNullable {
-
-    public static final List<FunctionSignature> SIGNATURES =
-            ImmutableList.of(FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT)
-            .varArgs(VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT));
+public class JsonInsert extends ScalarFunction implements CustomSignature, PropagateNullable {
 
     /**
      * constructor with 3 or more arguments.
@@ -47,6 +44,21 @@ public JsonInsert(Expression arg0, Expression arg1, Expression arg2, Expression.
         super("json_insert", ExpressionUtils.mergeArguments(arg0, arg1, arg2, varArgs));
     }
 
+    @Override
+    public FunctionSignature customSignature() {
+        List<DataType> arguments = new ArrayList<>();
+        arguments.add(VarcharType.SYSTEM_DEFAULT); // json_str
+        for (int i = 1; i < arity(); i++) {
+            if ((i & 1) == 0 && (getArgumentType(i).isComplexType() || getArgumentType(i).isJsonType())) {
+                // keep origin type for BE Serialization
+                arguments.add(JsonType.INSTANCE);
+            } else {
+                arguments.add(VarcharType.SYSTEM_DEFAULT);
+            }
+        }
+        return FunctionSignature.of(VarcharType.SYSTEM_DEFAULT, arguments);
+    }
+
     /**
      * withChildren.
      */
@@ -57,11 +69,6 @@ public JsonInsert withChildren(List<Expression> children) {
             children.subList(3, children.size()).toArray(new Expression[0]));
     }
 
-    @Override
-    public List<FunctionSignature> getSignatures() {
-        return SIGNATURES;
-    }
-
     @Override
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitJsonInsert(this, context);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonReplace.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonReplace.java
index c5ced84ac8e5af..69e424df1fd348 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonReplace.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonReplace.java
@@ -19,26 +19,23 @@
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.functions.CustomSignature;
 import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DataType;
+import org.apache.doris.nereids.types.JsonType;
 import org.apache.doris.nereids.types.VarcharType;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
  * ScalarFunction 'json_replace'. This class is generated by GenerateFunction.
  */
-public class JsonReplace extends ScalarFunction
-        implements ExplicitlyCastableSignature, PropagateNullable {
-
-    public static final List<FunctionSignature> SIGNATURES =
-            ImmutableList.of(FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT)
-            .varArgs(VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT));
+public class JsonReplace extends ScalarFunction implements CustomSignature, PropagateNullable {
 
     /**
      * constructor with 3 or more arguments.
@@ -47,6 +44,21 @@ public JsonReplace(Expression arg0, Expression arg1, Expression arg2, Expression
         super("json_replace", ExpressionUtils.mergeArguments(arg0, arg1, arg2, varArgs));
     }
 
+    @Override
+    public FunctionSignature customSignature() {
+        List<DataType> arguments = new ArrayList<>();
+        arguments.add(VarcharType.SYSTEM_DEFAULT); // json_str
+        for (int i = 1; i < arity(); i++) {
+            if ((i & 1) == 0 && (getArgumentType(i).isComplexType() || getArgumentType(i).isJsonType())) {
+                // keep origin type for BE Serialization
+                arguments.add(JsonType.INSTANCE);
+            } else {
+                arguments.add(VarcharType.SYSTEM_DEFAULT);
+            }
+        }
+        return FunctionSignature.of(VarcharType.SYSTEM_DEFAULT, arguments);
+    }
+
     /**
      * withChildren.
      */
@@ -57,11 +69,6 @@ public JsonReplace withChildren(List<Expression> children) {
             children.subList(3, children.size()).toArray(new Expression[0]));
     }
 
-    @Override
-    public List<FunctionSignature> getSignatures() {
-        return SIGNATURES;
-    }
-
     @Override
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitJsonReplace(this, context);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonSet.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonSet.java
index 1076e7ff4ecf9c..f3b1345f823b10 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonSet.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonSet.java
@@ -19,26 +19,23 @@
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.functions.CustomSignature;
 import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DataType;
+import org.apache.doris.nereids.types.JsonType;
 import org.apache.doris.nereids.types.VarcharType;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
  * ScalarFunction 'json_set'. This class is generated by GenerateFunction.
  */
-public class JsonSet extends ScalarFunction
-        implements ExplicitlyCastableSignature, PropagateNullable {
-
-    public static final List<FunctionSignature> SIGNATURES =
-            ImmutableList.of(FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT)
-            .varArgs(VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT));
+public class JsonSet extends ScalarFunction implements CustomSignature, PropagateNullable {
 
     /**
      * constructor with 3 or more arguments.
@@ -47,6 +44,21 @@ public JsonSet(Expression arg0, Expression arg1, Expression arg2, Expression...
         super("json_set", ExpressionUtils.mergeArguments(arg0, arg1, arg2, varArgs));
     }
 
+    @Override
+    public FunctionSignature customSignature() {
+        List<DataType> arguments = new ArrayList<>();
+        arguments.add(VarcharType.SYSTEM_DEFAULT); // json_str
+        for (int i = 1; i < arity(); i++) {
+            if ((i & 1) == 0 && (getArgumentType(i).isComplexType() || getArgumentType(i).isJsonType())) {
+                // keep origin type for BE Serialization
+                arguments.add(JsonType.INSTANCE);
+            } else {
+                arguments.add(VarcharType.SYSTEM_DEFAULT);
+            }
+        }
+        return FunctionSignature.of(VarcharType.SYSTEM_DEFAULT, arguments);
+    }
+
     /**
      * withChildren.
      */
@@ -57,11 +69,6 @@ public JsonSet withChildren(List<Expression> children) {
             children.subList(3, children.size()).toArray(new Expression[0]));
     }
 
-    @Override
-    public List<FunctionSignature> getSignatures() {
-        return SIGNATURES;
-    }
-
     @Override
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitJsonSet(this, context);
diff --git a/regression-test/data/query_p0/sql_functions/json_function/test_query_json_array.out b/regression-test/data/query_p0/sql_functions/json_function/test_query_json_array.out
index 394d5580ee8fc1..5e170954a96b17 100644
--- a/regression-test/data/query_p0/sql_functions/json_function/test_query_json_array.out
+++ b/regression-test/data/query_p0/sql_functions/json_function/test_query_json_array.out
@@ -6,3 +6,61 @@
 ["k0",4,"k1",null,"k2",null,"k3","test","k4","2022-01-01 11:11:11","k5",null,"k6","k6"]
 ["k0",5,"k1",1,"k2",true,"k3","test","k4","2022-01-01 11:11:11","k5",null,"k6","k6"]
 
+-- !sql_array --
+[["\\"aaa\\"","\\"bbb\\""]]
+
+-- !sql_array --
+[["aaa","bbb"]]
+
+-- !sql_array --
+[[1,2]]
+
+-- !sql_array --
+[[1.1,2.2]]
+
+-- !sql_array --
+[[1.1,2.0]]
+
+-- !sql_array --
+[[1.0,1.2]]
+
+-- !sql_map --
+[{"a":"b","c":"d"}]
+
+-- !sql_map --
+[{"a":1,"c":2}]
+
+-- !sql_map --
+[{"a":1.1,"c":2.2}]
+
+-- !sql_map --
+[{"a":1.1,"c":2.0}]
+
+-- !sql_map --
+[{"a":1.0,"c":1.2}]
+
+-- !sql_struct --
+[{"name":"a","age":1}]
+
+-- !sql_struct --
+[{"name":"a","age":1.1}]
+
+-- !sql_struct --
+[{"name":"a","age":1.0}]
+
+-- !sql_json --
+[{"a":"b"}]
+
+-- !sql_json --
+[{"a":1}]
+
+-- !sql_json --
+[{"a":1.1}]
+
+-- !sql3 --
+[1,null,null,null,null]
+[2,["a","b"],{"a":"b"},{"name":"a","age":1},{"a":"b"}]
+[3,["\\"a\\"","\\"b\\""],{"\\"a\\"":"\\"b\\"","\\"c\\"":"\\"d\\""},{"name":"\\"a\\"","age":1},{"c":"d"}]
+[4,["1","2"],{"1":"2"},{"name":"2","age":1},{"a":"b"}]
+[5,["1","2","3","3"],{"1":"2","3":"4"},{"name":"a","age":1},{"a":"b"}]
+
diff --git a/regression-test/data/query_p0/sql_functions/json_function/test_query_json_insert.out b/regression-test/data/query_p0/sql_functions/json_function/test_query_json_insert.out
index 9aa3df9655c028..63570a66228fb5 100644
--- a/regression-test/data/query_p0/sql_functions/json_function/test_query_json_insert.out
+++ b/regression-test/data/query_p0/sql_functions/json_function/test_query_json_insert.out
@@ -11,3 +11,61 @@
 {"id":0,"time":"1970-01-01 00:00:00","a1":[1,2],"a2":[1,2,9]}
 {"id":0,"time":"1970-01-01 00:00:00","a1":[1,2],"a2":[1,2,null]}
 
+-- !sql_array --
+{"data":{"arr":["\\"aaa\\"","\\"bbb\\""]}}
+
+-- !sql_array --
+{"data":{"arr":["aaa","bbb"]}}
+
+-- !sql_array --
+{"data":{"arr":[1,2]}}
+
+-- !sql_array --
+{"data":{"arr":[1.1,2.2]}}
+
+-- !sql_array --
+{"data":{"arr":[1.1,2.0]}}
+
+-- !sql_array --
+{"data":{"arr":[1.0,1.2]}}
+
+-- !sql_map --
+{"data":{"map":{"a":"b","c":"d"}}}
+
+-- !sql_map --
+{"data":{"map":{"a":1,"c":2}}}
+
+-- !sql_map --
+{"data":{"map":{"a":1.1,"c":2.2}}}
+
+-- !sql_map --
+{"data":{"map":{"a":1.1,"c":2.0}}}
+
+-- !sql_map --
+{"data":{"map":{"a":1.0,"c":1.2}}}
+
+-- !sql_struct --
+{"data":{"struct":{"name":"a","age":1}}}
+
+-- !sql_struct --
+{"data":{"struct":{"name":"a","age":1.1}}}
+
+-- !sql_struct --
+{"data":{"struct":{"name":"a","age":1.0}}}
+
+-- !sql_json --
+{"data":{"json":{"a":"b"}}}
+
+-- !sql_json --
+{"data":{"json":{"a":1}}}
+
+-- !sql_json --
+{"data":{"json":{"a":1.1}}}
+
+-- !sql2 --
+{"data":{"array":null,"map":null,"struct":null,"json":null}}
+{"data":{"array":["a","b"],"map":{"a":"b"},"struct":{"name":"a","age":1},"json":{"a":"b"}}}
+{"data":{"array":["\\"a\\"","\\"b\\""],"map":{"\\"a\\"":"\\"b\\"","\\"c\\"":"\\"d\\""},"struct":{"name":"\\"a\\"","age":1},"json":{"c":"d"}}}
+{"data":{"array":["1","2"],"map":{"1":"2"},"struct":{"name":"2","age":1},"json":{"a":"b"}}}
+{"data":{"array":["1","2","3","3"],"map":{"1":"2","3":"4"},"struct":{"name":"a","age":1},"json":{"a":"b"}}}
+
diff --git a/regression-test/data/query_p0/sql_functions/json_function/test_query_json_replace.out b/regression-test/data/query_p0/sql_functions/json_function/test_query_json_replace.out
index 3ba95483878667..d26983242e36b8 100644
--- a/regression-test/data/query_p0/sql_functions/json_function/test_query_json_replace.out
+++ b/regression-test/data/query_p0/sql_functions/json_function/test_query_json_replace.out
@@ -16,3 +16,61 @@ null
 {"id":2,"time":"2022-01-01 11:45:14","a1":[1,null],"a2":[1,2]}
 {"id":3,"time":null,"a1":[1,9],"a2":[1,2]}
 
+-- !sql_array --
+{"arr":["\\"aaa\\"","\\"bbb\\""]}
+
+-- !sql_array --
+{"arr":["aaa","bbb"]}
+
+-- !sql_array --
+{"arr":[1,2]}
+
+-- !sql_array --
+{"arr":[1.1,2.2]}
+
+-- !sql_array --
+{"arr":[1.1,2.0]}
+
+-- !sql_array --
+{"arr":[1.0,1.2]}
+
+-- !sql_map --
+{"map":{"a":"b","c":"d"}}
+
+-- !sql_map --
+{"map":{"a":1,"c":2}}
+
+-- !sql_map --
+{"map":{"a":1.1,"c":2.2}}
+
+-- !sql_map --
+{"map":{"a":1.1,"c":2.0}}
+
+-- !sql_map --
+{"map":{"a":1.0,"c":1.2}}
+
+-- !sql_struct --
+{"struct":{"name":"a","age":1}}
+
+-- !sql_struct --
+{"struct":{"name":"a","age":1.1}}
+
+-- !sql_struct --
+{"struct":{"name":"a","age":1.0}}
+
+-- !sql_json --
+{"json":{"a":"b"}}
+
+-- !sql_json --
+{"json":{"a":1}}
+
+-- !sql_json --
+{"json":{"a":1.1}}
+
+-- !sql3 --
+{"data":{"array":null,"map":null,"struct":null,"json":null}}
+{"data":{"array":["a","b"],"map":{"a":"b"},"struct":{"name":"a","age":1},"json":{"a":"b"}}}
+{"data":{"array":["\\"a\\"","\\"b\\""],"map":{"\\"a\\"":"\\"b\\"","\\"c\\"":"\\"d\\""},"struct":{"name":"\\"a\\"","age":1},"json":{"c":"d"}}}
+{"data":{"array":["1","2"],"map":{"1":"2"},"struct":{"name":"2","age":1},"json":{"a":"b"}}}
+{"data":{"array":["1","2","3","3"],"map":{"1":"2","3":"4"},"struct":{"name":"a","age":1},"json":{"a":"b"}}}
+
diff --git a/regression-test/data/query_p0/sql_functions/json_function/test_query_json_set.out b/regression-test/data/query_p0/sql_functions/json_function/test_query_json_set.out
index b289ec01b1cb75..0742d28e1f33a8 100644
--- a/regression-test/data/query_p0/sql_functions/json_function/test_query_json_set.out
+++ b/regression-test/data/query_p0/sql_functions/json_function/test_query_json_set.out
@@ -11,3 +11,61 @@ null
 {"id":3,"time":null,"a1":[1,9],"a2":[1,2,9]}
 {"id":4,"time":null,"a1":[1,null],"a2":[1,2,null]}
 
+-- !sql_array --
+{"arr":["\\"aaa\\"","\\"bbb\\""]}
+
+-- !sql_array --
+{"arr":["aaa","bbb"]}
+
+-- !sql_array --
+{"arr":[1,2]}
+
+-- !sql_array --
+{"arr":[1.1,2.2]}
+
+-- !sql_array --
+{"arr":[1.1,2.0]}
+
+-- !sql_array --
+{"arr":[1.0,1.2]}
+
+-- !sql_map --
+{"map":{"a":"b","c":"d"}}
+
+-- !sql_map --
+{"map":{"a":1,"c":2}}
+
+-- !sql_map --
+{"map":{"a":1.1,"c":2.2}}
+
+-- !sql_map --
+{"map":{"a":1.1,"c":2.0}}
+
+-- !sql_map --
+{"map":{"a":1.0,"c":1.2}}
+
+-- !sql_struct --
+{"struct":{"name":"a","age":1}}
+
+-- !sql_struct --
+{"struct":{"name":"a","age":1.1}}
+
+-- !sql_struct --
+{"struct":{"name":"a","age":1.0}}
+
+-- !sql_json --
+{"json":{"a":"b"}}
+
+-- !sql_json --
+{"json":{"a":1}}
+
+-- !sql_json --
+{"json":{"a":1.1}}
+
+-- !sql2 --
+{"data":{"array":null,"map":null,"struct":null,"json":null}}
+{"data":{"array":["a","b"],"map":{"a":"b"},"struct":{"name":"a","age":1},"json":{"a":"b"}}}
+{"data":{"array":["\\"a\\"","\\"b\\""],"map":{"\\"a\\"":"\\"b\\"","\\"c\\"":"\\"d\\""},"struct":{"name":"\\"a\\"","age":1},"json":{"c":"d"}}}
+{"data":{"array":["1","2"],"map":{"1":"2"},"struct":{"name":"2","age":1},"json":{"a":"b"}}}
+{"data":{"array":["1","2","3","3"],"map":{"1":"2","3":"4"},"struct":{"name":"a","age":1},"json":{"a":"b"}}}
+
diff --git a/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_array.groovy b/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_array.groovy
index 4005f75509a11f..e33df09f1c7121 100644
--- a/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_array.groovy
+++ b/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_array.groovy
@@ -42,4 +42,55 @@ suite("test_query_json_array", "query") {
     sql "insert into ${tableName} values(5,1,true,'test','2022-01-01 11:11:11');"
     qt_sql2 """select json_array('k0',k0,'k1',k1,'k2',k2,'k3',k3,'k4',k4,'k5', null,'k6','k6') from ${tableName} order by k0"""
     sql "DROP TABLE ${tableName};"
+
+    // test json_array with complex type
+    // array
+    qt_sql_array """ SELECT json_array(array('"aaa"','"bbb"')); """
+    qt_sql_array """ SELECT json_array(array('aaa','bbb')); """
+    qt_sql_array """ SELECT json_array(array(1,2)); """
+    qt_sql_array """ SELECT json_array(array(1.1,2.2)); """
+    qt_sql_array """ SELECT json_array(array(1.1,2)); """
+    qt_sql_array """ SELECT json_array(array(cast(1 as decimal), cast(1.2 as decimal))); """
+    // map
+    qt_sql_map """ SELECT json_array(map('a', 'b', 'c', 'd')); """
+    qt_sql_map """ SELECT json_array(map('a', 1, 'c', 2)); """
+    qt_sql_map """ SELECT json_array(map('a', 1.1, 'c', 2.2)); """
+    qt_sql_map """ SELECT json_array(map('a', 1.1, 'c', 2)); """
+    qt_sql_map """ SELECT json_array(map('a', cast(1 as decimal), 'c', cast(1.2 as decimal))); """
+    // struct
+    qt_sql_struct """ SELECT json_array(named_struct('name', 'a', 'age', 1)); """
+    qt_sql_struct """ SELECT json_array(named_struct('name', 'a', 'age', 1.1)); """
+    qt_sql_struct """ SELECT json_array(named_struct('name', 'a', 'age', cast(1 as decimal))); """
+    // json
+    qt_sql_json """ SELECT json_array(cast('{\"a\":\"b\"}' as JSON)); """
+    qt_sql_json """ SELECT json_array(cast('{\"a\":1}' as JSON)); """
+    qt_sql_json """ SELECT json_array(cast('{\"a\":1.1}' as JSON)); """
+
+    // test with table
+    tableName = "test_query_json_array_complex"
+    sql "DROP TABLE IF EXISTS ${tableName}"
+    sql """
+            CREATE TABLE ${tableName} (
+              `k0` int(11) not null,
+              `k1` array<string> NULL,
+              `k2` map<string, string> NULL,
+              `k3` struct<name:string, age:int> NULL,
+              `k4` json NULL
+            ) ENGINE=OLAP
+            DUPLICATE KEY(`k0`)
+            COMMENT "OLAP"
+            DISTRIBUTED BY HASH(`k0`) BUCKETS 1
+            PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1",
+            "in_memory" = "false",
+            "storage_format" = "V2"
+            );
+        """
+    sql "insert into ${tableName} values(1,null,null,null,null);"
+    sql "insert into ${tableName} values(2, array('a','b'), map('a','b'), named_struct('name','a','age',1), '{\"a\":\"b\"}');"
+    sql """insert into ${tableName} values(3, array('"a"', '"b"'), map('"a"', '"b"', '"c"', '"d"'), named_struct('name','"a"','age', 1), '{\"c\":\"d\"}');"""
+    sql """insert into ${tableName} values(4, array(1,2), map(1,2), named_struct('name', 2, 'age',1), '{\"a\":\"b\"}');"""
+    sql """insert into ${tableName} values(5, array(1,2,3,3), map(1,2,3,4), named_struct('name',\"a\",'age',1), '{\"a\":\"b\"}');"""
+    qt_sql3 "select json_array(k0,k1,k2,k3,k4) from ${tableName} order by k0;"
+    sql "DROP TABLE ${tableName};"
 }
diff --git a/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_insert.groovy b/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_insert.groovy
index b5865034538a11..7afb9a5e6c5ffb 100644
--- a/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_insert.groovy
+++ b/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_insert.groovy
@@ -42,4 +42,59 @@ suite("test_query_json_insert", "query,arrow_flight_sql") {
     sql "insert into ${tableName} values(4,null,null);"
     qt_sql1 "select json_insert('{\"id\": 0, \"time\": \"1970-01-01 00:00:00\", \"a1\": [1, 2], \"a2\": [1, 2]}', '\$.id', id, '\$.time', time, '\$.a1[1]', k, '\$.a2[3]', k) from ${tableName} order by id;"
     sql "DROP TABLE ${tableName};"
+
+    // test json_insert with complex type
+    // array
+    qt_sql_array """ SELECT json_insert('{"data": {}}', '\$.data.arr', array('"aaa"','"bbb"')); """
+    qt_sql_array """ SELECT json_insert('{"data": {}}', '\$.data.arr', array('aaa','bbb')); """
+    qt_sql_array """ SELECT json_insert('{"data": {}}', '\$.data.arr', array(1,2)); """
+    qt_sql_array """ SELECT json_insert('{"data": {}}', '\$.data.arr', array(1.1,2.2)); """
+    qt_sql_array """ SELECT json_insert('{"data": {}}', '\$.data.arr', array(1.1,2)); """
+    qt_sql_array """ SELECT json_insert('{"data": {}}', '\$.data.arr', array(cast(1 as decimal), cast(1.2 as decimal))); """
+    // map
+    qt_sql_map """ SELECT json_insert('{"data": {}}', '\$.data.map', map('a', 'b', 'c', 'd')); """
+    qt_sql_map """ SELECT json_insert('{"data": {}}', '\$.data.map', map('a', 1, 'c', 2)); """
+    qt_sql_map """ SELECT json_insert('{"data": {}}', '\$.data.map', map('a', 1.1, 'c', 2.2)); """
+    qt_sql_map """ SELECT json_insert('{"data": {}}', '\$.data.map', map('a', 1.1, 'c', 2)); """
+    qt_sql_map """ SELECT json_insert('{"data": {}}', '\$.data.map', map('a', cast(1 as decimal), 'c', cast(1.2 as decimal))); """
+    // struct
+    qt_sql_struct """ SELECT json_insert('{"data": {}}', '\$.data.struct', named_struct('name', 'a', 'age', 1)); """
+    qt_sql_struct """ SELECT json_insert('{"data": {}}', '\$.data.struct', named_struct('name', 'a', 'age', 1.1)); """
+    qt_sql_struct """ SELECT json_insert('{"data": {}}', '\$.data.struct', named_struct('name', 'a', 'age', cast(1 as decimal))); """
+    // json
+    qt_sql_json """ SELECT json_insert('{"data": {}}', '\$.data.json', cast('{\"a\":\"b\"}' as JSON)); """
+    qt_sql_json """ SELECT json_insert('{"data": {}}', '\$.data.json', cast('{\"a\":1}' as JSON)); """
+    qt_sql_json """ SELECT json_insert('{"data": {}}', '\$.data.json', cast('{\"a\":1.1}' as JSON)); """
+
+    // test with table
+    tableName = "test_query_json_insert_complex"
+    sql "DROP TABLE IF EXISTS ${tableName}"
+    sql """
+            CREATE TABLE ${tableName} (
+              `k0` int(11) not null,
+              `k1` array<string> NULL,
+              `k2` map<string, string> NULL,
+              `k3` struct<name:string, age:int> NULL,
+              `k4` json NULL
+            ) ENGINE=OLAP
+            DUPLICATE KEY(`k0`)
+            COMMENT "OLAP"
+            DISTRIBUTED BY HASH(`k0`) BUCKETS 1
+            PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1",
+            "in_memory" = "false",
+            "storage_format" = "V2"
+            );
+        """
+    sql "insert into ${tableName} values(1,null,null,null,null);"
+    sql "insert into ${tableName} values(2, array('a','b'), map('a','b'), named_struct('name','a','age',1), '{\"a\":\"b\"}');"
+    sql """insert into ${tableName} values(3, array('"a"', '"b"'), map('"a"', '"b"', '"c"', '"d"'), named_struct('name','"a"','age', 1), '{\"c\":\"d\"}');"""
+    sql """insert into ${tableName} values(4, array(1,2), map(1,2), named_struct('name', 2, 'age',1), '{\"a\":\"b\"}');"""
+    sql """insert into ${tableName} values(5, array(1,2,3,3), map(1,2,3,4), named_struct('name',\"a\",'age',1), '{\"a\":\"b\"}');"""
+    qt_sql2 """select json_insert('{"data": {}}', 
+                              '\$.data.array', k1, 
+                              '\$.data.map', k2, 
+                              '\$.data.struct', k3, 
+                              '\$.data.json', k4) from ${tableName} order by k0;"""
+    sql "DROP TABLE ${tableName};"
 }
diff --git a/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_replace.groovy b/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_replace.groovy
index a870169d962870..e0ffe58af29236 100644
--- a/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_replace.groovy
+++ b/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_replace.groovy
@@ -65,4 +65,59 @@ suite("test_query_json_replace", "query") {
     qt_sql2 "select json_replace('{\"id\": 0, \"time\": \"1970-01-01 00:00:00\", \"a1\": [1, 2], \"a2\": [1, 2]}', '\$.id', id, '\$.time', time, '\$.a1[1]', k, '\$.a2[3]', k) from test_query_json_replace_nullable order by id;"
 
     sql "DROP TABLE test_query_json_replace_nullable;"
+
+    // test json_replace with complex type
+    // array
+    qt_sql_array """ SELECT json_replace('{"arr": [1,2]}', '\$.arr', array('"aaa"','"bbb"')); """
+    qt_sql_array """ SELECT json_replace('{"arr": [1,2]}', '\$.arr', array('aaa','bbb')); """
+    qt_sql_array """ SELECT json_replace('{"arr": [1,2]}', '\$.arr', array(1,2)); """
+    qt_sql_array """ SELECT json_replace('{"arr": [1,2]}', '\$.arr', array(1.1,2.2)); """
+    qt_sql_array """ SELECT json_replace('{"arr": [1,2]}', '\$.arr', array(1.1,2)); """
+    qt_sql_array """ SELECT json_replace('{"arr": [1,2]}', '\$.arr', array(cast(1 as decimal), cast(1.2 as decimal))); """
+    // map
+    qt_sql_map """ SELECT json_replace('{"map": {"x": "y"}}', '\$.map', map('a', 'b', 'c', 'd')); """
+    qt_sql_map """ SELECT json_replace('{"map": {"x": "y"}}', '\$.map', map('a', 1, 'c', 2)); """
+    qt_sql_map """ SELECT json_replace('{"map": {"x": "y"}}', '\$.map', map('a', 1.1, 'c', 2.2)); """
+    qt_sql_map """ SELECT json_replace('{"map": {"x": "y"}}', '\$.map', map('a', 1.1, 'c', 2)); """
+    qt_sql_map """ SELECT json_replace('{"map": {"x": "y"}}', '\$.map', map('a', cast(1 as decimal), 'c', cast(1.2 as decimal))); """
+    // struct
+    qt_sql_struct """ SELECT json_replace('{"struct": {"name": "x", "age": 0}}', '\$.struct', named_struct('name', 'a', 'age', 1)); """
+    qt_sql_struct """ SELECT json_replace('{"struct": {"name": "x", "age": 0}}', '\$.struct', named_struct('name', 'a', 'age', 1.1)); """
+    qt_sql_struct """ SELECT json_replace('{"struct": {"name": "x", "age": 0}}', '\$.struct', named_struct('name', 'a', 'age', cast(1 as decimal))); """
+    // json
+    qt_sql_json """ SELECT json_replace('{"json": {"x": "y"}}', '\$.json', cast('{\"a\":\"b\"}' as JSON)); """
+    qt_sql_json """ SELECT json_replace('{"json": {"x": "y"}}', '\$.json', cast('{\"a\":1}' as JSON)); """
+    qt_sql_json """ SELECT json_replace('{"json": {"x": "y"}}', '\$.json', cast('{\"a\":1.1}' as JSON)); """
+
+    // test with table
+    tableName = "test_query_json_replace_complex"
+    sql "DROP TABLE IF EXISTS ${tableName}"
+    sql """
+            CREATE TABLE ${tableName} (
+              `k0` int(11) not null,
+              `k1` array<string> NULL,
+              `k2` map<string, string> NULL,
+              `k3` struct<name:string, age:int> NULL,
+              `k4` json NULL
+            ) ENGINE=OLAP
+            DUPLICATE KEY(`k0`)
+            COMMENT "OLAP"
+            DISTRIBUTED BY HASH(`k0`) BUCKETS 1
+            PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1",
+            "in_memory" = "false",
+            "storage_format" = "V2"
+            );
+        """
+    sql "insert into ${tableName} values(1,null,null,null,null);"
+    sql "insert into ${tableName} values(2, array('a','b'), map('a','b'), named_struct('name','a','age',1), '{\"a\":\"b\"}');"
+    sql """insert into ${tableName} values(3, array('"a"', '"b"'), map('"a"', '"b"', '"c"', '"d"'), named_struct('name','"a"','age', 1), '{\"c\":\"d\"}');"""
+    sql """insert into ${tableName} values(4, array(1,2), map(1,2), named_struct('name', 2, 'age',1), '{\"a\":\"b\"}');"""
+    sql """insert into ${tableName} values(5, array(1,2,3,3), map(1,2,3,4), named_struct('name',\"a\",'age',1), '{\"a\":\"b\"}');"""
+    qt_sql3 """select json_replace('{"data": {"array": [1], "map": {"x":"y"}, "struct": {"name":"x","age":0}, "json": {"x":"y"}}}', 
+                              '\$.data.array', k1, 
+                              '\$.data.map', k2, 
+                              '\$.data.struct', k3, 
+                              '\$.data.json', k4) from ${tableName} order by k0;"""
+    sql "DROP TABLE ${tableName};"
 }
diff --git a/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_set.groovy b/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_set.groovy
index 2c65ddb410497a..6f04e4be88a70f 100644
--- a/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_set.groovy
+++ b/regression-test/suites/query_p0/sql_functions/json_function/test_query_json_set.groovy
@@ -42,4 +42,59 @@ suite("test_query_json_set", "query") {
     sql "insert into ${tableName} values(4,null,null);"
     qt_sql1 "select json_set('{\"id\": 0, \"time\": \"1970-01-01 00:00:00\", \"a1\": [1, 2], \"a2\": [1, 2]}', '\$.id', id, '\$.time', time, '\$.a1[1]', k, '\$.a2[3]', k) from ${tableName} order by id;"
     sql "DROP TABLE ${tableName};"
+
+    // test json_set with complex type
+    // array
+    qt_sql_array """ SELECT json_set('{"arr": null}', '\$.arr', array('"aaa"','"bbb"')); """
+    qt_sql_array """ SELECT json_set('{"arr": null}', '\$.arr', array('aaa','bbb')); """
+    qt_sql_array """ SELECT json_set('{"arr": null}', '\$.arr', array(1,2)); """
+    qt_sql_array """ SELECT json_set('{"arr": null}', '\$.arr', array(1.1,2.2)); """
+    qt_sql_array """ SELECT json_set('{"arr": null}', '\$.arr', array(1.1,2)); """
+    qt_sql_array """ SELECT json_set('{"arr": null}', '\$.arr', array(cast(1 as decimal), cast(1.2 as decimal))); """
+    // map
+    qt_sql_map """ SELECT json_set('{"map": null}', '\$.map', map('a', 'b', 'c', 'd')); """
+    qt_sql_map """ SELECT json_set('{"map": null}', '\$.map', map('a', 1, 'c', 2)); """
+    qt_sql_map """ SELECT json_set('{"map": null}', '\$.map', map('a', 1.1, 'c', 2.2)); """
+    qt_sql_map """ SELECT json_set('{"map": null}', '\$.map', map('a', 1.1, 'c', 2)); """
+    qt_sql_map """ SELECT json_set('{"map": null}', '\$.map', map('a', cast(1 as decimal), 'c', cast(1.2 as decimal))); """
+    // struct
+    qt_sql_struct """ SELECT json_set('{"struct": null}', '\$.struct', named_struct('name', 'a', 'age', 1)); """
+    qt_sql_struct """ SELECT json_set('{"struct": null}', '\$.struct', named_struct('name', 'a', 'age', 1.1)); """
+    qt_sql_struct """ SELECT json_set('{"struct": null}', '\$.struct', named_struct('name', 'a', 'age', cast(1 as decimal))); """
+    // json
+    qt_sql_json """ SELECT json_set('{"json": null}', '\$.json', cast('{\"a\":\"b\"}' as JSON)); """
+    qt_sql_json """ SELECT json_set('{"json": null}', '\$.json', cast('{\"a\":1}' as JSON)); """
+    qt_sql_json """ SELECT json_set('{"json": null}', '\$.json', cast('{\"a\":1.1}' as JSON)); """
+
+    // test with table
+    tableName = "test_query_json_set_complex"
+    sql "DROP TABLE IF EXISTS ${tableName}"
+    sql """
+            CREATE TABLE ${tableName} (
+              `k0` int(11) not null,
+              `k1` array<string> NULL,
+              `k2` map<string, string> NULL,
+              `k3` struct<name:string, age:int> NULL,
+              `k4` json NULL
+            ) ENGINE=OLAP
+            DUPLICATE KEY(`k0`)
+            COMMENT "OLAP"
+            DISTRIBUTED BY HASH(`k0`) BUCKETS 1
+            PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1",
+            "in_memory" = "false",
+            "storage_format" = "V2"
+            );
+        """
+    sql "insert into ${tableName} values(1,null,null,null,null);"
+    sql "insert into ${tableName} values(2, array('a','b'), map('a','b'), named_struct('name','a','age',1), '{\"a\":\"b\"}');"
+    sql """insert into ${tableName} values(3, array('"a"', '"b"'), map('"a"', '"b"', '"c"', '"d"'), named_struct('name','"a"','age', 1), '{\"c\":\"d\"}');"""
+    sql """insert into ${tableName} values(4, array(1,2), map(1,2), named_struct('name', 2, 'age',1), '{\"a\":\"b\"}');"""
+    sql """insert into ${tableName} values(5, array(1,2,3,3), map(1,2,3,4), named_struct('name',\"a\",'age',1), '{\"a\":\"b\"}');"""
+    qt_sql2 """select json_set('{"data": {"array": null, "map": null, "struct": null, "json": null}}', 
+                              '\$.data.array', k1, 
+                              '\$.data.map', k2, 
+                              '\$.data.struct', k3, 
+                              '\$.data.json', k4) from ${tableName} order by k0;"""
+    sql "DROP TABLE ${tableName};"
 }