Skip to content

Extend SQL Diagnostics: Attach Source Spans to Function Argument Type Errors #22131

@satwikmishra11

Description

@satwikmishra11

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:

SELECT sqrt('hello');

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:

  1. A Diagnostic that attaches a source span pointing to the offending
    argument expression in the original SQL query text.
  2. 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 :

  • Math functions called with a non-numeric argument
    e.g. SELECT sqrt('hello'), SELECT abs(true)
  • String functions called with a non-string argument
    e.g. SELECT length(3.14) (where implicit coercion does not apply)
  • Sqllogictest .slt test cases verifying the diagnostic text is present
    in the error output for each covered case
  • No regression in existing tests

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

  1. 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.

  2. 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.

  3. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request
    No fields configured for Feature.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions