If you're looking for a "translate X-to-Y dialect of SQL" tool, jOOQ does
this fairly well.

What you have to do is parse the string of SQL into a jOOQ query AST, then
render it using a different SQL dialect.
You can experiment with the results of this online here:

Format, pretty print, and translate your SQL from one dialect to another
(jooq.org) <https://www.jooq.org/translate/>

jOOQ requires a paid license for commercial SQL dialects like Oracle and
MS-SQL, though.

Hope this helps.

On Sun, Nov 26, 2023 at 4:29 PM Julian Hyde <jh...@apache.org> wrote:

> Creating a high-quality Oracle to MySQL translator is a large task.
> Calcite doesn't do it. In fact there is only one way to do it: spend a
> considerable effort writing a large suite of compliance tests. Once
> you have built that suite, getting the translator to pass that suite
> is relatively easy.
>
> I do believe that Calcite is a very good basis for that translator. We
> have decomposed Calcite's functionality into areas such as lexical
> differences (backticks versus double quotes around identifiers),
> differences in type system (what does the TIMESTAMP type mean?),
> differences in operator set (is there an NVL function?), and
> differences in code generator (what syntax for LIMIT-OFFSET does this
> DBMS support?). The net result is that when you fix a bug in your
> Oracle-to-MySQL translator, you likely fix a bug in my
> Oracle-to-Postgres translator, or at least you don't make it worse.
>
> Therefore we can pool our efforts. You just need to write that test
> suite, because no one is going to write it for you.
>
> Julian
>
>
> On Fri, Nov 24, 2023 at 3:05 PM Mihai Budiu <mbu...@gmail.com> wrote:
> >
> > This is a complicated question.
> >
> > Calcite is a framework with many components which you can assemble to
> build various translators, including source-to-source translators. But some
> components make program transformations that assume a certain semantics,
> which may not coincide with either Oracle or MySQL. For example, Calcite
> assumes that division with zero will cause a runtime exception, while MySQL
> and Oracle both assume that it returns NULL. This is part of the type
> inference rules of Calcite, and it's a fairly basic component.
> >
> > So if you use Calcite for compiling arithmetic expressions with division
> of non-nullable arguments, the result is non-nullable in Calcite, but
> nullable in either of these frameworks. Moreover, if you use Calcite's
> optimizer to simplify expressions that divide by 0, you may produce
> programs that give you different results. (There are ways you can override
> this behavior of Calcite if you really want to)
> >
> > This is just one example, but the problem with SQL dialects is that they
> have very subtle different semantics, so it may be actually very difficult
> to translate a program from one database dialect to another while
> preserving bit-exact results. I am assuming that this is the goal: produce
> the same results given the same input data and queries. If this is not the
> goal, you have to specify what relationship you expect between the original
> program and the translated program.
> >
> > There may be a nice well-behaved subset of SQL on which this is
> possible, but I am very skeptical, since the SQL standard does not even
> specify the meaning of very basic operations, like how rounding is done
> when converting decimals to integers.
> >
> > Mihai
> >
> > ________________________________
> > From: Julian Hyde <jh...@apache.org>
> > Sent: Friday, November 24, 2023 1:39 PM
> > To: dev@calcite.apache.org <dev@calcite.apache.org>
> > Subject: Re: Can calcite translate Oracle SQL to MySQL
> >
> > In general, yes. But I don't think there's any code to handle Oracle's
> > ROWNUM system column. Please log a jira case requesting to translate
> > ROWNUM.
> >
> > Cases https://issues.apache.org/jira/browse/CALCITE-5723 and
> > https://issues.apache.org/jira/browse/CALCITE-1786 are related, but
> > not what you are asking for.
> >
> > On Fri, Nov 24, 2023 at 12:40 AM Louis Hust <louis.h...@gmail.com>
> wrote:
> > >
> > > Hi all,
> > >
> > > Can calcite translate oracle sql to mysql ?
> > >
> > > Such as oracle: select * from t1 whre rownum < 10
> > > To  mysql: select * from t1 limit 9;
>

Reply via email to