class AnalyzedCopyTo implements AnalyzedStatement {

    private final TableInfo tableInfo;
    private final Table<Symbol> table;
    private final Symbol uri;
    private final GenericProperties<Symbol> properties;
    private final List<Symbol> columns;
    @Nullable
    private final Symbol whereClause;

    AnalyzedCopyTo(TableInfo tableInfo,
                   Table<Symbol> table,
                   Symbol uri,
                   GenericProperties<Symbol> properties,
                   List<Symbol> columns,
                   @Nullable Symbol whereClause) {
        this.tableInfo = tableInfo;
        this.table = table;
        this.uri = uri;
        this.properties = properties;
        this.columns = columns;
        this.whereClause = whereClause;
    }

    public TableInfo tableInfo() {
        return tableInfo;
    }

    public Table<Symbol> table() {
        return table;
    }

    public Symbol uri() {
        return uri;
    }

    public GenericProperties<Symbol> properties() {
        return properties;
    }

    public List<Symbol> columns() {
        return columns;
    }

    @Nullable
    public Symbol whereClause() {
        return whereClause;
    }

    @Override
    public <C, R> R accept(AnalyzedStatementVisitor<C, R> analyzedStatementVisitor, C context) {
        return analyzedStatementVisitor.visitCopyToStatement(this, context);
    }

    @Override
    public void visitSymbols(Consumer<? super Symbol> consumer) {<FILL_FUNCTION_BODY>}

    @Override
    public boolean isWriteOperation() {
        return false;
    }
}

        for (var partitionProperty : table.partitionProperties()) {
            consumer.accept(partitionProperty.columnName());
            partitionProperty.expressions().forEach(consumer);
        }
        columns.forEach(consumer);
        if (whereClause != null) {
            consumer.accept(whereClause);
        }
        consumer.accept(uri);
        properties.properties().values().forEach(consumer);
    
<no_super_class>