diff -Naur views-orig/includes/query.inc views/includes/query.inc
--- views-orig/includes/query.inc	2009-12-02 23:59:18.000000000 +0100
+++ views/includes/query.inc	2010-09-08 15:47:45.000000000 +0200
@@ -641,11 +641,18 @@
       $alias = $table . '_' . $field;
     }
 
-    $name = $alias ? $alias : $field;
+    $alias = $alias ? $alias : $field;
+
+    // PostgreSQL truncates aliases to 63 characters: http://drupal.org/node/571548
+
+    // We limit the length of the original alias up to 60 characters
+    // from the end to give a better chance of being a unique alias.
+    if (strlen($alias) > 60) {
+      $alias = substr($alias, strlen($alias) - 60, 60);
+    }
 
-    // @todo FIXME -- $alias, then $name is inconsistent
     if (empty($this->fields[$alias])) {
-      $this->fields[$name] = array(
+      $this->fields[$alias] = array(
         'field' => $field,
         'table' => $table,
         'alias' => $alias,
@@ -653,10 +660,10 @@
     }
 
     foreach ((array)$params as $key => $value) {
-      $this->fields[$name][$key] = $value;
+      $this->fields[$alias][$key] = $value;
     }
 
-    return $name;
+    return $alias;
   }
 
   /**
@@ -833,7 +840,7 @@
     }
 
     if ($field) {
-      $this->add_field($table, $field, $as);
+      $as = $this->add_field($table, $field, $as, $params);
     }
 
     $this->orderby[] = "$as " . strtoupper($order);
