Skip to content

Commit cc373e3

Browse files
committed
Engineer join order for getLexicallyOrderedRecordField
1 parent 6fb33e0 commit cc373e3

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,12 +232,22 @@ predicate storeStep(Node node1, ContentSet f, Node node2) {
232232
pragma[only_bind_out](node2.getEnclosingCallable())
233233
}
234234

235+
// Manual join hacking, to avoid a paramters x fields product.
236+
pragma[noinline]
237+
private predicate hasNamedField(Record r, Field f, string name) {
238+
f = r.getAField() and name = f.getName()
239+
}
240+
241+
pragma[noinline]
242+
private predicate hasNamedCanonicalParameter(Record r, Parameter p, int idx, string name) {
243+
p = r.getCanonicalConstructor().getParameter(idx) and name = p.getName()
244+
}
245+
235246
private Field getLexicallyOrderedRecordField(Record r, int idx) {
236247
result =
237-
rank[idx + 1](Field f, int i, Parameter p |
238-
f = r.getAField() and
239-
p = r.getCanonicalConstructor().getParameter(i) and
240-
f.getName() = p.getName()
248+
rank[idx + 1](Field f, int i, Parameter p, string name |
249+
hasNamedCanonicalParameter(r, p, i, name) and
250+
hasNamedField(r, f, name)
241251
|
242252
f order by i
243253
)

0 commit comments

Comments
 (0)