If I do a "create table as select 2" in my database, it creates a TINYINT
column.  I hope that answers your question.   So I need the RelDataType to
be of type TINYINT

I do have a mechanism to deal with this in my current code a little bit
similar to what you're suggesting (I won't go into it, but it works, it's
'shuttle-ish' and at RelNode time).  But a shuttle seems like a hack, no?

Anyway, I might develop this in the future to get rid of my hack, but just
wanted to bring it up.

The DECIMAL issue was really my main problem, but I see you specifically
dealt with this in 1.38 with this jira:
https://issues.apache.org/jira/browse/CALCITE-3522.   Heh, I didn't think
to look in the latest version since the original comment was dated from
2006 and I was one version off from the most recent version.  So thanks for
that fix!

Thanks for your help!

On Mon, Dec 9, 2024 at 11:45 AM Mihai Budiu <mbu...@gmail.com> wrote:

> Why is 2 a TINYINT and not an INTEGER?
> What is the type of 128?
>
> If the only problem is the literals, you can probably fix it by writing a
> SqlShuttle which inserts appropriate casts for literals, converting the
> SqlLiteral with value 2 to a CAST(2 AS TINYINT).
>
> Mihai
>
> ________________________________
> From: Stephen Carlin <scar...@cloudera.com.INVALID>
> Sent: Monday, December 9, 2024 11:36 AM
> To: dev@calcite.apache.org <dev@calcite.apache.org>
> Subject: Re: literal "type" issues in my database
>
> Sorry, lemme try to explain further...
>
> I am a Java developer working on a database that is trying to use the
> Calcite library. There is no other system I'm interacting with.  I am using
> Calcite to parse, validate, and optimize my sql query.
>
> We have branched off our own version of Parser.jj and running with the
> Calcitte library to generate the whole SqlNode tree.  After the SqlNode
> tree gets generated, we use the RelNodeConverter and are generating
> RelNodes, and doing all sorts of optimizations on top of that.
>
> I've debugged this several months ago, but the RelDataType that is created
> when the number 2 is seen in the parser (and goes through the parser and
> validator and RelNodeConverter) is coming out with a type of
> SqlTypeName.INTEGER.  This doesn't match what my system expects, since we
> prefer a SqlTypeName.TINYINT
>
> I can change Parser.jj and potentially create my one SqlNumericLiteral
> derivation (another thing I can change), but that doesn't help because
> certain static methods within the Calcite library will bring it back to
> whatever Calcite's default SqlNumericLiteral is.
>
> I am an ac
>
> On Mon, Dec 9, 2024 at 11:26 AM Mihai Budiu <mbu...@gmail.com> wrote:
>
> > You didn't answer my question about what you are trying to achieve.
> >
> > You say "I need...". Why do you need that? And I suspect you don't need
> it
> > yourself, but some other system you interact with expects something
> > particular. What are the fixed points in your system, and what can be
> > changed?
> >
> > Mihai
> >
> > ________________________________
> > From: Stephen Carlin <scar...@cloudera.com.INVALID>
> > Sent: Monday, December 9, 2024 11:20 AM
> > To: dev@calcite.apache.org <dev@calcite.apache.org>
> > Subject: Re: literal "type" issues in my database
> >
> > My general issue though still stands though?  I'll test out my code with
> > 1.38 and see how that goes.
> >
> > But ultimately, the validator is forcing a literal type on me that
> doesn't
> > match what my database has (as of 1.37).
> >
> > Explicit casting is irrelevant for me.  I'm trying to parse an end
> > user's SQL statement which doesn't have a cast.
> >
> > For instance, if I parse the number "2", Calcite is creating this as a
> > RelDataType.INTEGER.  This doesn't match my needs, since I need this as a
> > RelDataType.TINYINT.  This is forcing me to change the type at some
> point.
> >
> > While that one might be easily fixable, my second one is not.  Calcite is
> > creating "hello" as a char(5).  I need it as a VARCHAR(<max bigint>)
> (which
> > I use for String type).
> >
> > On Mon, Dec 9, 2024 at 11:12 AM Stephen Carlin <scar...@cloudera.com>
> > wrote:
> >
> > > Oh my.
> > >
> > > I am running on 1.37.
> > >
> > > I see that you have made a change 5 months ago in github.  That might
> > > help!  Thanks!
> > >
> > > On Mon, Dec 9, 2024 at 10:52 AM Mihai Budiu <mbu...@gmail.com> wrote:
> > >
> > >> What are you trying to achieve?
> > >>
> > >> Indeed, today the Calcite parser assumes that numeric literals with an
> > >> exponent are floating point.
> > >>
> > >> I don't think the standard mandates a specific type based on the
> syntax
> > >> of the literal.
> > >>
> > >> I am pretty sure Calcite can parse literals above Long.MAX_VALUE,
> since
> > >> some Decimal literals may be larger.
> > >> After parsing all literals are stored as Java BigDecimal value, which
> > has
> > >> unbounded precision.
> > >>
> > >> In general, if you want a specific type for a SQL expression, you
> should
> > >> write it down explicitly in the code, using a CAST. The rules for
> > implicit
> > >> casts are also unspecified and vary from database to database.
> > >>
> > >> Mihai
> > >>
> > >> ________________________________
> > >> From: Stephen Carlin <scar...@cloudera.com.INVALID>
> > >> Sent: Monday, December 9, 2024 10:40 AM
> > >> To: dev@calcite.apache.org <dev@calcite.apache.org>
> > >> Subject: literal "type" issues in my database
> > >>
> > >> Hi,
> > >>
> > >> I'm having some literal type issues when trying to use Calcite with my
> > >> database.  I have quite a few of them, and I thought perhaps it was my
> > >> database not dealing with the SQL standard correctly, but the latest
> > one I
> > >> hit seems, well, inconsistent within Calcite.
> > >>
> > >> When I run the literal 123.45 through Calcite, it is producing a
> decimal
> > >> type for me, which is fine.  However, if I pass in the literal 1e32
> > >> through
> > >> Calcite, it gives me a double.
> > >>
> > >> I noticed a comment somewhere which states Calcite cannot handle
> > integers
> > >> over the bigint max.  The comment was from 2006, so it doesn't look
> like
> > >> it
> > >> will be addressed anytime soon?
> > >>
> > >> Has anyone dealt with this? If so, how did you handle it?
> > >>
> > >> I'm not sure this can be handled well.  I did try to change the parser
> > to
> > >> create my own NumericLiteral.  However, when I used a negative integer
> > out
> > >> of range, it used a static SqlLiteral create function embedded in the
> > >> Calcite jar file and had similar issues.
> > >>
> > >> I do have a hack around this in my code that gets around this
> > >> post-validation time, so I won't be addressing this in Calcite in the
> > near
> > >> future, but has anyone thought about this in general?
> > >>
> > >> I should also mention (since I alluded to it at the beginning of my
> > >> message) that my database treats char literals as a "varchar(maxint)"
> > type
> > >> (Calcite treats it as char) and tinyints like "2" as a tinyint
> (calcite
> > >> treats this as int).
> > >>
> > >> Thanks,
> > >>
> > >> Steve
> > >>
> > >
> >
>

Reply via email to