private List<Field> analyzeTableOutputFields(
        final Table table, final QualifiedObjectName tableName, final TableSchema tableSchema) {
      // TODO: discover columns lazily based on where they are needed (to support connectors that
      // can't enumerate all tables)
      ImmutableList.Builder<Field> fields = ImmutableList.builder();
      for (ColumnSchema column : tableSchema.getColumns()) {
        Field field =
            Field.newQualified(
                table.getName(),
                Optional.of(column.getName()),
                column.getType(),
                column.getColumnCategory(),
                column.isHidden(),
                Optional.of(tableName),
                Optional.of(column.getName()),
                false);
        fields.add(field);
        analysis.addSourceColumns(
            field, ImmutableSet.of(new Analysis.SourceColumn(tableName, column.getName())));
      }
      return fields.build();
    }
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