Skip to content

DataFrame parse_sql_expr does not handle aliases #12518

Description

@milenkovicm

Describe the bug

df.parse_sql_expr does not handle expression aliases, for expressions like

df.parse_sql_expr("col0 as new_col0")

it will return col(col0`) expression

To Reproduce

statement

df.parse_sql_expr("SUM(int_col) as sum_int_col")

from

"| double_col | sum(?table?.int_col) |",

can be used to demonstrate this issue

as return column has sum(?table?.int_col) as the name

Expected behavior

it is expected to have expression alias handled

Additional context

No response

Activity

  1. Eason0729 commented on Sep 23, 2024

    @Eason0729
    Contributor

    I spent some time on tracing code but found unable to fix it.
    Maybe we need to change some code in sqlparser, correct me if I am wrong.

    Detail To be specific, I run following with debugger attached
    let df = ctx.sql("SELECT 1 as col0").await?;
    let expr = df.parse_sql_expr("1 + 3 * col0 as new_col0")?;
    

    And found this line, whose value return from sqlparser to be following.

    It doesn't contain new_col0.

    BinaryOp { left: Value(Number("1", false)), op: Plus, right: BinaryOp { left: Value(Number("3", false)), op: Multiply, right: Identifier(Ident { value: "col0", quote_style: None }) } }
    
  2. Eason0729 commented on Sep 23, 2024

    @Eason0729
    Contributor
  3. milenkovicm commented on Sep 23, 2024

    @milenkovicm
    ContributorAuthor

    I think you're right @Eason0729 I did not have much time to investigate but initial investigation lead to sqlparser

  4. Eason0729 commented on Sep 24, 2024

    @Eason0729
    Contributor

    There is a private method parse_expr_with_alias in sqlparser, which returns ExprWithAlias.

    I would propose changing the return type from sqlparser::ast::Expr on call path to sqlparser::ast::ExprWithAlias, use enum datafusion_expr::expr::Expr::Alias in return type.

    Writing a example change might be better if more description in needed

    This could cause other method to change(including some public methods on SessionState).

    If above is okay, I would begin working on it.

  5. milenkovicm commented on Sep 24, 2024

    @milenkovicm
    ContributorAuthor

    parse_sql_expr returns expression, alias is an expression, why would you need to change public method in SessionState?

  6. Eason0729 commented on Sep 24, 2024

    @Eason0729
    Contributor

    Mainly because it could be done without changing sqlparser.

    I think I should start writing code right away, as it would be better to communicate with code.

    I would do it in my fork and let you know when I am ready, then I might learn how to do it without changing public method in SessionState.

  7. Eason0729 commented on Sep 25, 2024

    @Eason0729
    Contributor

    I just finish it in my fork.

    It's not meant to be a pull request, just to showcase what I would like to change.

    Here is the public API I change: diff

    Also, I change sqlparser of my fork to make Parser::parse_expr_with_alias public: https://github.com/Eason0729/sqlparser-rs/commit/c6360b159f9e9baade08ab2e4d7a12083d24a567

  8. milenkovicm commented on Sep 26, 2024

    @milenkovicm
    ContributorAuthor

    It does look good, @Eason0729.
    maybe @alamb and @comphead can give you better advice than me when they get some time

  9. Eason0729 commented on Sep 26, 2024

    @Eason0729
    Contributor

    Okay, then I will remove thing that doesn't belong to pull request and submit pull request.

  10. alamb commented on Sep 26, 2024

    @alamb
    Contributor
  11. Eason0729 commented on Sep 27, 2024

    @Eason0729
    Contributor

    Let's wait for apache/datafusion-sqlparser-rs#1444, then I will submit a PR for datafusion.

  12. alamb commented on Sep 28, 2024

    @alamb
    Contributor

    Thank you @Eason0729 -- we'll try and release a sqlparser release shortly

  13. milenkovicm commented on Nov 1, 2024

    @milenkovicm
    ContributorAuthor

    Hey @Eason0729 any interested in continuing this issue?

  14. Eason0729 commented on Nov 2, 2024

    @Eason0729
    Contributor

    @milenkovicm
    Yes, I am interested in working on this issue.

    I am waiting for next release of sqlparser, so parse_expr_with_alias method on sqlparser::parser::Parser can be make public.

  15. milenkovicm commented on Nov 2, 2024

    @milenkovicm
    ContributorAuthor

    My bad, I thought it's released

  16. alamb commented on Nov 4, 2024

    @alamb
    Contributor

    My bad, I thought it's released

    It is on my queue: apache/datafusion-sqlparser-rs#1423

  17. Eason0729 commented on Nov 17, 2024

    @Eason0729
    Contributor

    I just see sqlparser release 0.52.0. (which was released 6 days ago 😄 )

    I will start working on that tomorrow.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions