You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Ruben Q L (Jira)" <ji...@apache.org> on 2019/11/07 14:56:00 UTC

[jira] [Updated] (CALCITE-3482) Equality of nested ROWs returns false for identical literal value

     [ https://issues.apache.org/jira/browse/CALCITE-3482?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ruben Q L updated CALCITE-3482:
-------------------------------
    Description: 
Similar to CALCITE-3021.
Problem can be reproduced via:
{code}
select * from
(values
    (1, ROW(1,1)),
    (2, ROW(2,2)),
    (3, ROW(1,1)),
    (4, ROW(2,2))) as t(id,struct)
where t.struct = ROW(2,2);
{code}
which returns no results, instead of the expected (I have run the same query in PostgreSQL, and it returns this result):
{code}
+----+--------+
| ID | STRUCT |
+----+--------+
|  2 | {2, 2} |
|  4 | {2, 2} |
+----+--------+
{code}

The issue is that the comparison is done via {{SqlFunctions#eq(Object b0, Object b1)}}
{code}
  public static boolean eq(Object b0, Object b1) {
    return b0.equals(b1);
  }
{code}
And in this case we have two different Object[], with the same content, so they should be identified as equals (but they are not based on {{Object#equals}}). Probably the simplest solution would be overloading the {{eq}} method for Object[] parameters:
{code}
  public static boolean eq(Object[] b0, Object[] b1) {
    return Arrays.deepEquals(b0, b1);
  }
{code}

  was:
Similar to CALCITE-3021.
Problem can be reproduced via:
{code}
select * from
(values
    (1, ROW(1,1)),
    (2, ROW(2,2)),
    (3, ROW(1,1)),
    (4, ROW(2,2))) as t(id,struct)
where t.struct = ROW(2,2);
{code}
which returns no results, instead of the expected (I have run the same query in PostgreSQL, and it returns this result):
{code}
+----+--------+
| ID | STRUCT |
+----+--------+
|  2 | {2, 2} |
|  4 | {2, 2} |
+----+--------+
{code}

The issue is that the comparison is done via SqlFuynctions#eq(Object b0, Object b1)
{code}
  public static boolean eq(Object b0, Object b1) {
    return b0.equals(b1);
  }
{code}
And in this case we have two different Object[], with the same content, so the should be identified as equals. Probably the simples solution would be overloading the eq method:
{code}
  public static boolean eq(Object[] b0, Object[] b1) {
    return Arrays.deepEquals(b0, b1);
  }
{code}


> Equality of nested ROWs returns false for identical literal value
> -----------------------------------------------------------------
>
>                 Key: CALCITE-3482
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3482
>             Project: Calcite
>          Issue Type: Bug
>    Affects Versions: 1.21.0
>            Reporter: Ruben Q L
>            Assignee: Ruben Q L
>            Priority: Minor
>             Fix For: 1.22.0
>
>
> Similar to CALCITE-3021.
> Problem can be reproduced via:
> {code}
> select * from
> (values
>     (1, ROW(1,1)),
>     (2, ROW(2,2)),
>     (3, ROW(1,1)),
>     (4, ROW(2,2))) as t(id,struct)
> where t.struct = ROW(2,2);
> {code}
> which returns no results, instead of the expected (I have run the same query in PostgreSQL, and it returns this result):
> {code}
> +----+--------+
> | ID | STRUCT |
> +----+--------+
> |  2 | {2, 2} |
> |  4 | {2, 2} |
> +----+--------+
> {code}
> The issue is that the comparison is done via {{SqlFunctions#eq(Object b0, Object b1)}}
> {code}
>   public static boolean eq(Object b0, Object b1) {
>     return b0.equals(b1);
>   }
> {code}
> And in this case we have two different Object[], with the same content, so they should be identified as equals (but they are not based on {{Object#equals}}). Probably the simplest solution would be overloading the {{eq}} method for Object[] parameters:
> {code}
>   public static boolean eq(Object[] b0, Object[] b1) {
>     return Arrays.deepEquals(b0, b1);
>   }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)