[ 
https://issues.apache.org/jira/browse/CALCITE-528?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14250467#comment-14250467
 ] 

Jinfeng Ni edited comment on CALCITE-528 at 12/17/14 8:23 PM:
--------------------------------------------------------------

Hi Julian,

Seems to me that Calcite base code does not see this case-sensitive issue 
simply because Calcite connection config uses LEX.ORACLE by default.  (

{code}
CalciteConnectionProperty.java 

 /** Lexical policy. */
  LEX("lex", Type.ENUM, Lex.ORACLE, false),

Lex.java

 /** Lexical policy similar to Oracle. The case of identifiers enclosed in
   * double-quotes is preserved; unquoted identifiers are converted to
   * upper-case; after which, identifiers are matched case-sensitively. */
  ORACLE(Quoting.DOUBLE_QUOTE, Casing.TO_UPPER, Casing.UNCHANGED, true),

  /** Lexical policy similar to MySQL. (To be precise: MySQL on Windows;
   * MySQL on Linux uses case-sensitive matching, like the Linux file system.)
   * The case of identifiers is preserved whether or not they quoted;
   * after which, identifiers are matched case-insensitively.
   * Back-ticks allow identifiers to contain non-alphanumeric characters. */
  MYSQL(Quoting.BACK_TICK, Casing.UNCHANGED, Casing.UNCHANGED, false),

{code}

In SqlToRelConverter, caseSensitive is hard-coded to "true". This works for for 
LEX.ORACLE, since all the unquoted identifier have been converted to 
upper-case. However, it will not work for LEX.MYSQL or other LEX which uses 
"UNCHANGED" casing. 

{code}
SqlToRElConverter.java:3323

      final boolean caseSensitive = true; // name already fully-qualified
      e = rexBuilder.makeFieldAccess(e, name, caseSensitive);
{code}

Therefore, I think we need pass the SqlParser's LEX case-sensitive to 
validator, and probably SqlRelConverter. That  way, it will work for either 
LEX.ORACLE or other LEX configuration.

Also, I see probably almost all the queries in JdbcTest.java uses quoted column 
names.  If I change column name to unquoted, then Calcite will complain "Column 
'EMPID' not found in any table" error, for the following simple query: 

{code}
select empid from "hr"."emps"
{code}

That probably happens because CatalogReader use case-sensitive=true, while the 
unquoted identifier have been converted to upper-case. 

Any suggestion? Thanks!



was (Author: jni):
Hi Julian,

Seems to me that Calcite base code does not see this case-sensitive issue 
simply because Calcite connection config uses LEX.ORACLE by default.  (

{code}
CalciteConnectionProperty.java 

 /** Lexical policy. */
  LEX("lex", Type.ENUM, Lex.ORACLE, false),

Lex.java

 /** Lexical policy similar to Oracle. The case of identifiers enclosed in
   * double-quotes is preserved; unquoted identifiers are converted to
   * upper-case; after which, identifiers are matched case-sensitively. */
  ORACLE(Quoting.DOUBLE_QUOTE, Casing.TO_UPPER, Casing.UNCHANGED, true),

  /** Lexical policy similar to MySQL. (To be precise: MySQL on Windows;
   * MySQL on Linux uses case-sensitive matching, like the Linux file system.)
   * The case of identifiers is preserved whether or not they quoted;
   * after which, identifiers are matched case-insensitively.
   * Back-ticks allow identifiers to contain non-alphanumeric characters. */
  MYSQL(Quoting.BACK_TICK, Casing.UNCHANGED, Casing.UNCHANGED, false),

{code}

In SqlToRelConverter, caseSensitive is hard-coded to "true". This works for for 
LEX.ORACLE, since all the quoted identifier have been converted to upper-case. 
However, it will not work for LEX.MYSQL or other LEX which uses "UNCHANGED" 
casing. 

{code}
SqlToRElConverter.java:3323

      final boolean caseSensitive = true; // name already fully-qualified
      e = rexBuilder.makeFieldAccess(e, name, caseSensitive);
{code}

Therefore, I think we need pass the SqlParser's LEX case-sensitive to 
validator, and probably SqlRelConverter. That  way, it will work for either 
LEX.ORACLE or other LEX configuration.

Also, I see probably almost all the queries in JdbcTest.java uses quoted column 
names.  If I change column name to unquoted, then Calcite will complain "Column 
'EMPID' not found in any table" error, for the following simple query: 

{code}
select empid from "hr"."emps"
{code}

That probably happens because CatalogReader use case-sensitive=true, while the 
unquoted identifier have been converted to upper-case. 

Any suggestion? Thanks!


> Creating output row type of a Join does not obey case-sensitivity flags
> -----------------------------------------------------------------------
>
>                 Key: CALCITE-528
>                 URL: https://issues.apache.org/jira/browse/CALCITE-528
>             Project: Calcite
>          Issue Type: Bug
>    Affects Versions: 0.9.1-incubating
>            Reporter: Aman Sinha
>            Assignee: Julian Hyde
>
> In JoinRelBase.createJoinType() which creates a row type of the output row, a 
> HashSet of String is used to keep track of unique field names.  The field 
> names  'column1'  and 'Column1' will both be stored.   This creates a problem 
> for systems which are treating identifiers as case-insensitive (such as 
> Drill) which rely on a Project below a Join to create unique names if the 
> join columns are the same name (regardless of case).  
> Ideally, the comparison for this should be done based on the criteria 
> specified in the Lex settings when instantiating the 
> SqlParser.ParserConfigImpl.  So, if the parser was created with MYSQL Lex 
> settings (see Lex.java), it should be obeyed by the 
> JoinRelBase.createJoinType().  



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to