Merge pull request #20088 from aschackmull/java/joinorders1

Java: Improve several join-orders
This commit is contained in:
Anders Schack-Mulligen
2025-07-18 14:54:26 +02:00
committed by GitHub
3 changed files with 24 additions and 9 deletions

View File

@@ -521,7 +521,13 @@ private predicate unificationTargets(RefType t1, Type t2) {
t2 = a2.getComponentType()
)
or
exists(ParameterizedType pt1, ParameterizedType pt2, int pos |
unificationTargetsParameterized(_, _, t1, t2)
}
private predicate unificationTargetsParameterized(
ParameterizedType pt1, ParameterizedType pt2, RefType t1, RefType t2
) {
exists(int pos |
unificationTargets(pt1, pt2) and
t1 = pt1.getTypeArgument(pos) and
t2 = pt2.getTypeArgument(pos)
@@ -565,10 +571,12 @@ private predicate hasParameterSubstitution(
GenericType g1, ParameterizedType pt1, GenericType g2, ParameterizedType pt2, TypeVariable v,
RefType subst
) {
unificationTargets(pt1, pt2) and
exists(int pos | hasSubstitution(pt1.getTypeArgument(pos), pt2.getTypeArgument(pos), v, subst)) and
g1 = pt1.getGenericType() and
g2 = pt2.getGenericType()
exists(RefType t1, RefType t2 |
unificationTargetsParameterized(pt1, pt2, t1, t2) and
hasSubstitution(t1, t2, v, subst) and
g1 = pt1.getGenericType() and
g2 = pt2.getGenericType()
)
}
/**

View File

@@ -1261,14 +1261,21 @@ private Type erase(Type t) {
*
* For the definition of the notion of *erasure* see JLS v8, section 4.6 (Type Erasure).
*/
bindingset[t1, t2]
overlay[caller?]
pragma[inline]
pragma[inline_late]
predicate haveIntersection(RefType t1, RefType t2) {
exists(RefType e1, RefType e2 | e1 = erase(t1) and e2 = erase(t2) |
erasedHaveIntersection(e1, e2)
erasedHaveIntersectionFilter(e1, e2)
)
}
bindingset[t1, t2]
pragma[inline_late]
private predicate erasedHaveIntersectionFilter(RefType t1, RefType t2) {
erasedHaveIntersection(t1, t2)
}
/**
* Holds if there is no common (reflexive, transitive) subtype of the erasures
* of types `t1` and `t2`.