Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Match MySQL mixed-type result and comparison semantics for IF(), CASE, and IFNULL()

Open
#519 0 comments 0 reactions 1 assignee View on GitHub

Maintainers usually reply within 1 day

@JanJakes is already working on this.

Since Oct 6, 2026.

Assessment

This issue has not been assessed yet.

Description

Summary

Implement MySQL-compatible mixed-type result conversion and comparison semantics for IF(), CASE, and IFNULL().

This is a pre-existing compatibility gap, separate from the IF() condition-evaluation bug in #517. Keep #518 focused on that bug. Build this follow-up on the comparison work in #508.

Reproduction and rationale

SELECT IF(1, 2, '3') = '2';

MySQL returns 1. The raw SQLite translation returns 0:

SELECT CASE WHEN 1 THEN 2 ELSE '3' END = '2';

SQLite preserves the selected branch's integer storage class. MySQL applies result-type rules across the branches. Related mixed-type conversion gaps affect CASE and IFNULL().

An unconditional text cast can fix this example but break numeric comparisons. The solution must account for both result-type rules and the surrounding comparison semantics.

Required changes

  • Determine MySQL result-type and comparison rules for mixed numeric, string, and NULL values in IF(), CASE, and IFNULL().
  • Extend the translator and comparison handling from #508 to reproduce those rules consistently.
  • Preserve lazy evaluation of unselected branches and fallback expressions.
  • Add regression tests against MySQL reference results for string comparisons, numeric comparisons, NULLs, nested expressions, and column-derived values.
  • Avoid an unconditional text cast as the general solution.

Affected areas

  • packages/mysql-on-sqlite/src/sqlite/class-wp-mysql-on-sqlite.php: translate_runtime_function_call(), expression translation, and comparison handling.
  • packages/mysql-on-sqlite/tests/WP_MySQL_On_SQLite_Tests.php: regression coverage for IF(), CASE, and IFNULL().

Acceptance criteria

  • SELECT IF(1, 2, '3') = '2' returns 1, matching MySQL.
  • Mixed-type string and numeric comparison cases for all three constructs match MySQL reference results.
  • NULL handling and lazy evaluation remain correct.
  • Existing IF() condition-evaluation and comparison tests continue to pass.

Context

Requested by @JanJakes.

Dominant language
PHP
Stars
362
Forks
67
Avg merge
1d 19h
Merged PRs (30d)
5

Getting set up

Open in Codespaces

Starts the project's dev container in your browser, under your own GitHub account.

  • No Dockerfile or Docker Compose file
  • No pull request template
  • No contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from WordPress/sqlite-database-integration

All issues in WordPress/sqlite-database-integration

Similar issues

More PHP issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.