Refactor `TypeResolver.visitMultiColumnSetComponent`

This commit is contained in:
tibotix 2023-11-17 18:15:23 +01:00
parent ff11a2a757
commit 6810cfc52d
No known key found for this signature in database
GPG Key ID: 96DF02FF50AC54C7
2 changed files with 18 additions and 8 deletions

View File

@ -142,15 +142,20 @@ class TypeResolver extends RecursiveVisitor<TypeExpectation, void> {
void visitMultiColumnSetComponent(
MultiColumnSetComponent e, TypeExpectation arg) {
visitList(e.columns, const NoTypeExpectation());
if (e.rowValue is Tuple) {
final expressions = (e.rowValue as Tuple).expressions;
for (final (idx, expression) in expressions.indexed) {
_lazyCopy(expression, e.columns.elementAtOrNull(idx));
}
} else if (e.rowValue is SubQuery) {
// TODO: handle subquery case
final targets = e.resolvedTargetColumns ?? const [];
for (final column in targets) {
_handleColumn(column, e);
}
visit(e.rowValue, const NoTypeExpectation());
final expectations = targets.map((r) {
if (r != null && session.graph.knowsType(r)) {
return ExactTypeExpectation(session.typeOf(r)!);
}
return const NoTypeExpectation();
}).toList();
visit(e.rowValue, SelectTypeExpectation(expectations));
}
@override

View File

@ -112,6 +112,11 @@ class MultiColumnSetComponent extends SetComponent {
// Will be either Tuple or SubQuery
Expression rowValue;
List<Column?>? get resolvedTargetColumns {
if (columns.isEmpty) return null;
return columns.map((c) => c.resolvedColumn).toList();
}
MultiColumnSetComponent({required this.columns, required this.rowValue});
@override