diff options
author | Angie Byron <webchick@24967.no-reply.drupal.org> | 2010-11-29 19:57:57 +0000 |
---|---|---|
committer | Angie Byron <webchick@24967.no-reply.drupal.org> | 2010-11-29 19:57:57 +0000 |
commit | c1ea227f529512739f80f16b33969532f4218049 (patch) | |
tree | 6d6a024c749f4df201155a5f009201ed4a0f3e09 /includes/database/pgsql | |
parent | b2c5a8c864f9abd26c5cff8eb2421713cfb25841 (diff) | |
download | brdo-c1ea227f529512739f80f16b33969532f4218049.tar.gz brdo-c1ea227f529512739f80f16b33969532f4218049.tar.bz2 |
#851136: Committing missing files.
Diffstat (limited to 'includes/database/pgsql')
-rw-r--r-- | includes/database/pgsql/select.inc | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/includes/database/pgsql/select.inc b/includes/database/pgsql/select.inc new file mode 100644 index 000000000..98061c90a --- /dev/null +++ b/includes/database/pgsql/select.inc @@ -0,0 +1,109 @@ +<?php +// $Id$ + +/** + * @file + * Select builder for PostgreSQL database engine. + */ + +/** + * @ingroup database + * @{ + */ + +class SelectQuery_pgsql extends SelectQuery { + + public function orderRandom() { + $alias = $this->addExpression('RANDOM()', 'random_field'); + $this->orderBy($alias); + return $this; + } + + /** + * Overrides SelectQuery::orderBy(). + * + * PostgreSQL adheres strictly to the SQL-92 standard and requires that when + * using DISTINCT or GROUP BY conditions, fields and expressions that are + * ordered on also need to be selected. This is a best effort implementation + * to handle the cases that can be automated by adding the field if it is not + * yet selected. + * + * @code + * $query = db_select('node', 'n'); + * $query->join('node_revision', 'nr', 'n.vid = nr.vid'); + * $query + * ->distinct() + * ->fields('n') + * ->orderBy('timestamp'); + * @endcode + * + * In this query, it is not possible (without relying on the schema) to know + * whether timestamp belongs to node_revisions and needs to be added or + * belongs to node and is already selected. Queries like this will need to be + * corrected in the original query by adding an explicit call to + * SelectQuery::addField() or SelectQuery::fields(). + * + * Since this has a small performance impact, both by the additional + * processing in this function and in the database that needs to return the + * additional fields, this is done as an override instead of implementing it + * directly in SelectQuery::orderBy(). + */ + public function orderBy($field, $direction = 'ASC') { + // Call parent function to order on this. + $return = parent::orderBy($field, $direction); + + // If there is a table alias specified, split it up. + if (strpos($field, '.') !== FALSE) { + list($table, $table_field) = explode('.', $field); + } + // Figure out if the field has already been added. + foreach ($this->fields as $existing_field) { + if (!empty($table)) { + // If table alias is given, check if field and table exists. + if ($existing_field['table'] == $table && $existing_field['field'] == $table_field) { + return $return; + } + } + else { + // If there is no table, simply check if the field exists as a field or + // an aliased field. + if ($existing_field['alias'] == $field) { + return $return; + } + } + } + + // Also check expression aliases. + foreach ($this->expressions as $expression) { + if ($expression['alias'] == $field) { + return $return; + } + } + + // If a table loads all fields, it can not be added again. It would + // result in an ambigious alias error because that field would be loaded + // twice: Once through table_alias.* and once directly. If the field + // actually belongs to a different table, it must be added manually. + foreach ($this->tables as $table) { + if (!empty($table['all_fields'])) { + return $return; + } + } + + // If $field contains an characters which are not allowed in a field name + // it is considered an expression, these can't be handeld automatically + // either. + if ($this->connection->escapeField($field) != $field) { + return $return; + } + + // This is a case that can be handled automatically, add the field. + $this->addField(NULL, $field); + return $return; + } +} + +/** + * @} End of "ingroup database". + */ + |