From 6d6e9c0d47154a4fb2ca26db8906f5b767a088c4 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 21 May 2026 10:41:09 +0200 Subject: [PATCH] Util: Only compute dense ranks when needed --- shared/util/codeql/util/DenseRank.qll | 82 ++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 9 deletions(-) diff --git a/shared/util/codeql/util/DenseRank.qll b/shared/util/codeql/util/DenseRank.qll index 89ab865e9595..6521bcec21ba 100644 --- a/shared/util/codeql/util/DenseRank.qll +++ b/shared/util/codeql/util/DenseRank.qll @@ -55,13 +55,33 @@ signature module DenseRankInputSig { module DenseRank { private import Input + private int getARank() { result = getRank(_) } + + pragma[noinline] + private int getARankGap() { result = getARank() and not result - 1 = getARank() } + + pragma[noinline] + private predicate isDenseFrom(int i) { i = unique( | | getARankGap()) } + + pragma[noinline] + private int getRankNeedsDenseRank(Ranked r) { result = getRank(r) and not isDenseFrom(_) } + private int rankRank(Ranked r, int rnk) { - rnk = getRank(r) and - rnk = rank[result](int rnk0 | rnk0 = getRank(_) | rnk0) + rnk = getRankNeedsDenseRank(r) and + rnk = rank[result](int rnk0 | rnk0 = getRankNeedsDenseRank(_) | rnk0) } /** Gets the `Ranked` value for which the dense rank is `rnk`. */ - Ranked denseRank(int rnk) { rnk = rankRank(result, getRank(result)) } + pragma[nomagic] + Ranked denseRank(int rnk) { + rnk = rankRank(result, getRankNeedsDenseRank(result)) + or + exists(int i, int offset | + isDenseFrom(i) and + offset = i - 1 and + rnk = getRank(result) - offset + ) + } } /** Provides the input to `DenseRank1`. */ @@ -82,16 +102,38 @@ signature module DenseRankInputSig1 { module DenseRank1 { private import Input + private int getARank(C c) { result = getRank(c, _) } + + pragma[noinline] + private int getARankGap(C c) { result = getARank(c) and not result - 1 = getARank(c) } + + pragma[noinline] + private predicate isDenseFrom(C c, int i) { i = unique( | | getARankGap(c)) } + + pragma[noinline] + private int getRankNeedsDenseRank(C c, Ranked r) { + result = getRank(c, r) and not isDenseFrom(c, _) + } + private int rankRank(C c, Ranked r, int rnk) { - rnk = getRank(c, r) and - rnk = rank[result](int rnk0 | rnk0 = getRank(c, _) | rnk0) + rnk = getRankNeedsDenseRank(c, r) and + rnk = rank[result](int rnk0 | rnk0 = getRankNeedsDenseRank(c, _) | rnk0) } /** * Gets the `Ranked` value for which the dense rank in the context provided by * `c` is `rnk`. */ - Ranked denseRank(C c, int rnk) { rnk = rankRank(c, result, getRank(c, result)) } + pragma[nomagic] + Ranked denseRank(C c, int rnk) { + rnk = rankRank(c, result, getRankNeedsDenseRank(c, result)) + or + exists(int i, int offset | + isDenseFrom(c, i) and + offset = i - 1 and + rnk = getRank(c, result) - offset + ) + } } /** Provides the input to `DenseRank2`. */ @@ -116,16 +158,38 @@ signature module DenseRankInputSig2 { module DenseRank2 { private import Input + private int getARank(C1 c1, C2 c2) { result = getRank(c1, c2, _) } + + pragma[noinline] + private int getARankGap(C1 c1, C2 c2) { + result = getARank(c1, c2) and not result - 1 = getARank(c1, c2) + } + + pragma[noinline] + private predicate isDenseFrom(C1 c1, C2 c2, int i) { i = unique( | | getARankGap(c1, c2)) } + + pragma[noinline] + private int getRankNeedsDenseRank(C1 c1, C2 c2, Ranked r) { + result = getRank(c1, c2, r) and not isDenseFrom(c1, c2, _) + } + private int rankRank(C1 c1, C2 c2, Ranked r, int rnk) { - rnk = getRank(c1, c2, r) and - rnk = rank[result](int rnk0 | rnk0 = getRank(c1, c2, _) | rnk0) + rnk = getRankNeedsDenseRank(c1, c2, r) and + rnk = rank[result](int rnk0 | rnk0 = getRankNeedsDenseRank(c1, c2, _) | rnk0) } /** * Gets the `Ranked` value for which the dense rank in the context provided by * `c1` and `c2` is `rnk`. */ + pragma[nomagic] Ranked denseRank(C1 c1, C2 c2, int rnk) { - rnk = rankRank(c1, c2, result, getRank(c1, c2, result)) + rnk = rankRank(c1, c2, result, getRankNeedsDenseRank(c1, c2, result)) + or + exists(int i, int offset | + isDenseFrom(c1, c2, i) and + offset = i - 1 and + rnk = getRank(c1, c2, result) - offset + ) } }