@Override
  public String getOutputSymbolInternal() {
    StringBuilder builder = new StringBuilder();
    if (!expressions.isEmpty()) {
      builder.append(expressions.get(0).getOutputSymbol());
      for (int i = 1; i < expressions.size(); ++i) {
        builder.append(", ").append(expressions.get(i).getOutputSymbol());
      }
    }
    if (!functionAttributes.isEmpty()) {
      // Some built-in scalar functions may have different header.
      if (BuiltinScalarFunction.contains(functionName)) {
        BuiltInScalarFunctionHelperFactory.createHelper(functionName)
            .appendFunctionAttributes(!expressions.isEmpty(), builder, functionAttributes);
      } else {
        appendAttributes(!expressions.isEmpty(), builder, functionAttributes);
      }
    }
    return functionName + "(" + builder + ")";
  }
example: select udf(a, b, udf(c)) from root.sg.d;

<p>3 expressions [root.sg.d.a, root.sg.d.b, udf(root.sg.d.c)] will be in this field.
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/multi/FunctionExpression.java