Skip to content

Unified: Fix bad join in derivedStoreReadStep - #22707

Merged
hvitved merged 1 commit into
github:mainfrom
hvitved:unified/derived-store-read-step-fix-join
Sep 30, 2026
Merged

hvitved merged 1 commit into
github:mainfrom
hvitved:unified/derived-store-read-step-fix-join

Conversation

@hvitved

@hvitved hvitved commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

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

DCA confirms.

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
```
@hvitved hvitved added the no-change-note-required This PR does not need a change note label Sep 30, 2026
@hvitved
hvitved marked this pull request as ready for review September 30, 2026 10:58
@hvitved
hvitved requested a review from a team as a code owner September 30, 2026 10:58
@hvitved
hvitved requested review from asgerf and a balanced review from Copilot September 30, 2026 10:58

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The annotations are semantically equivalent and the supplied evaluation confirms the intended performance improvement.

Review effort: Balanced
Findings: None

What changed in this PR

Optimizes derivedStoreReadStep by guiding the QL compiler toward a substantially cheaper join order.

Changes:

  • Adds only_bind_into hints for the shared member name.
  • Preserves query semantics while reducing evaluation time.
File Description
unified/​ql/​lib/​codeql/​unified/​internal/​StaticNameBinding.qll Adds binding-direction hints to optimize name-binding joins.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@hvitved
hvitved merged commit 605dc1c into github:main Sep 30, 2026
16 checks passed
@hvitved
hvitved deleted the unified/derived-store-read-step-fix-join branch September 30, 2026 11:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

no-change-note-required This PR does not need a change note Unified

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants