Skip to content

Commit a5e0669

Browse files
committed
Swift: fix bad join order in NamedPattern.getVarDecl()
Ideally the EDB itself should contain a direct reference from NamedPattern to VarDecl, not just a name, but oh well, this join order works fine. BEFORE: ``` [2023-06-08 11:40:01] Evaluated non-recursive predicate quick_eval#ff@60fe07kr in 6533ms (size: 91309). Evaluated relational algebra for predicate quick_eval#ff@60fe07kr with tuple counts: 1209062 ~3% {2} r1 = SCAN VarDecl#914e0d1e::Generated::VarDecl::getName#0#dispred#ff OUTPUT In.1, In.0 234687793 ~0% {2} r2 = JOIN r1 WITH NamedPattern#c3d26570::Generated::NamedPattern::getName#0#dispred#ff_10#join_rhs ON FIRST 1 OUTPUT Lhs.1, Rhs.1 19112791 ~0% {3} r3 = JOIN r2 WITH VarDecl#914e0d1e::Generated::VarDecl::getImmediateParentPattern#0#dispred#ff ON FIRST 1 OUTPUT Rhs.1, Lhs.0, Lhs.1 19112791 ~0% {3} r4 = JOIN r3 WITH Element#e67432df::Generated::Element::resolve#bf ON FIRST 1 OUTPUT Rhs.1, Lhs.2, Lhs.1 24647 ~0% {2} r5 = JOIN r4 WITH Element#d22cfd66::Element::getFullyUnresolved#bf ON FIRST 2 OUTPUT Lhs.1, Lhs.2 19112791 ~0% {3} r6 = JOIN r3 WITH Element#e67432df::Generated::Element::resolve#bf ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2 19112791 ~3% {3} r7 = JOIN r6 WITH Element#d22cfd66::Element::getFullyUnresolved#bf ON FIRST 1 OUTPUT Lhs.2, Rhs.1, Lhs.1 66662 ~4% {2} r8 = JOIN r7 WITH #Pattern#19b8cf65::Pattern::getImmediateEnclosingPattern#0#dispredPlus#bf ON FIRST 2 OUTPUT Lhs.0, Lhs.2 91309 ~2% {2} r9 = r5 UNION r8 return r9 ``` AFTER: ``` [2023-06-08 11:55:26] Evaluated non-recursive predicate quick_eval#ff@fe906afo in 26ms (size: 91309). Evaluated relational algebra for predicate quick_eval#ff@fe906afo with tuple counts: 92048 ~0% {3} r1 = SCAN NamedPattern#c3d26570::Generated::NamedPattern::getName#0#dispred#ff OUTPUT In.0, In.1, In.0 82893 ~0% {2} r2 = SCAN #Pattern#19b8cf65::Pattern::getImmediateEnclosingPattern#0#dispredPlus#fb#flipped OUTPUT In.1, In.0 66417 ~1% {3} r3 = JOIN r2 WITH NamedPattern#c3d26570::Generated::NamedPattern::getName#0#dispred#ff ON FIRST 1 OUTPUT Lhs.1, Rhs.1, Lhs.0 158465 ~0% {3} r4 = r1 UNION r3 94246 ~3% {3} r5 = JOIN r4 WITH VarDecl#914e0d1e::Generated::VarDecl::getImmediateParentPattern#0#dispred#ff_10#join_rhs ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2 91309 ~2% {2} r6 = JOIN r5 WITH VarDecl#914e0d1e::Generated::VarDecl::getName#0#dispred#ff ON FIRST 2 OUTPUT Lhs.2, Lhs.0 return r6 ```
1 parent cad6582 commit a5e0669

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

swift/ql/lib/codeql/swift/elements/pattern/NamedPattern.qll

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ class NamedPattern extends Generated::NamedPattern {
1919
* This will be the case as long as the variable is subsequently used.
2020
*/
2121
VarDecl getVarDecl() {
22-
this.getImmediateEnclosingPattern*() = result.getParentPattern().getFullyUnresolved() and
23-
result.getName() = this.getName()
22+
this.getImmediateEnclosingPattern*() = result.getImmediateParentPattern() and
23+
pragma[only_bind_out](pragma[only_bind_into](result).getName()) =
24+
pragma[only_bind_out](pragma[only_bind_into](this).getName())
2425
}
2526

2627
override string toString() { result = this.getName() }

0 commit comments

Comments
 (0)