You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Julian Hyde (JIRA)" <ji...@apache.org> on 2015/06/25 03:00:06 UTC
[jira] [Commented] (CALCITE-762) Trailing spaces on character
literals
[ https://issues.apache.org/jira/browse/CALCITE-762?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14600461#comment-14600461 ]
Julian Hyde commented on CALCITE-762:
-------------------------------------
Per the email thread http://postgresql.nabble.com/String-comparison-and-the-SQL-standard-td5740721.html "String comparison and the SQL standard", Postgres deviates from the standard in two significant ways: character literals are of type UNKNOWN not CHAR; 'a'='a ' returns FALSE.
So, it seems that Calcite is already in compliance with the standard.
> Trailing spaces on character literals
> -------------------------------------
>
> Key: CALCITE-762
> URL: https://issues.apache.org/jira/browse/CALCITE-762
> Project: Calcite
> Issue Type: Bug
> Affects Versions: 1.3.0-incubating
> Environment: linux
> Reporter: Yuri Au Yong
> Assignee: Julian Hyde
> Attachments: TestSchemaSpec.java
>
>
> When comparing an identifier to a string literal with a comparison operator predicate, the trailing space of the string literal is trimmed prior comparison. The trailing space of the identifier however was not trimmed prior comparison which causes inaccurate results.
> Query through JdbcAdapter is fine as the query is pushed down and handled by databases.
> However, the issue is when the queries are resolved in calcite. Attached [TestSchemaSpec.java|https://issues.apache.org/jira/secure/attachment/12740795/TestSchemaSpec.java] is a reflective schema test case which prints the results of queries below where both V1 and V2 columns are VARCHARs.
> {noformat}
> SQL: select * from test.t1
> | ID(INTEGER) | V1(VARCHAR) | V2(VARCHAR) |
> |_|0|_|null value|_|null|_|
> |_|1|_|a|_|aa|_|
> |_|2|_|noBlank|_||_|
> |_|3|_|oneBlank|_| |_|
> |_|4|_|ltrOneBlank|_|aa |_|
> ##These queries should return rows ID=2 and ID=3
> SQL: select * from test.t1 where v2 = ''
> | ID(INTEGER) | V1(VARCHAR) | V2(VARCHAR) |
> |_|2|_|noBlank|_||_|
> SQL: select * from test.t1 where v2 = ' '
> | ID(INTEGER) | V1(VARCHAR) | V2(VARCHAR) |
> |_|2|_|noBlank|_||_|
> ## These queries should return rows ID=1 and ID=4
> SQL: select * from test.t1 where v2 = 'aa'
> | ID(INTEGER) | V1(VARCHAR) | V2(VARCHAR) |
> |_|1|_|a|_|aa|_|
> SQL: select * from test.t1 where v2 = 'aa '
> | ID(INTEGER) | V1(VARCHAR) | V2(VARCHAR) |
> |_|1|_|a|_|aa|_|
> {noformat}
> h4. Generated Code:
> {noformat}
> SQL: select * from test.t1 where v2 = 'aa '
> /* 1 */ org.apache.calcite.DataContext root;
> /* 2 */
> /* 3 */ public org.apache.calcite.linq4j.Enumerable bind(final org.apache.calcite.DataContext root0) {
> /* 4 */ root = root0;
> /* 5 */ final org.apache.calcite.linq4j.Enumerable _inputEnumerable = org.apache.calcite.linq4j.Linq4j.asEnumerable(((org.apache.calcite.reflective.TestSchemaSpec.TestSchema) ((org.apache.calcite.adapter.java.ReflectiveSchema) root.getRootSchema().getSubSchema("TEST").unwrap(org.apache.calcite.adapter.java.ReflectiveSchema.class)).getTarget()).T1);
> /* 6 */ return new org.apache.calcite.linq4j.AbstractEnumerable(){
> /* 7 */ public org.apache.calcite.linq4j.Enumerator enumerator() {
> /* 8 */ return new org.apache.calcite.linq4j.Enumerator(){
> /* 9 */ public final org.apache.calcite.linq4j.Enumerator inputEnumerator = _inputEnumerable.enumerator();
> /* 10 */ public void reset() {
> /* 11 */ inputEnumerator.reset();
> /* 12 */ }
> /* 13 */
> /* 14 */ public boolean moveNext() {
> /* 15 */ while (inputEnumerator.moveNext()) {
> /* 16 */ final String inp2_ = ((org.apache.calcite.reflective.TestSchemaSpec.Table1) inputEnumerator.current()).V2;
> /* 17 */ if (inp2_ != null && org.apache.calcite.runtime.SqlFunctions.eq(inp2_, "aa")) {
> /* 18 */ return true;
> /* 19 */ }
> /* 20 */ }
> /* 21 */ return false;
> /* 22 */ }
> /* 23 */
> /* 24 */ public void close() {
> /* 25 */ inputEnumerator.close();
> /* 26 */ }
> /* 27 */
> /* 28 */ public Object current() {
> /* 29 */ final org.apache.calcite.reflective.TestSchemaSpec.Table1 current = (org.apache.calcite.reflective.TestSchemaSpec.Table1) inputEnumerator.current();
> /* 30 */ return new Object[] {
> /* 31 */ current.ID,
> /* 32 */ current.V1,
> /* 33 */ current.V2};
> /* 34 */ }
> /* 35 */
> /* 36 */ };
> /* 37 */ }
> /* 38 */
> /* 39 */ };
> /* 40 */ }
> /* 41 */
> /* 42 */
> /* 43 */ public Class getElementType() {
> /* 44 */ return java.lang.Object[].class;
> /* 45 */ }
> /* 46 */
> /* 47 */
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)