From 8ad0ff53d79d9059028f506213050e14deebe890 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 30 Sep 2026 10:44:51 +0200 Subject: [PATCH] Unified: Fix bad join in `derivedStoreReadStep` Before ``` Pipeline standard for StaticNameBinding::derivedStoreReadStep/2#42234dff@fc4c9y3a was evaluated in 14 iterations totaling 10484ms (delta sizes total: 108052). 5330410 ~0% {3} r1 = JOIN `StaticNameBinding::TrackNamespace::track/1#cff0849d#reorder_1_0#prev_delta` WITH `StaticNameBinding::readStep/3#d06f28c6` ON FIRST 1 OUTPUT Lhs.1, Rhs.1, Rhs.2 2567 ~0% {2} | JOIN WITH `StaticNameBinding::NamespaceNode.getMember/1#62056d4e#prev` ON FIRST 2 OUTPUT Lhs.2, Rhs.2 {2} | REWRITE WITH TEST InOut.1 != InOut.0 2567 ~1% {2} | SCAN OUTPUT In.1, In.0 811176 ~0% {3} r2 = SCAN `StaticNameBinding::NamespaceNode.getMember/1#62056d4e#prev_delta` OUTPUT In.1, In.0, In.2 3703647034 ~1% {4} | JOIN WITH `StaticNameBinding::readStep/3#d06f28c6_102#join_rhs` ON FIRST 1 OUTPUT Rhs.1, Rhs.2, Lhs.1, Lhs.2 {4} | REWRITE WITH TEST InOut.3 != InOut.1 3703647034 ~0% {4} | SCAN OUTPUT In.0, In.2, In.1, In.3 105485 ~0% {2} | JOIN WITH `StaticNameBinding::TrackNamespace::track/1#cff0849d#reorder_1_0#prev` ON FIRST 2 OUTPUT Lhs.3, Lhs.2 108052 ~1% {2} r3 = r1 UNION r2 108052 ~1% {2} | AND NOT `StaticNameBinding::derivedStoreReadStep/2#42234dff#prev`(FIRST 2) return r3 ``` After ``` Pipeline standard for StaticNameBinding::derivedStoreReadStep/2#42234dff@7738dy18 was evaluated in 14 iterations totaling 42ms (delta sizes total: 108052). 5330410 ~0% {3} r1 = JOIN `StaticNameBinding::TrackNamespace::track/1#cff0849d#reorder_1_0#prev_delta` WITH `StaticNameBinding::readStep/3#d06f28c6` ON FIRST 1 OUTPUT Lhs.1, Rhs.1, Rhs.2 2567 ~0% {2} | JOIN WITH `StaticNameBinding::NamespaceNode.getMember/1#62056d4e#prev` ON FIRST 2 OUTPUT Lhs.2, Rhs.2 {2} | REWRITE WITH TEST InOut.1 != InOut.0 2567 ~1% {2} | SCAN OUTPUT In.1, In.0 811176 ~4% {3} r2 = SCAN `StaticNameBinding::NamespaceNode.getMember/1#62056d4e#prev_delta` OUTPUT In.0, In.2, In.1 5362528 ~0% {3} | JOIN WITH `StaticNameBinding::TrackNamespace::track/1#cff0849d#prev` ON FIRST 1 OUTPUT Rhs.1, Lhs.2, Lhs.1 105485 ~0% {2} | JOIN WITH `StaticNameBinding::readStep/3#d06f28c6` ON FIRST 2 OUTPUT Lhs.2, Rhs.2 105485 ~0% {2} | REWRITE WITH TEST InOut.0 != InOut.1 108052 ~1% {2} r3 = r1 UNION r2 108052 ~1% {2} | AND NOT `StaticNameBinding::derivedStoreReadStep/2#42234dff#prev`(FIRST 2) return r3 ``` --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 03f3c9ddb021..b225539526a1 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -341,8 +341,8 @@ module Track { pragma[nomagic] private predicate derivedStoreReadStep(NameBindingNode node1, NameBindingNode node2) { exists(NamespaceNode namespace, string name | - node1 = namespace.getMember(name) and // getMember() combines a store step with subsequent inheritance steps - readStep(namespace.ref(), name, node2) and + node1 = namespace.getMember(pragma[only_bind_into](name)) and // getMember() combines a store step with subsequent inheritance steps + readStep(namespace.ref(), pragma[only_bind_into](name), node2) and node1 != node2 ) }