Skip to content

Commit 03afbf6

Browse files
committed
feat: UNION wrong number of fields diagnostics
1 parent cdee494 commit 03afbf6

File tree

1 file changed

+37
-5
lines changed

1 file changed

+37
-5
lines changed

datafusion/expr/src/logical_plan/builder.rs

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,11 @@ use arrow::datatypes::{DataType, Field, Fields, Schema, SchemaRef};
5252
use datafusion_common::display::ToStringifiedPlan;
5353
use datafusion_common::file_options::file_type::FileType;
5454
use datafusion_common::{
55-
exec_err, get_target_functional_dependencies, internal_err, not_impl_err, plan_datafusion_err, plan_err, Column, DFSchema, DFSchemaRef, DataFusionError, FieldsSpans, FunctionalDependencies, Result, ScalarValue, TableReference, ToDFSchema, UnnestOptions
55+
exec_err, get_target_functional_dependencies, internal_err, not_impl_err,
56+
plan_datafusion_err, plan_err, Column, DFSchema, DFSchemaRef, DataFusionError,
57+
Diagnostic, DiagnosticEntry, DiagnosticEntryKind, FieldsSpans,
58+
FunctionalDependencies, Result, ScalarValue, TableReference, ToDFSchema,
59+
UnnestOptions,
5660
};
5761
use datafusion_expr_common::type_coercion::binary::type_union_resolution;
5862

@@ -1436,9 +1440,12 @@ pub fn build_join_schema(
14361440
join_type,
14371441
left.fields().len(),
14381442
);
1439-
let left_fields_spans: FieldsSpans = left.iter().map(|(_, _, spans)| spans).cloned().collect();
1440-
let right_fields_spans: FieldsSpans = right.iter().map(|(_, _, spans)| spans).cloned().collect();
1441-
let fields_spans = left_fields_spans.join(&right_fields_spans, join_type, left.fields().len());
1443+
let left_fields_spans: FieldsSpans =
1444+
left.iter().map(|(_, _, spans)| spans).cloned().collect();
1445+
let right_fields_spans: FieldsSpans =
1446+
right.iter().map(|(_, _, spans)| spans).cloned().collect();
1447+
let fields_spans =
1448+
left_fields_spans.join(&right_fields_spans, join_type, left.fields().len());
14421449
let metadata = left
14431450
.metadata()
14441451
.clone()
@@ -1526,7 +1533,32 @@ pub fn union(left_plan: LogicalPlan, right_plan: LogicalPlan) -> Result<LogicalP
15261533
left has {} columns whereas right has {} columns",
15271534
left_plan.schema().fields().len(),
15281535
right_plan.schema().fields().len()
1529-
);
1536+
)
1537+
.map_err(|err| {
1538+
err.with_diagnostic(|_| {
1539+
Diagnostic::new([
1540+
DiagnosticEntry::new(
1541+
"UNION queries have different number of columns",
1542+
DiagnosticEntryKind::Error,
1543+
Span::empty(),
1544+
),
1545+
DiagnosticEntry::new(
1546+
format!("This side has {} columns", left_plan.schema().fields().len()),
1547+
DiagnosticEntryKind::Note,
1548+
Span::union_iter(
1549+
left_plan.schema().fields_spans().iter().flatten().copied(),
1550+
),
1551+
),
1552+
DiagnosticEntry::new(
1553+
format!("This side has {} columns", right_plan.schema().fields().len()),
1554+
DiagnosticEntryKind::Note,
1555+
Span::union_iter(
1556+
right_plan.schema().fields_spans().iter().flatten().copied(),
1557+
),
1558+
),
1559+
])
1560+
})
1561+
});
15301562
}
15311563

15321564
// Temporarily use the schema from the left input and later rely on the analyzer to

0 commit comments

Comments
 (0)