class AnalyzedUpdateStatement implements AnalyzedStatement {

    private final AbstractTableRelation<?> table;
    private final LinkedHashMap<Reference, Symbol> assignmentByTargetCol;
    private final Symbol query;

    /**
     * List of values or expressions used to be retrieved from the updated rows.
     */
    @Nullable
    private final List<Symbol> returnValues;

    public AnalyzedUpdateStatement(AbstractTableRelation<?> table,
                                   LinkedHashMap<Reference, Symbol> assignmentByTargetCol,
                                   Symbol query,
                                   @Nullable List<Symbol> returnValues) {
        this.table = table;
        this.assignmentByTargetCol = assignmentByTargetCol;
        this.query = query;
        this.returnValues = returnValues;
    }

    public AbstractTableRelation<?> table() {
        return table;
    }

    public LinkedHashMap<Reference, Symbol> assignmentByTargetCol() {
        return assignmentByTargetCol;
    }

    public Symbol query() {
        return query;
    }

    @Nullable
    @Override
    public List<Symbol> outputs() {
        return returnValues;
    }

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

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

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

        consumer.accept(query);
        for (Symbol sourceExpr : assignmentByTargetCol.values()) {
            consumer.accept(sourceExpr);
        }
        if (returnValues != null) {
            for (Symbol returningSymbol : returnValues) {
                consumer.accept(returningSymbol);
            }
        }
    
<no_super_class>