SQL logic test has conditionals. So we could encode each database response
(including the one from Calcite)

On Sun, Feb 25, 2024, 3:33 PM Julian Hyde <jh...@apache.org> wrote:

> Does SQL Logic Test have an opinion about what SQRT(-1) should return?
> If Calcite is pretending to be Oracle, it should return NaN. If it is
> pretending to be MySQL it should return NULL. AFAICT, SQL Logic Test
> would regard (at most) one of those responses as correct. If it even
> covers SQRT.
>
> On Sun, Feb 25, 2024 at 12:25 PM Guillaume Masse
> <masse.guilla...@narrative.io.invalid> wrote:
> >
> > Write test with SQL logic test
> >
> > https://www.sqlite.org/sqllogictest/doc/trunk/about.wiki
> >
> > Then run those tests against each database. (This technique is called
> > oracle testing)
> >
> >
> > On Sun, Feb 25, 2024, 3:13 PM Julian Hyde <jh...@apache.org> wrote:
> >
> > > TL;DR: We need to add software engineering processes to ensure that
> > > Calcite is consistent with other SQL systems. What should those be?
> > >
> > > There has been a lot of activity recently adding functions such as
> > > LOG2 [1] and ensuring that existing functions such as LOG and SQRT [2]
> > > are consistent with other implementations. Another case was about
> > > whether Calcite should allow casting a VARCHAR to a VARBINARY [3].
> > >
> > > These discussions have been time-consuming. For example, the LOG2 PR
> > > received almost a hundred comments, and that is a function that should
> > > be simple to specify and implement. If a DB did not have LOG2, instead
> > > of LOG2(n) I would just write LOG(n) / LOG(2) and it would work.
> > >
> > > In one of the discussions a statement was made that "SQL rules say
> > > that SQRT should return NULL for negative values". I checked Oracle --
> > > the definitive SQL implementation for many years -- and its doc says
> > > that it returns NaN.
> > >
> > > In another incident[4], the TO_CHAR function was removed from the
> > > MySQL library and then added back when someone pointed out that it is
> > > present in MariaDB, and our MySQL library covers MariaDB.
> > >
> > > We just can't keep doing this. We need to quickly and efficiently
> > > arrive at the correct specification for when Calcite is attempting to
> > > emulate other SQL systems, and then we need to stay with that
> > > specification. I propose that we use software engineering.
> > >
> > > One idea is to create a Quidem script that can be run against MySQL,
> > > and passes, and when run against Calcite-pretending-to-be-MySQL, it
> > > also passes. Anyone adding to that script must test it against a MySQL
> > > instance before merging to main. And similarly for other SQL dialects.
> > >
> > > As we encounter underspecified areas - e.g. the behavior of SQRT when
> > > applied to -0 - we can resolve them by adding to that script.
> > >
> > > Does anyone have any ideas for how we can solve this using automated
> > > tools, backed by changes to our process, rather than by endless
> > > discussions?
> > >
> > > (By the way, this discussion relates to libraries (the "fun"
> > > parameter), conformance and our parser settings (the "lex" parameter,
> > > quoted and unquoted casing, etc.). We could have a similar discussion
> > > about dialects - the SQL generated by the JDBC adapter - but please
> > > let's have that discussion in another thread.)
> > >
> > > Julian
> > >
> > > [1] https://issues.apache.org/jira/browse/CALCITE-6224
> > > [2] https://issues.apache.org/jira/browse/CALCITE-5638
> > > [3] https://issues.apache.org/jira/browse/CALCITE-6210
> > > [4] https://issues.apache.org/jira/browse/CALCITE-6222
> > >
>

Reply via email to