Conversation
|
Thank you for your pull request and welcome to our community! To contribute, please sign the Oracle Contributor Agreement (OCA).
To sign the OCA, please create an Oracle account and sign the OCA in Oracle's Contributor Agreement Application. When signing the OCA, please provide your GitHub username. After signing the OCA and getting an OCA approval from Oracle, this PR will be automatically updated. If you are an Oracle employee, please make sure that you are a member of the main Oracle GitHub organization, and your membership in this organization is public. |
Integer key conversion can silently round a REAL value or numeric string while reporting success. Compare the stored key with the original predicate value before using a MIN/MAX shortcut or removing a residual equality from a ref lookup. Both checks are needed when aggregate optimization falls back to ordinary indexed execution. Covers Bug#120535, Bug#121226 and Bug#120734. Add native regressions for the reported query, equivalent controls, and repeated prepared-statement execution. Preserve observable results across the affected execution paths. Bug report: https://bugs.mysql.com/bug.php?id=120535 Bug report: https://bugs.mysql.com/bug.php?id=121226 Bug report: https://bugs.mysql.com/bug.php?id=120734
48d02be to
6301403
Compare
|
Thank you for signing the OCA. |
|
/codex |
|
✅ Codex PR Review completed successfully! Warning Firewall blocked 1 domainThe following domain was blocked by the firewall during workflow execution:
To allow these domains, add them to the network:
allowed:
- defaults
- "ab.chatgpt.com"See Network Configuration for more information.
|
There was a problem hiding this comment.
Found one correctness gap: the new MIN/MAX guard only covers BIGINT, leaving silently rounded equality keys usable for the other integer types. The inline comment includes a concrete query and the missing regression coverage.
Reviewed the two optimizer changes and the added tests statically. No PR code or scripts were executed. CI status could not be read because the tool's access policy rejected that request.
Warning
Firewall blocked 1 domain
The following domain was blocked by the firewall during workflow execution:
ab.chatgpt.com
To allow these domains, add them to the network.allowed list in your workflow frontmatter:
network:
allowed:
- defaults
- "ab.chatgpt.com"See Network Configuration for more information.
Generated by Codex PR Review for #784 · codex · gpt60 · 139.9 AIC · ⌖ 24.2 AIC · ⊞ 14K
Comment /codex to run again
|
|
||
| // Storing a nonintegral value in BIGINT can round it without reporting | ||
| // truncation. An equality lookup must use the value of the predicate. | ||
| if (eq_type && part->field->type() == MYSQL_TYPE_LONGLONG && |
There was a problem hiding this comment.
[P2] Apply the MIN/MAX round-trip check to all integer types
The MYSQL_TYPE_LONGLONG restriction leaves the same wrong-result path open for TINYINT, SMALLINT, MEDIUMINT and INT. Their store(double) implementations also round with rint() and return TYPE_OK. For example:
CREATE TABLE t (x INT, KEY k(x));
INSERT INTO t VALUES (1), (2);
SELECT MIN(x), MAX(x) FROM t FORCE INDEX(k)
WHERE x = CAST(1.5 AS DOUBLE);Tracing this query shows that constant folding leaves the CAST expression intact, matching_cond() accepts the rounded key 2, and the MIN/MAX lookup returns 2, 2 instead of NULL, NULL. The ref-lookup fix is bypassed because aggregate optimization completes the query. Please use is_integer_type(part->field->type()) here and extend the aggregate regression coverage beyond BIGINT. This finding is based on static analysis; the query was not executed.
What does this change do?
Integer key conversion can silently round a REAL value or numeric string while reporting success. Compare the stored key with the original predicate value before using a MIN/MAX shortcut or removing a residual equality from a ref lookup. Both checks are needed when aggregate optimization falls back to ordinary indexed execution. Covers Bug#120535, Bug#121226 and Bug#120734.
Bug report: https://bugs.mysql.com/bug.php?id=120535
Bug report: https://bugs.mysql.com/bug.php?id=121226
Bug report: https://bugs.mysql.com/bug.php?id=120734
Why is it needed?
The affected execution path returns a different query result from the equivalent reference. The change preserves the expression or access-path semantics described above.
How was it tested?
On
trunkata1ef44f1d327b940a763b25eee2c6e146a0ebdb0:The unmodified server fails the new regression with a result mismatch.
The patched server builds successfully.
121 query-result checks pass against separately established expected results, including repeated prepared statements.
Native MTR passes:
main.bug_120535,main.select_count,main.subselect,main.type_decimal,main.type_float,main.func_group,main.group_by,main.group_min_max_innodb.The regression passes with the prepared-statement protocol.
The full database regression suite was not run.
Added MTR coverage under
mysql-test/.Ran
scripts/ci/mtr.shwith its default selection; the explicit native and related tests above were run instead.Ran the full database regression suite.
Contributor checklist
.clang-format.AI assistance
OpenAI Codex assisted with implementation, regression test generation and review. The submitted change was checked with compilation, execution against independently established expected results, a failing unpatched regression, and the MTR tests listed above. No human review is claimed by these automated checks.
Areas touched
mysql-test, sql