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.31.2~80 X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=commitdiff_plain;h=7065200b036d4bbf0c46f4b236d761a79b57215e;hp=e62a8361d75344ab15e8def60cb7f2c6c4db2adb 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 (cherry picked from commit c5a5b022400318e52638a4d34369ddbb74d7a21b) --- diff --git a/includes/libs/rdbms/database/Database.php b/includes/libs/rdbms/database/Database.php index 896774f16c..2b5aaf59da 100644 --- a/includes/libs/rdbms/database/Database.php +++ b/includes/libs/rdbms/database/Database.php @@ -1503,14 +1503,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 cf10801c49..ab2f11b5ea 100644 --- a/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php +++ b/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php @@ -2047,4 +2047,21 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase { $this->assertLastSql( 'BEGIN; SELECT 1; COMMIT' ); $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 e328cba6aa..444a946e39 100644 --- a/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php +++ b/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php @@ -609,4 +609,5 @@ class DatabaseTest extends PHPUnit\Framework\TestCase { $this->db->dbSchema( $old ); $this->assertNotEquals( 'xxx', $this->db->dbSchema() ); } + }