t('Test db_distinct_field in database.mysql.inc'), 'description' => t('Unit test of db_distinct_field ; see issue http://drupal.org/node/284392'), 'group' => t('Core'), ); } function testPrefixedRewrite() { $queries = array( array( 'query' => 'SELECT node.nid FROM node', 'expected' => 'SELECT DISTINCT(node.nid) FROM node', 'description' => t('Test field prefixed with table is rewritten'), ), ); $this->_testDistinctField($queries); } function testNonPrefixedRewrite() { $queries = array( array( 'query' => 'SELECT nid FROM node', 'expected' => 'SELECT DISTINCT(node.nid) FROM node', 'description' => t('Test field not prefixed with table is rewritten'), ), ); $this->_testDistinctField($queries); } function testNotFirstField() { $queries = array( array( 'query' => 'SELECT a, nid, b FROM node', 'expected' => 'SELECT a, DISTINCT(node.nid), b FROM node', 'description' => t('Test query gets rewritten when field is not the first field') ), ); $this->_testDistinctField($queries); } function testMixedCase() { $queries = array( array( 'query' => 'seLecT nId frOm NoDe', 'expected' => 'SELECT DISTINCT(node.nid) FROM NoDe', 'description' => t('Test mixed case spelling field is rewritten'), ), ); $this->_testDistinctField($queries); } function testPreviousDisctinct() { $queries = array( array( 'query' => 'SELECT DISTINCT(yo), nid FROM node', 'expected' => 'SELECT DISTINCT(yo), DISTINCT(node.nid) FROM node', 'description' => t('Test field is rewritten even with a previous DISTINCT declaration (on another field)'), ), ); $this->_testDistinctField($queries); } function testNotPrefixedAlreadyDistinct() { $queries = array( array( 'query' => 'SELECT DISTINCT(nid) FROM node', 'expected' => 'SELECT DISTINCT(nid) FROM node', 'description' => t('Test nothing is rewritten when the query already has the DISTINCT with the field name only'), ), ); $this->_testDistinctField($queries); } function testPrefixedAlreadyDistinct() { $queries = array( array( 'query' => 'SELECT DISTINCT(node.nid) AS nid FROM node', 'expected' => 'SELECT DISTINCT(node.nid) AS nid FROM node', 'description' => t('Test nothing is rewritten when the query already has the DISTINCT with the field prefixed by the table name'), ), ); $this->_testDistinctField($queries); } function testFieldInAs() { $queries = array( array( 'query' => 'SELECT something AS nid FROM node', 'expected' => 'SELECT something AS nid FROM node', 'description' => t('Test nothing is rewritten when the field name appears in a AS section'), ), ); $this->_testDistinctField($queries); } function testSubQueryNoTable() { $queries = array( array( 'query' => 'SELECT something FROM other WHERE j IN (SELECT node.nid FROM node)', 'expected' => 'SELECT something FROM other WHERE j IN (SELECT node.nid FROM node)', 'description' => t('Test sub-queries are not rewritten when the table is not present in the main SELECT'), ), ); $this->_testDistinctField($queries); } function testSubQueryWithTable() { $queries = array( array( 'query' => 'SELECT nid FROM other WHERE j IN (SELECT node.nid FROM node)', 'expected' => 'SELECT DISTINCT(node.nid) FROM other WHERE j IN (SELECT node.nid FROM node)', 'description' => t('Test sub-queries are not rewritten when the table is present in the main SELECT'), ), ); $this->_testDistinctField($queries); } function testFalseTablePrefix() { $queries = array( array( 'query' => 'SELECT yo_node.nid FROM node', 'expected' => 'SELECT yo_node.nid FROM node', 'description' => t('Test nothing is rewritten when using a table that ends in the name of the table to rewrite'), ), ); $this->_testDistinctField($queries); } function testFalseTableSuffix() { $queries = array( array( 'query' => 'SELECT node.nid_ FROM node', 'expected' => 'SELECT node.nid_ FROM node', 'description' => t('Test queries with fields starting like the one we want to rewrite do not get rewritten'), ), ); $this->_testDistinctField($queries); } function _testDistinctField($queries) { foreach ($queries as $q) { $r = db_distinct_field('node', 'nid', $q['query']); $this->assertEqual($q['expected'], $r, $q['description']); } } }