From: Brad Jorsch Date: Wed, 17 Oct 2018 15:26:51 +0000 (-0400) Subject: Database: Allow selectFieldValues() to accept SQL fragments X-Git-Tag: 1.34.0-rc.0~3738 X-Git-Url: http://git.cyclocoop.org//%27http:/code.google.com/p/ie7-js//%27?a=commitdiff_plain;h=c5a5b022400318e52638a4d34369ddbb74d7a21b;p=lhc%2Fweb%2Fwiklou.git Database: Allow selectFieldValues() to accept SQL fragments The documentation says "This must be a valid SQL fragment", but as written it breaks if given anything other than a field name. It's easy enough to fix by adding an alias to the internal select() call. Bug: T201781 Change-Id: I76428af6d3aadc266254fdb24109a0ac2db3761f --- diff --git a/includes/libs/rdbms/database/Database.php b/includes/libs/rdbms/database/Database.php index 3d23a83d4f..c436b640c1 100644 --- a/includes/libs/rdbms/database/Database.php +++ b/includes/libs/rdbms/database/Database.php @@ -1544,14 +1544,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $options = [ $options ]; } - $res = $this->select( $table, $var, $cond, $fname, $options, $join_conds ); + $res = $this->select( $table, [ 'value' => $var ], $cond, $fname, $options, $join_conds ); if ( $res === false ) { return false; } $values = []; foreach ( $res as $row ) { - $values[] = $row->$var; + $values[] = $row->value; } return $values; diff --git a/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php b/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php index 4488d9e9fe..4a9603c816 100644 --- a/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php +++ b/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php @@ -2139,4 +2139,21 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase { $this->assertLastSql( 'BEGIN; SELECT 1; ROLLBACK' ); $this->assertEquals( 0, $this->database->trxLevel() ); } + + /** + * @covers Wikimedia\Rdbms\Database::selectFieldValues() + */ + public function testSelectFieldValues() { + $this->database->forceNextResult( [ + (object)[ 'value' => 'row1' ], + (object)[ 'value' => 'row2' ], + (object)[ 'value' => 'row3' ], + ] ); + + $this->assertSame( + [ 'row1', 'row2', 'row3' ], + $this->database->selectFieldValues( 'table', 'table.field', 'conds', __METHOD__ ) + ); + $this->assertLastSql( 'SELECT table.field AS value FROM table WHERE conds' ); + } } diff --git a/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php b/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php index 762812c8c2..bd1c1126c9 100644 --- a/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php +++ b/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php @@ -681,4 +681,5 @@ class DatabaseTest extends PHPUnit\Framework\TestCase { $this->assertSame( $oldPrefix, $this->db->tablePrefix() ); $this->assertSame( $oldDomain, $this->db->getDomainId() ); } + }