You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Tomoyuki Morita (Jira)" <ji...@apache.org> on 2025/11/11 23:14:00 UTC
[jira] [Commented] (CALCITE-7206) duplicate 'compare' method in JoinType.INNER, for Enumerable code generator
[ https://issues.apache.org/jira/browse/CALCITE-7206?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18037544#comment-18037544 ]
Tomoyuki Morita commented on CALCITE-7206:
------------------------------------------
I encounter the same problem when EnumerableMergeJoin is generated with join condition contains `object1 = object2`.
[PhysTypeImpl.generateComparator|https://github.com/apache/calcite/blob/main/core/src/main/java/org/apache/calcite/adapter/enumerable/PhysTypeImpl.java#L426] generate duplicate `compare(Object, Object)` method because it always [add bridge compare method|https://github.com/apache/calcite/blob/main/core/src/main/java/org/apache/calcite/adapter/enumerable/PhysTypeImpl.java#L494] with signature `compare(Object, Object)`.
Bridge method should be eliminated if the javaRowClass is Object.
> duplicate 'compare' method in JoinType.INNER, for Enumerable code generator
> ---------------------------------------------------------------------------
>
> Key: CALCITE-7206
> URL: https://issues.apache.org/jira/browse/CALCITE-7206
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.40.0
> Reporter: Jerome Isaac Haltom
> Priority: Minor
>
> I'm building my own adapter. Right now I have only implemented a TableScan so my adapter isn't doing much of anything to get in the way. Upon running an inner join:
> SELECT * FROM trailmates1.\"User\" AS u INNER JOIN trailmates1.UserProfile as up ON u.Id = up.UserId
> I receive the following exception:
>
> {code:java}
> java.sql.SQLException: Error while executing SQL "SELECT * FROM trailmates1."User" AS u INNER JOIN trailmates1.UserProfile as up ON u.Id = up.UserId": Error while compiling generated Java code:
> public org.apache.calcite.linq4j.Enumerable bind(final org.apache.calcite.DataContext root) {
> return org.apache.calcite.linq4j.EnumerableDefaults.mergeJoin(org.apache.calcite.schema.Schemas.queryable(root, root.getRootSchema().getSubSchema("trailmates1"), java.lang.Object[].class, "User").asEnumerable().orderBy(new org.apache.calcite.linq4j.function.Function1() {
> public Object apply(Object[] v) {
> return v[0];
> }
> public Object apply(Object v) {
> return apply(
> (Object[]) v);
> }
> }
> , org.apache.calcite.linq4j.function.Functions.nullsComparator(false, false)), org.apache.calcite.schema.Schemas.queryable(root, root.getRootSchema().getSubSchema("trailmates1"), java.lang.Object[].class, "UserProfile").asEnumerable().orderBy(new org.apache.calcite.linq4j.function.Function1() {
> public Object apply(Object[] v) {
> return v[1];
> }
> public Object apply(Object v) {
> return apply(
> (Object[]) v);
> }
> }
> , org.apache.calcite.linq4j.function.Functions.nullsComparator(false, false)), new org.apache.calcite.linq4j.function.Function1() {
> public Object apply(Object[] left) {
> return left[0];
> }
> public Object apply(Object left) {
> return apply(
> (Object[]) left);
> }
> }
> , new org.apache.calcite.linq4j.function.Function1() {
> public Object apply(Object[] right) {
> return right[1];
> }
> public Object apply(Object right) {
> return apply(
> (Object[]) right);
> }
> }
> , null, new org.apache.calcite.linq4j.function.Function2() {
> public Object[] apply(Object[] left, Object[] right) {
> return new Object[] {
> left[0],
> left[1],
> left[2],
> left[3],
> right[0],
> right[1],
> right[2],
> right[3],
> right[4],
> right[5],
> right[6],
> right[7],
> right[8]};
> }
> public Object[] apply(Object left, Object right) {
> return apply(
> (Object[]) left,
> (Object[]) right);
> }
> }
> , org.apache.calcite.linq4j.JoinType.INNER, new java.util.Comparator(){
> public int compare(Object v0, Object v1) {
> final int c;
> c = org.apache.calcite.runtime.Utilities.compare((Comparable) v0, (Comparable) v1);
> if (c != 0) {
> return c;
> }
> return 0;
> } public int compare(Object o0, Object o1) {
> return this.compare(o0, o1);
> } }, null);
> }
> public Class getElementType() {
> return java.lang.Object[].class;
> }
> {code}
> The problem is the last Function argument, which has compare(Object v0, Object V1) as well as compare(Object o0, Object o1).
> My guess is this has SOMETHING to do with the types of the columns in the schema. I'll take a look at that and clarify. These IDs are UUIDs, and I might have messed something up so they are object types. However, those should still technically not generate bad code.......
--
This message was sent by Atlassian Jira
(v8.20.10#820010)