Page MenuHomePhabricator

PostgreSQL boolean values are not consistent with MySQL
Closed, ResolvedPublic

Description

PostgreSQL boolean expressions return "t" for true and "f" for false.

MySQL:

> var_dump(wfGetDB(DB_PRIMARY)->selectRow('',['false' => '1=0', 'true' => '1=1'],''));
object(stdClass)#982 (2) {
  ["false"]=>
  string(1) "0"
  ["true"]=>
  string(1) "1"
}

SQLite:

> var_dump(wfGetDB(DB_PRIMARY)->selectRow('',['false' => '1=0', 'true' => '1=1'],''));
object(stdClass)#353 (2) {
  ["false"]=>
  string(1) "0"
  ["true"]=>
  string(1) "1"
}

PostgreSQL:

> var_dump(wfGetDB(DB_PRIMARY)->selectRow('',['false' => '1=0', 'true' => '1=1'],''));
object(stdClass)#348 (2) {
  ["false"]=>
  string(1) "f"
  ["true"]=>
  string(1) "t"
}

PostgreSQL alone returns a value which is not falsey in PHP. I believe this can and should be hacked around in PostgresResultWrapper. There is pg_field_type().

Event Timeline

Change 978152 had a related patch set uploaded (by Tim Starling; author: Tim Starling):

[mediawiki/core@master] rdbms: Map PostgreSQL boolean values to MySQL-compatible forms

https://gerrit.wikimedia.org/r/978152

Change 978152 merged by jenkins-bot:

[mediawiki/core@master] rdbms: Map PostgreSQL boolean values to MySQL-compatible forms

https://gerrit.wikimedia.org/r/978152