[
https://issues.apache.org/jira/browse/CALCITE-2928?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16803610#comment-16803610
]
Danny Chan edited comment on CALCITE-2928 at 3/28/19 6:11 AM:
--------------------------------------------------------------
[~julianhyde] i have fire a
[PR#1137|https://github.com/apache/calcite/pull/1137]
Initially i want to change both builtin operators and UDFs case sensitive
internal, and control the case-sensitiveness through config parser config[2].
The problems i encounter when doing this patch:
1.There is a SqlAbstractParserImpl which extended by all the SqlParser, so
there is no chance to see the case-sensitiveness when parsing the builtin
operators in SqlStdOperatorTable[1], and i have to hard code the
case-sensitiveness to be false.
2. Because of 1 i have to make the
ReflectiveSqlOperatorTable#lookupOperatorOverloads case-insensitive for
SqlStdOperatorTable(use instance of to detect).
So with this patch, we can control both table/column/UDF name with
SqlParser.Config.caseSensitive(this flag can be configured through connection
property or FrameworkConfig).
But for builtins, they behave all case-insensitively, just like before.
BTW, this patch add the flag in SqlOperatorTable#lookupOperatorOverloads, so
many codes are touched, i kind of thought the SqlOperatorTable is also
pluggable, if we create another case-insensitive ListSqlOperatorTable can also
make another choice for users. And this will make minor change.
[1]
[link1|https://github.com/apache/calcite/blob/3124a85b93ff2f1b79484c7bd4cc41835d4f1920/core/src/main/java/org/apache/calcite/sql/parser/SqlAbstractParserImpl.java#L395]
[2]
[link2|https://github.com/apache/calcite/blob/3124a85b93ff2f1b79484c7bd4cc41835d4f1920/core/src/main/java/org/apache/calcite/sql/parser/SqlParser.java#L221]
was (Author: danny0405):
[~julianhyde] i have fire a
[PR#1137|https://github.com/apache/calcite/pull/1137]
Initially i wanna change both builtin operators and UDFs case sensitive
internal, and control the case-sensitiveness through config parser config[2].
The problems i encounter when doing this patch:
1.There is a SqlAbstractParserImpl which extended by all the SqlParser, so
there is no change to see the case-sensitivless when parsing the builtin
operators in SqlStdOperatorTable[1], and i have to hard code the case
sensitiveness to be false.
2. Because of 1 i have to make the
ReflectiveSqlOperatorTable#lookupOperatorOverloads case- insensitive for
SqlStdOperatorTable(use instance of to detect).
So with this patch, we can control both table/column/UDF name with
SqlParser.Config.caseSensitive(this flag can be configured through connection
property or FrameworkConfig).
But for builtins, they behave all case-insensitively, just like before.
BTW, this patch add the flag in SqlOperatorTable#lookupOperatorOverloads, so
many codes are touched, i kind of thought the SqlOperatorTable is also
plugable, if we create a case-insensitive ListSqlOperatorTable can also make
another choice for users. And this will make minor change.
[1]
[link1|https://github.com/apache/calcite/blob/3124a85b93ff2f1b79484c7bd4cc41835d4f1920/core/src/main/java/org/apache/calcite/sql/parser/SqlAbstractParserImpl.java#L395]
[2]
[link2|https://github.com/apache/calcite/blob/3124a85b93ff2f1b79484c7bd4cc41835d4f1920/core/src/main/java/org/apache/calcite/sql/parser/SqlParser.java#L221]
> Make UDF lookup default to case insensitive
> -------------------------------------------
>
> Key: CALCITE-2928
> URL: https://issues.apache.org/jira/browse/CALCITE-2928
> Project: Calcite
> Issue Type: Improvement
> Components: core
> Affects Versions: 1.19.0
> Reporter: Danny Chan
> Assignee: Danny Chan
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.20.0
>
> Time Spent: 10m
> Remaining Estimate: 0h
>
> Now for Calcite, we make default parser config unquotedCasing to
> Lex.ORACLE.unquotedCasing(to uppercase)[1], and caseSensitive to
> Lex.ORACLE.caseSensitive(case sensitive true).
> So if we have a UDAF named my_func and query with sql like:
> {code:java}
> select f0, my_func(f1) from table1 group by f0;
> {code}
> We would got a unparsed sql:
> {code:java}
> SELECT F0, MY_FUNC(F1) FROM TABLE1 GROUP BY F0;
> {code}
> For CalciteCatalogReader we hard code the function look up to case sensitive
> true[2],
> For ListSqlOperatorTable we make the operator name lookup case sensitive
> true[3].
> For ReflectiveSqlOperatorTable, we make built-in operators
> case-insensitively[4].
> For most of the cases, we use ListSqlOperatorTable to register our UDFs[5]
> chained with SqlStdOperatorTable(which composite a ChainedSqlOperatorTable),
> which finally passed to CalciteCatalogReader for validation.
> So there are some questions i have:
> 1. Why we make built-in operators look up case-insensitively while
> ListSqlOperatorTable(for UDFs) case-sensitively, with default unquotedCasing
> of TO_UPPERCASE.
> 2. What is the usage of CalciteCatalogReader#lookupOperatorOverloads i only
> saw it used in a unit test LookupOperatorOverloadsTest.
> It seems that make UDF look up case-sensitively does not make any sense,
> users will never distinguish their function with just word cases. And i
> checked also MYSQL, ORACLE, POSTGRES, their UDFs are all registered
> case-insensitively.
> [1]
> https://github.com/apache/calcite/blob/ffca956be03a99cd11e440d652b09674aaa727e6/core/src/main/java/org/apache/calcite/sql/parser/SqlParser.java#L231
> [2]
> https://github.com/apache/calcite/blob/ffca956be03a99cd11e440d652b09674aaa727e6/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java#L166
> [3]
> https://github.com/apache/calcite/blob/ffca956be03a99cd11e440d652b09674aaa727e6/core/src/main/java/org/apache/calcite/sql/util/ListSqlOperatorTable.java#L63
> [4]
> https://github.com/apache/calcite/blob/ffca956be03a99cd11e440d652b09674aaa727e6/core/src/main/java/org/apache/calcite/sql/util/ReflectiveSqlOperatorTable.java#L103
> [5]
> https://github.com/apache/calcite/blob/ffca956be03a99cd11e440d652b09674aaa727e6/core/src/test/java/org/apache/calcite/test/MockSqlOperatorTable.java#L46
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)