@Muhammad Gelbana,I think you just register an alias-name 'TEXT' for the
SqlType  'VARCHAR'.
The parser did the right thing here, see
https://github.com/apache/calcite/blob/9721283bd0ce46a337f51a3691585cca8003e399/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java#L1566
When the parser encountered a 'text' SqlIdentifier, it would get the type
from the rootSchema, the type was SqlTypeName.VARCHAR here , that you
registered before.
If you really need a new sqlType named 'text' rather than an alias-name, I
guess you need to introduce a new kind of SqlTypeName .




Muhammad Gelbana <[email protected]> 于2019年6月3日周一 下午6:54写道:

> Is that different from what I mentioned in my Jira comment ? Here it is
> again:
>
> Connection connection = DriverManager.getConnection("jdbc:calcite:", info);
>
> connection.unwrap(CalciteConnection.class).getRootSchema().unwrap(CalciteSchema.class).add("
> *TEXT*", new RelProtoDataType() {
>
>             @Override
>             public RelDataType apply(RelDataTypeFactory factory) {
>                 return
> factory.createTypeWithNullability(factory.createJavaType(String.class),
> false);
>                 // return
>
> factory.createTypeWithNullability(factory.createSqlType(SqlTypeName.VARCHAR),
> false); // Has the same effect
>             }
>         });
>
> This still returns a column type name of VARCHAR, not *TEXT*.
>
> I tried providing the type through the model as the UdtTest does but it's
> giving me the same output.
>
> Thanks,
> Gelbana
>
>
> On Mon, Jun 3, 2019 at 9:59 AM Julian Hyde <[email protected]> wrote:
>
> > User-defined types are probably the way to go.
> >
> > > On Jun 2, 2019, at 8:28 PM, Muhammad Gelbana <[email protected]>
> > wrote:
> > >
> > > That was my first attempt and it worked, but Julian pointed out that I
> > can
> > > support a type without modifying the parser (which I prefer) but I
> > couldn't
> > > get it to return the column type name as I wish.
> > >
> > > Thanks,
> > > Gelbana
> > >
> > >
> > > On Mon, Jun 3, 2019 at 3:13 AM Yuzhao Chen <[email protected]>
> wrote:
> > >
> > >> You don’t need to, just define a new type name in parser[1] and
> > translate
> > >> it to VARCHAR is okey.
> > >>
> > >> [1]
> > >>
> >
> https://github.com/apache/calcite/blob/b0e83c469ff57257c1ea621ff943ca76f626a9b7/server/src/main/codegen/config.fmpp#L375
> > >>
> > >> Best,
> > >> Danny Chan
> > >> 在 2019年6月3日 +0800 AM6:09,Muhammad Gelbana <[email protected]>,写道:
> > >>> That I understand now. But how can I support casting to TEXT and
> having
> > >> the
> > >>> returned column type name as TEXT (ie. Not VARCHAR) ?
> > >>>
> > >>> Thanks,
> > >>> Gelbana
> > >>>
> > >>>
> > >>> On Sun, Jun 2, 2019 at 7:41 PM Julian Hyde <[email protected]> wrote:
> > >>>
> > >>>> The parser should only parse, not validate. This is a very important
> > >>>> organizing principle for the parser.
> > >>>>
> > >>>> If I write “x :: text” or “x :: foo” it is up to the type system
> > >>>> (implemented in the validator and elsewhere) to figure out whether
> > >> “text”
> > >>>> or “foo” are valid types.
> > >>>>
> > >>>> Logically, “x :: foo” is the same as “CAST(x AS foo)”. The parser
> > >> should
> > >>>> produce the same SqlCall in both cases. Then the parser’s job is
> done.
> > >>>>
> > >>>> Julian
> > >>>>
> > >>>>
> > >>>>> On Jun 2, 2019, at 6:42 AM, Muhammad Gelbana <[email protected]>
> > >>>> wrote:
> > >>>>>
> > >>>>> I'm trying to support the PostgreSQL TEXT type[1]. It's basically a
> > >>>> VARCHAR.
> > >>>>>
> > >>>>> As Julian mentioned in his comment on Jira, I don't need to define
> a
> > >>>>> keyword to achieve what I need so I tried exploring that and here
> is
> > >>>> what I
> > >>>>> observed so far:
> > >>>>>
> > >>>>> 1. If I define a new keyword in the parser, I face no trouble
> > >> whatsoever
> > >>>>> except for the numerous wiring I need to do for RexToLixTranslator,
> > >>>>> JavaTypeFactoryImpl, SqlTypeAssignmentRules and SqlTypeName. I
> won't
> > >> be
> > >>>>> suprised if I'm missing anything but doing what I did at first
> > >> managed to
> > >>>>> get my queries through.
> > >>>>>
> > >>>>> 2. If I define the type by plugging it in through the root schema,
> I
> > >> face
> > >>>>> two problems: a) The field cannot be declared as nullable because
> the
> > >>>> query
> > >>>>> I'm using for testing gets data from (VALUES()) which doesn't
> produce
> > >>>> null
> > >>>>> values, so an exception is thrown. b) The returned column type name
> > >> is
> > >>>>> VARCHAR (although I delcared the new plugged type name to be TEXT),
> > >> the
> > >>>>> returned type number is valid though (Types.VARCHAR = 12)
> > >>>>>
> > >>>>> I think I'm doing something wrong that causes (2.a) but (2.b)
> seems a
> > >>>> like
> > >>>>> a bug to me. What do you think ?
> > >>>>>
> > >>>>> [1] https://issues.apache.org/jira/browse/CALCITE-3108
> > >>>>>
> > >>>>> Thanks,
> > >>>>> Gelbana
> > >>>>
> > >>>>
> > >>
> >
> >
>

Reply via email to