 includes/database/database.inc             |   13 ++++++++
 includes/database/pgsql/query.inc          |   45 ++++++++++++++++++++++++++++
 includes/database/select.inc               |    4 +-
 modules/simpletest/tests/entity_query.test |   12 +++++--
 4 files changed, 68 insertions(+), 6 deletions(-)

diff --git a/includes/database/database.inc b/includes/database/database.inc
index 933ceb2..8e25f6e 100644
--- a/includes/database/database.inc
+++ b/includes/database/database.inc
@@ -810,6 +810,19 @@ abstract class DatabaseConnection extends PDO {
   }
 
   /**
+   * Escapes a alias name string.
+   *
+   * Force all alias names to be strictly alphanumeric-plus-underscore. In
+   * contrast to escapeField()/Table, this doesn't allow the point.
+   *
+   * @return
+   *   The sanitized field name string.
+   */
+  public function escapeAlias($field) {
+    return preg_replace('/[^A-Za-z0-9_]+/', '', $field);
+  }
+
+  /**
    * Escapes characters that work as wildcard characters in a LIKE pattern.
    *
    * The wildcard characters "%" and "_" as well as backslash are prefixed with
diff --git a/includes/database/pgsql/query.inc b/includes/database/pgsql/query.inc
index 8825229..f1d1e28 100644
--- a/includes/database/pgsql/query.inc
+++ b/includes/database/pgsql/query.inc
@@ -189,4 +189,49 @@ class SelectQuery_pgsql extends SelectQuery {
     return $this;
   }
 
+  /**
+   * Overrides SelectQuery::orderBy().
+   *
+   * Automatically adds columns that are ordered on as fields.
+   */
+  public function orderBy($field, $direction = 'ASC') {
+    $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 ($existing_field['field'] == $field) {
+          return $return;
+        }
+      }
+    }
+
+    // If there is a table which loads all fields, we can't do this because we
+    // might produce illegal aliases.
+    foreach ($this->tables as $table) {
+      if (!empty($table['all_fields'])) {
+        return $return;
+      }
+    }
+
+    // If the field is actually an expression, it can not be added 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;
+  }
+
+
 }
diff --git a/includes/database/select.inc b/includes/database/select.inc
index 893e162..5de5d8c 100644
--- a/includes/database/select.inc
+++ b/includes/database/select.inc
@@ -1373,10 +1373,10 @@ class SelectQuery extends Query implements SelectQueryInterface {
     foreach ($this->fields as $alias => $field) {
       // Always use the AS keyword for field aliases, as some
       // databases require it (e.g., PostgreSQL).
-      $fields[] = (isset($field['table']) ? $this->connection->escapeTable($field['table']) . '.' : '') . $this->connection->escapeField($field['field']) . ' AS ' . $this->connection->escapeField($field['alias']);
+      $fields[] = (isset($field['table']) ? $this->connection->escapeTable($field['table']) . '.' : '') . $this->connection->escapeField($field['field']) . ' AS ' . $this->connection->escapeAlias($field['alias']);
     }
     foreach ($this->expressions as $alias => $expression) {
-      $fields[] = $expression['expression'] . ' AS ' . $expression['alias'];
+      $fields[] = $expression['expression'] . ' AS ' . $this->connection->escapeAlias($expression['alias']);
     }
     $query .= implode(', ', $fields);
 
diff --git a/modules/simpletest/tests/entity_query.test b/modules/simpletest/tests/entity_query.test
index f1c9e64..5890cb7 100644
--- a/modules/simpletest/tests/entity_query.test
+++ b/modules/simpletest/tests/entity_query.test
@@ -501,16 +501,20 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase {
     $query = new EntityFieldQuery();
     $query
       ->entityCondition('entity_type', 'test_entity_bundle_key')
-      ->propertyCondition('ftid', 1, 'CONTAINS');
+      ->propertyCondition('fttype', 'und', 'CONTAINS');
     $this->assertEntityFieldQuery($query, array(
       array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
     ), t('Test the "contains" operation on a property.'));
 
     $query = new EntityFieldQuery();
-    $query->fieldCondition($this->fields[0], 'value', 3, 'CONTAINS');
+    $query->fieldCondition($this->fields[1], 'shape', 'uar', 'CONTAINS');
     $this->assertEntityFieldQuery($query, array(
-      array('test_entity_bundle_key', 3),
-      array('test_entity', 3),
+      array('test_entity_bundle', 5),
     ), t('Test the "contains" operation on a field.'));
 
     $query = new EntityFieldQuery();
