Summary
Following the SQL Diagnostics framework introduced in v46.0.0, I'd like to extend
it to cover function argument type errors — one of the most common and confusing
error categories for end users.
Motivation
The 46.0.0 release blog explicitly noted:
"Currently, diagnostics cover unresolved table/column references, missing GROUP BY
columns, ambiguous references, wrong number of UNION columns, type mismatches, and
a few others. Future releases will extend this to more error types."
Right now, calling a function with a wrong argument type produces a generic error
with no source location:
Describe the solution you'd like
The user gets no span, no pointer to which argument is wrong, and no hint about
what type was expected. Compare this to how a missing GROUP BY column now renders
with a precise highlight in the query text — the UX gap is significant.
Proposed Change
Extend the existing Diagnostic / DiagnosticEntry framework
(datafusion/common/src/diagnostic.rs) so that when the planner/type-coercion
layer rejects a scalar function call due to argument type mismatch, the emitted
error includes:
- A
Diagnostic that attaches a source span pointing to the offending
argument expression in the original SQL query text.
- A human-readable note of the form:
"function 'sqrt' does not support argument of type Utf8 at position 1; expected a numeric type"
This matches the style and severity conventions already used in the existing
diagnostic emission sites.
Scope
Minimum viable coverage :
Out of scope for this PR :
- Aggregate or window function argument errors
- Errors arising from the wrong number of arguments (separate error path)
Files I Plan to Touch
| File |
Reason |
datafusion/sql/src/planner/expr.rs |
Where SQL AST exprs are resolved; span info is available here |
datafusion/expr/src/type_coercion/functions.rs |
Where argument type checking fires |
datafusion/common/src/diagnostic.rs |
Diagnostic / DiagnosticEntry types — read-only reference |
datafusion/sqllogictest/test_files/ |
New .slt test cases |
Questions Before I Start
-
Is this the right layer to attach spans? My reading is that expr.rs in
the planner is the right place (since the AST span is still available there),
rather than deeper in type_coercion/. Happy to be corrected.
-
Is @eliaperantoni or another committer willing to be the supervising
maintainer for this? Per the contributor guide, I want to confirm there's
someone interested in reviewing before investing significant time. I don't want
to submit a PR that sits unreviewed.
-
Any prior art or in-flight PRs I should be aware of? I searched open issues
and PRs and didn't find an active effort here, but I may have missed something.
References
Happy to iterate on scope or approach based on feedback here before writing any code.
Describe alternatives you've considered
No response
Additional context
No response
Summary
Following the SQL Diagnostics framework introduced in v46.0.0, I'd like to extend
it to cover function argument type errors — one of the most common and confusing
error categories for end users.
Motivation
The 46.0.0 release blog explicitly noted:
Right now, calling a function with a wrong argument type produces a generic error
with no source location:
Describe the solution you'd like
The user gets no span, no pointer to which argument is wrong, and no hint about
what type was expected. Compare this to how a missing GROUP BY column now renders
with a precise highlight in the query text — the UX gap is significant.
Proposed Change
Extend the existing
Diagnostic/DiagnosticEntryframework(
datafusion/common/src/diagnostic.rs) so that when the planner/type-coercionlayer rejects a scalar function call due to argument type mismatch, the emitted
error includes:
Diagnosticthat attaches a source span pointing to the offendingargument expression in the original SQL query text.
"function 'sqrt' does not support argument of type Utf8 at position 1; expected a numeric type"This matches the style and severity conventions already used in the existing
diagnostic emission sites.
Scope
Minimum viable coverage :
e.g.
SELECT sqrt('hello'),SELECT abs(true)e.g.
SELECT length(3.14)(where implicit coercion does not apply).slttest cases verifying the diagnostic text is presentin the error output for each covered case
Out of scope for this PR :
Files I Plan to Touch
datafusion/sql/src/planner/expr.rsdatafusion/expr/src/type_coercion/functions.rsdatafusion/common/src/diagnostic.rsDiagnostic/DiagnosticEntrytypes — read-only referencedatafusion/sqllogictest/test_files/.slttest casesQuestions Before I Start
Is this the right layer to attach spans? My reading is that
expr.rsinthe planner is the right place (since the AST span is still available there),
rather than deeper in
type_coercion/. Happy to be corrected.Is @eliaperantoni or another committer willing to be the supervising
maintainer for this? Per the contributor guide, I want to confirm there's
someone interested in reviewing before investing significant time. I don't want
to submit a PR that sits unreviewed.
Any prior art or in-flight PRs I should be aware of? I searched open issues
and PRs and didn't find an active effort here, but I may have missed something.
References
datafusion/common/src/diagnostic.rsHappy to iterate on scope or approach based on feedback here before writing any code.
Describe alternatives you've considered
No response
Additional context
No response