Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

There is a very narrow subset of expressions that already follow this guideline. If an expression comes from the Planner and is backed by a `RexNode` it can be serialized to its SQL representation: https://github.com/apache/flink/blob/fa0dd3559e9697e21795a2634d8d99a0b7efdcf3/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/delegation/ParserImpl.java#L118


Example:

Code Block
env.from("customers")
                        .filter($("gender").isNotNull())
                        .filter($("has_newsletter").isEqual(true))
                        .filter($("date_of_birth").isGreaterOrEqual(LocalDate.parse("1980-01-01")))
                        .select(
                                $("name").upperCase(),
                                $("date_of_birth"))

results in:

Code Block
Project: (projections: [upper(name), date_of_birth, AddressNormalizer(street, zip_code, city)])
    Filter: (condition: [greaterThanOrEqual(date_of_birth, 1980-01-01)])
        Filter: (condition: [equals(has_newsletter, true)])
            Filter: (condition: [isNotNull(gender)])
                CatalogTable: (identifier: [default_catalog.default_database.customers], fields: [name, date_of_birth, street, zip_code, city, gender, has_newsletter])

which would get translated into a SQL:

Code Block
SELECT upper(name), date_of_birth FROM (
    SELECT * FROM (
        SELECT * FROM (
            SELECT * FROM ( 
                SELECT name, date_of_birth, street, zip_code, city, gender, has_newsletter FROM `default_catalog`.`default_database`.`customers`;
            ) WHERE gender IS NOT NULL
        ) WHERE has_newsletter = true
    ) WHERE date_of_birth >= 1980-01-01
) 


Functions requiring special syntax

...