diff --git a/includes/database/pgsql/database.inc b/includes/database/pgsql/database.inc
index 67b49fe..648860e 100644
--- a/includes/database/pgsql/database.inc
+++ b/includes/database/pgsql/database.inc
@@ -150,6 +150,48 @@ class DatabaseConnection_pgsql extends DatabaseConnection {
     return $tablename;
   }
 
+  /**
+   * Escapes a field name string.
+   *
+   * Force all field names to be strictly alphanumeric-plus-underscore.
+   * The pgsql database drivers supports wrapping the field name in
+   * double quotes.
+   *
+   * @return
+   * The sanitized field name string.
+   */
+  public function escapeField($field) {
+    $escaped = preg_replace('/[^A-Za-z0-9_.]+/', '', $field);
+
+    // Check for beginning and ending double quote.
+    if (preg_match('/^["]/', $field) && preg_match('/["]$/', $field)) {
+      $escaped = '"' . $escaped . '"';
+    }
+
+    return $escaped;
+  }
+
+  /**
+   * Escapes an alias name string.
+   *
+   * Force all alias names to be strictly alphanumeric-plus-underscore. In
+   * contrast to DatabaseConnection::escapeField() /
+   * DatabaseConnection::escapeTable(), this doesn't allow the period (".")
+   * because that is not allowed in aliases.
+   *
+   * @return
+   * The sanitized field name string.
+   */
+  public function escapeAlias($field) {
+    $escaped = preg_replace('/[^A-Za-z0-9_]+/', '', $field);
+    // Check for beginning and ending double quote.
+    if (preg_match('/^["]/', $field) && preg_match('/["]$/', $field)) {
+      $escaped = '"' . $escaped . '"';
+    }
+
+    return $escaped;
+  }
+
   public function driver() {
     return 'pgsql';
   }
diff --git a/includes/database/pgsql/schema.inc b/includes/database/pgsql/schema.inc
index 49adbf9..e608031 100644
--- a/includes/database/pgsql/schema.inc
+++ b/includes/database/pgsql/schema.inc
@@ -155,6 +155,9 @@ class DatabaseSchema_pgsql extends DatabaseSchema {
     // Add column comments.
     foreach ($table['fields'] as $field_name => $field) {
       if (!empty($field['description'])) {
+        if (preg_match('/[A-Z]/', $field_name)) {
+          $field_name = '"' . $field_name . '"';
+        }
         $statements[] = 'COMMENT ON COLUMN {' . $name . '}.' . $field_name . ' IS ' . $this->prepareComment($field['description']);
       }
     }
@@ -175,7 +178,8 @@ class DatabaseSchema_pgsql extends DatabaseSchema {
    *    The field specification, as per the schema data structure format.
    */
   protected function createFieldSql($name, $spec) {
-    $sql = $name . ' ' . $spec['pgsql_type'];
+    // PostgreSQL converts names into lowercase, unless quoted.
+    $sql = '"' . $name . '" ' . $spec['pgsql_type'];
 
     if (isset($spec['type']) && $spec['type'] == 'serial') {
       unset($spec['not null']);
