I believe you're correct. Thanks a lot for your help. Thanks, Gelbana
On Fri, Jun 21, 2019 at 3:51 PM Stamatis Zampetakis <[email protected]> wrote: > For the use-case that you described, I think what needs to be changed is in > CalcitePrepareImpl#getTypeName [1]. > Possibly instead of using RelDataType#getSqlTypeName we should use > RelDataType#getSqlIdentifier [2]. > > [1] > > https://github.com/apache/calcite/blob/4e89fddab415a1e04b82c7d69960e399f608949f/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java#L829 > [2] > > https://github.com/apache/calcite/blob/4e89fddab415a1e04b82c7d69960e399f608949f/core/src/main/java/org/apache/calcite/rel/type/RelDataType.java#L200 > > Best, > Stamatis > > On Thu, Jun 6, 2019 at 11:05 PM Muhammad Gelbana <[email protected]> > wrote: > > > You're absolutely right. User-defined types should be the way to go. I > > believe it needs enhancement though, only to customize the returned > column > > type name as I mentioned here[1] > > > > [1] > > > > > https://issues.apache.org/jira/browse/CALCITE-3108?focusedCommentId=16857993&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-16857993 > > > > Thanks, > > Gelbana > > > > > > On Thu, Jun 6, 2019 at 3:00 PM Stamatis Zampetakis <[email protected]> > > wrote: > > > > > I see but I am not sure SqlTypeName is the way to go. > > > > > > Postgres has many built-in types [1] which do not appear in this > > > enumeration. > > > Other DBMS have also their own built-in types. > > > Adding every possible type in SqlTypeName does not seem right. > > > > > > Unfortunately, I don't know what's the best way to proceed. > > > > > > [1] https://www.postgresql.org/docs/11/datatype.html > > > > > > > > > > > > On Tue, Jun 4, 2019 at 7:39 PM Muhammad Gelbana <[email protected]> > > > wrote: > > > > > > > The only difference I need to achieve while handling both types, is > the > > > > returned column type name > > (ResultSet.getMetaData().getColumnTypeName(int > > > > index)). > > > > The returned value is VARCHAR even if the column type is a user > defined > > > > type with the alias TEXT. > > > > > > > > While getting the column type name using a real PostgreSQL connection > > > for a > > > > TEXT column, is TEXT, not VARCHAR. > > > > > > > > Thanks, > > > > Gelbana > > > > > > > > > > > > On Tue, Jun 4, 2019 at 6:23 PM Stamatis Zampetakis < > [email protected]> > > > > wrote: > > > > > > > > > I am not sure what problem exactly we are trying to solve here > (sorry > > > for > > > > > that). > > > > > From what I understood so far the requirement is to introduce a new > > > > > built-in SQL type (i.e., TEXT). > > > > > However, I am still trying to understand why do we need this. > > > > > Are we going to treat TEXT and VARCHAR differently? > > > > > > > > > > On Tue, Jun 4, 2019 at 5:18 PM Muhammad Gelbana < > [email protected] > > > > > > > > wrote: > > > > > > > > > > > Thanks Lai, I beleive your analysis is correct. > > > > > > > > > > > > Which brings up another question: > > > > > > Is it ok if we add support for what I'm trying to do here ? I can > > > > gladly > > > > > > work on that but I need to know if it will be accepted. > > > > > > > > > > > > Thanks, > > > > > > Gelbana > > > > > > > > > > > > > > > > > > On Tue, Jun 4, 2019 at 8:38 AM Lai Zhou <[email protected]> > > wrote: > > > > > > > > > > > > > @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 > > > > > > > > > >>>> > > > > > > > > > >>>> > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
