Skip to content

Conversation

@yakirgb
Copy link

@yakirgb yakirgb commented Nov 8, 2025

This patch fixes digest normalization for unary operators after comparison operators and CASE keywords.

Queries like "WHERE a = 1" and "WHERE a = -1" now correctly produce the same digest, which is important for proper query grouping in Performance Schema.

Files modified:

  • sql/gen_lex_token.cc (marks comparison operators and CASE keywords as start_expr)
  • mysql-test/suite/perfschema/t/unary_digest.test
  • mysql-test/suite/perfschema/r/unary_digest.result

Simple test:

USE performance_schema;
SELECT
STATEMENT_DIGEST_TEXT('SELECT * FROM t WHERE a = 1') =
STATEMENT_DIGEST_TEXT('SELECT * FROM t WHERE a = -1') AS digests_match;

SELECT
STATEMENT_DIGEST_TEXT('SELECT * FROM t WHERE a < 1') =
STATEMENT_DIGEST_TEXT('SELECT * FROM t WHERE a < -1') AS digests_match;

SELECT
STATEMENT_DIGEST_TEXT('SELECT CASE WHEN a > 0 THEN 1 END FROM t') =
STATEMENT_DIGEST_TEXT('SELECT CASE WHEN a > 0 THEN -1 END FROM t') AS digests_match;

SELECT
STATEMENT_DIGEST_TEXT('SELECT CASE WHEN a > 0 THEN 1 ELSE 2 END FROM t') = STATEMENT_DIGEST_TEXT('SELECT CASE WHEN a > 0 THEN -1 ELSE -2 END FROM t') AS digests_match;

Thank you,
Yakir Gibraltar

…n operators and CASE keywords

https://perconadev.atlassian.net/browse/PS-10289

This patch marks comparison operators (=, <=>, !=, <>, <, >, <=, >=) and
CASE keywords (THEN, ELSE) as start_expr tokens in sql/gen_lex_token.cc.
This ensures unary +/- operators following these keywords are properly
reduced during digest normalization.

The issue caused queries like "WHERE a = 1" and "WHERE a = -1" to produce
different digests. With this fix, both queries now correctly produce the
same digest.
@yakirgb
Copy link
Author

yakirgb commented Nov 19, 2025

Hi, @percona-ysorokin WDYT?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant