private FieldReference getHelperColumn(Fill node, Scope scope, FillPolicy fillMethod) {
      FieldReference helperColumn;
      if (node.getTimeColumnIndex().isPresent()) {
        helperColumn =
            getFieldReferenceForTimeColumn(node.getTimeColumnIndex().get(), scope, fillMethod);
      } else {
        // if user doesn't specify the index of helper column, we use first column whose data type
        // is TIMESTAMP instead.
        int index = -1;
        for (Field field : scope.getRelationType().getVisibleFields()) {
          if (isTimestampType(field.getType())) {
            index = scope.getRelationType().indexOf(field);
            break;
          }
        }
        if (index == -1) {
          throw new SemanticException(
              String.format(
                  "Cannot infer TIME_COLUMN for %s FILL, there exists no column whose type is TIMESTAMP",
                  fillMethod.name()));
        }
        helperColumn = new FieldReference(index);
      }
      return helperColumn;
    }
Check if there is Columns function in expression, and verify they are same if there are multi
Column functions.

@param expression input expression
@return if there is Columns function in expression
@throws SemanticException if there are multi Columns functions but different
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java