Skip to content

fix: query() returned null instead of 0 for statements affecting 0 rows#325

Open
chloe-pomegranate wants to merge 1 commit intoWordPress:trunkfrom
chloe-pomegranate:fix/null-returned-instead-of-zero
Open

fix: query() returned null instead of 0 for statements affecting 0 rows#325
chloe-pomegranate wants to merge 1 commit intoWordPress:trunkfrom
chloe-pomegranate:fix/null-returned-instead-of-zero

Conversation

@chloe-pomegranate
Copy link

@chloe-pomegranate chloe-pomegranate commented Mar 6, 2026

Summary

Fixes #322

WP_SQLite_Driver::query() returned null instead of 0 for statements affecting zero rows (e.g., DELETE FROM x WHERE id = 1 when no matching row exists). This caused wpdb::query() to also return null, breaking its documented contract of returning int|bool.

Problem

In WP_SQLite_Driver::query(), the return logic for non-SELECT queries was:

  1. rowCount() > 0 - return row count
  2. Otherwise - return null

This meant any DELETE, UPDATE, INSERT statement with 0 affected rows returned null instead of 0.

Fix

Simplified the logic to always return rowCount() for non-SELECT statements.

DELETE / UPDATE / INSERT will now correctly returns 0 instead of null when no rows affected.
CREATE / ALTER / DROP / TRUNCATE now returns 0 instead of null, but wp-includes/sqlite/class-wp-sqlite-db.php never reads this value for these queries (it returns true unconditionally at line 448-449)

Testing

  • Added testDeleteReturnsZeroAffectedRowsWhenNoMatchingRows - verifies DELETE returns 0 when no rows match.
  • Added testUpdateReturnsZeroAffectedRowsWhenNoMatchingRows - verifies UPDATE returns 0 when no rows match.
  • Updated existing test assertions from assertNull to assertSame( 0, ... ) to reflect the corrected behaviour
  • Full test suite passes (777 tests)

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.

null returned instead of 0 for DELETE queries with no matching rows in WP_SQLite_Driver

1 participant