For the custom equality I'd expect a few concrete implementations out of
all the cartesian product of all data types, that's why I was suggesting to
make the typing explicit with some custom functions with the right
overloaded signatures.

What I wanted to say is that I agree that we might be overdoing with
syntactical transformations, but I am not sure we can or should avoid
supporting implicit casts.

On Mon, 10 Mar 2025 at 17:19, Mihai Budiu <mbu...@gmail.com> wrote:

> If you have 20 different base types and you allow any pairwise
> comparisons, then you have to consider 400 functions just for equality,
> which decide what happens for every pair of types. Since Calcite supports
> parameterized types (e.g., TIME(3)) and generic types (like arrays or
> maps), the number of types supported is really unbounded.
>
> Coercion drastically reduces the complexity of the implementation. But
> indeed, coercion is not necessarily required; it is just part of a hygienic
> language design.
>
> Calcite is statically typed; other SQL dialects, such as sqlite are
> dynamically-typed, where the type of an expression is sometimes decided at
> runtime, based on the value of operands.
>
> Mihai
>
> ________________________________
> From: Alessandro Solimando <alessandro.solima...@gmail.com>
> Sent: Monday, March 10, 2025 9:03 AM
> To: dev@calcite.apache.org <dev@calcite.apache.org>
> Subject: Re: Questions Regarding Type Coercion and CAST Transformations in
> SqlValidator and RexBuilder
>
> The SQL standard hints into implicit casts into several places but it is
> not 100% explicit about it (no pun intended).
>
> For instance, "4.11 Data conversions" in Part 2 (2011 edition) states:
>
> > Implicit type conversion can occur in expressions, fetch operations,
> > single row select operations, inserts, deletes,
> > and updates.
>
> Explicit type conversions can be specified by the use of the CAST operator.
> > A CAST operator defines how values of a source data type are converted
> > into a value of a target data type according to the Syntax Rules and
> General
> > Rules of Subclause 6.13, “<cast specification>”.
>
>
> If my understanding is correct, if you provide an ambiguous expression,
> it's to be expected that the validator will have to resolve it to
> accomplish its task, and I agree with Mihai on that part.
>
> We have explicit CAST to force something different than what the validator
> would do by itself, and that's generally enough.
>
> For a system having an EQUALS function accepting parameters of different
> types, I'd expect it to be a separate function from the "standard" one,
> maybe registered as a user-defined function, so again there would be no
> ambiguity at validation time?
>
> Concerning the transformations like translating to CASE, I agree that it
> should be configurable.
>
> I think that historically we have those transformations in place to
> restrict the syntactical variants on expressions, as we are finally
> manipulating and matching expressions syntactically other than semantically
> (similar considerations arise often for the IN -> OR translation and
> similar), but it's true that for cases like that of Matthew we might be too
> constraining.
>
> Best regards,
> Alessandro
>
> On Sat, 8 Mar 2025 at 20:08, Steven Phillips <ste...@dremio.com.invalid>
> wrote:
>
> > I think it's reasonable for a system to not want these transformations. A
> > given execution engine could choose to implement  an EQUALS function
> > between the two different types, rather than using implicit cast. Also,
> for
> > use cases like Matthew's, it seems reasonable that we could configure
> > SqlValidator and SqlToRel to not do any type coercion.
> >
> > On Sat, Mar 8, 2025 at 10:18 AM Mihai Budiu <mbu...@gmail.com> wrote:
> >
> > > Yes, these transformations are essential for compiling programs,
> because
> > > they make the program's meaning unambiguous. Consider your example
> where
> > > you check equality between two columns of different types A and B.  The
> > > meaning of the program is very different depending on what casts are
> > > inserted:
> > >
> > > a = b
> > >
> > > Can be interpreted as
> > >
> > > (B)a = b
> > >
> > > or as
> > >
> > > a = (A)b
> > >
> > > These will give different results in some cases. The Validator makes it
> > > clear what the choice of the compiler is.
> > >
> > > Mihai
> > >
> > > ________________________________
> > > From: Matthew McMillian <matthewgmcmill...@gmail.com>
> > > Sent: Friday, March 7, 2025 10:34 PM
> > > To: dev@calcite.apache.org <dev@calcite.apache.org>
> > > Subject: Questions Regarding Type Coercion and CAST Transformations in
> > > SqlValidator and RexBuilder
> > >
> > > Hi Calcite community,
> > >
> > > I'm using Calcite to analyze SQL queries and have encountered some
> issues
> > > with transformations that interfere with my use case. I hope the
> > community
> > > can provide guidance.
> > >
> > > My current workflow:
> > >
> > >    1. Parse the query into a SqlNode.
> > >    2. Validate the SqlNode using SqlValidator (callRewrite=false),
> > applying
> > >    type coercion and other transformations.
> > >    3. Walk the validated SqlNode to perform custom validation, using
> > >    SqlValidator and SqlValidatorScope for column resolution.
> > >    4. Convert the SqlNode to a RelNode.
> > >    5. Walk the RelNode for further custom validation.
> > >
> > > For my use case, I care deeply about the original syntax of the query.
> I
> > > need to preserve the original query structure rather than an equivalent
> > > transformation. Steps #2 and #4 introduce changes that create
> challenges.
> > > For example, a comparison between two columns of different types.
> > >
> > >    - <bool_column> = <int_column> is rewritten in step #2 as
> > > CAST(<bool_column>
> > >    AS INT) = <int_column> (AbstractTypeCoercion
> > >    <
> > >
> >
> https://github.com/apache/calcite/blob/main/core/src/main/java/org/apache/calcite/sql/validate/implicit/AbstractTypeCoercion.java#L157
> > > >
> > >    ).
> > >    - In step #4, it further transforms into CASE(IS NOT
> > >    NULL(<bool_column>), CASE(<bool_column>, 1, 0), null) (RexBuilder
> > >    <
> > >
> >
> https://github.com/apache/calcite/blob/main/core/src/main/java/org/apache/calcite/rex/RexBuilder.java#L940
> > > >
> > >    ).
> > >
> > > I have two questions:
> > >
> > >    1. Are the aforementioned types of transformations essential for
> > >    Calcite to compile queries? Is there a way to disable them while
> still
> > >    compiling queries?
> > >    2. Is my current approach reasonable, or is there a better way to
> > >    achieve my goal within Calcite?
> > >
> > >
> > > Any insights would be greatly appreciated.
> > >
> > > Thanks,
> > > Matthew McMillian
> > >
> >
>

Reply via email to