Skip to content

Commit a4e8de3

Browse files
Make CastValue.hashCodeWithoutChildren() stable (#4241)
Hash `physicalOperator.name()` rather than the enum itself. `Enum.hashCode()` is inherited from `Object` and is identity-based, so the previous code produced a different hash on every JVM run. That instability propagated to the `semanticHashCode()` tie-breaker in `RewritingCostModel`. This in turn caused spurious `explain` changes in the test case that we un-disable with this fix. Fixes #4237.
1 parent 0a425b2 commit a4e8de3

2 files changed

Lines changed: 31 additions & 32 deletions

File tree

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/values/CastValue.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ public <M extends Message> Object eval(@Nonnull final FDBRecordStoreBase<M> stor
382382

383383
@Override
384384
public int hashCodeWithoutChildren() {
385-
return Objects.hash(castToType, physicalOperator);
385+
return Objects.hash(castToType, physicalOperator.name());
386386
}
387387

388388
@Override

yaml-tests/src/test/resources/join-tests.yamsql

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -436,37 +436,36 @@ test_block:
436436
- supported_version: 4.12.4.0
437437
- explain: "SCAN([IS JA]) | FLATMAP q0 -> { SCAN([IS JB]) | FILTER false AS q1 RETURN (q0.C1 AS C1, q0.C2 AS C2, q1.C3 AS C3) }"
438438
- result: []
439-
# TODO Issue #4237: Investigate spurious explain changes in the query below
440-
#-
441-
# # same join as above, but using an explicit WHERE FALSE clause
442-
# - query: select ja.c1, ja.c2, jb.c3 from ja, jb where false;
443-
# - supported_version: 4.12.4.0
444-
# - explain: "SCAN([IS JA]) | FLATMAP q0 -> { SCAN([IS JB]) | FILTER false AS q1 RETURN (q0.C1 AS C1, q0.C2 AS C2, q1.C3 AS C3) }"
445-
# - result: []
446-
#-
447-
# # inner join with ON UNKNOWN: has the same effect as ON FALSE
448-
# - query: select ja.c1, ja.c2, jb.c3 from ja inner join jb on cast(null as boolean);
449-
# - supported_version: 4.12.6.0
450-
# - explain: "SCAN([IS JA]) | FLATMAP q0 -> { SCAN([IS JB]) | FILTER null AS q1 RETURN (q0.C1 AS C1, q0.C2 AS C2, q1.C3 AS C3) }"
451-
# - result: []
452-
#-
453-
# # same join as above, but using an explicit WHERE NULL clause
454-
# - query: select ja.c1, ja.c2, jb.c3 from ja, jb where cast(null as boolean);
455-
# - supported_version: 4.12.6.0
456-
# - explain: "SCAN([IS JA]) | FLATMAP q0 -> { SCAN([IS JB]) | FILTER null AS q1 RETURN (q0.C1 AS C1, q0.C2 AS C2, q1.C3 AS C3) }"
457-
# - result: []
458-
#-
459-
# # inner join with ON NULL: a plain NULL predicate is recognized as a null boolean and yields an empty result
460-
# - query: select ja.c1, ja.c2, jb.c3 from ja inner join jb on null;
461-
# - supported_version: 4.12.4.0
462-
# - explain: "SCAN([IS JA]) | FLATMAP q0 -> { SCAN([IS JB]) | FILTER null AS q1 RETURN (q0.C1 AS C1, q0.C2 AS C2, q1.C3 AS C3) }"
463-
# - result: []
464-
#-
465-
# # same join as above, but using an explicit WHERE NULL clause
466-
# - query: select ja.c1, ja.c2, jb.c3 from ja, jb where null;
467-
# - supported_version: 4.12.4.0
468-
# - explain: "SCAN([IS JA]) | FLATMAP q0 -> { SCAN([IS JB]) | FILTER null AS q1 RETURN (q0.C1 AS C1, q0.C2 AS C2, q1.C3 AS C3) }"
469-
# - result: []
439+
-
440+
# same join as above, but using an explicit WHERE FALSE clause
441+
- query: select ja.c1, ja.c2, jb.c3 from ja, jb where false;
442+
- supported_version: 4.12.4.0
443+
- explain: "SCAN([IS JA]) | FLATMAP q0 -> { SCAN([IS JB]) | FILTER false AS q1 RETURN (q0.C1 AS C1, q0.C2 AS C2, q1.C3 AS C3) }"
444+
- result: []
445+
-
446+
# inner join with ON UNKNOWN: has the same effect as ON FALSE
447+
- query: select ja.c1, ja.c2, jb.c3 from ja inner join jb on cast(null as boolean);
448+
- supported_version: 4.12.6.0
449+
- explain: "SCAN([IS JA]) | FLATMAP q0 -> { SCAN([IS JB]) | FILTER null AS q1 RETURN (q0.C1 AS C1, q0.C2 AS C2, q1.C3 AS C3) }"
450+
- result: []
451+
-
452+
# same join as above, but using an explicit WHERE NULL clause
453+
- query: select ja.c1, ja.c2, jb.c3 from ja, jb where cast(null as boolean);
454+
- supported_version: 4.12.6.0
455+
- explain: "SCAN([IS JA]) | FLATMAP q0 -> { SCAN([IS JB]) | FILTER null AS q1 RETURN (q0.C1 AS C1, q0.C2 AS C2, q1.C3 AS C3) }"
456+
- result: []
457+
-
458+
# inner join with ON NULL: a plain NULL predicate is recognized as a null boolean and yields an empty result
459+
- query: select ja.c1, ja.c2, jb.c3 from ja inner join jb on null;
460+
- supported_version: 4.12.4.0
461+
- explain: "SCAN([IS JA]) | FLATMAP q0 -> { SCAN([IS JB]) | FILTER null AS q1 RETURN (q0.C1 AS C1, q0.C2 AS C2, q1.C3 AS C3) }"
462+
- result: []
463+
-
464+
# same join as above, but using an explicit WHERE NULL clause
465+
- query: select ja.c1, ja.c2, jb.c3 from ja, jb where null;
466+
- supported_version: 4.12.4.0
467+
- explain: "SCAN([IS JA]) | FLATMAP q0 -> { SCAN([IS JB]) | FILTER null AS q1 RETURN (q0.C1 AS C1, q0.C2 AS C2, q1.C3 AS C3) }"
468+
- result: []
470469
---
471470
# All 3-way (or more) join queries from above, repeated with PLAN_RIGHT_DEEP enabled.
472471
test_block:

0 commit comments

Comments
 (0)