From a0015d8affd2929e1e83df6010e5af83829a9752 Mon Sep 17 00:00:00 2001
From: Tim Schumacher <tschumacher@tourevo-software.com>
Date: Fri, 27 Nov 2009 19:01:08 +0100
Subject: [PATCH] Fixed the postgres bug, if an alias is longer than 63 chars.

---
 .../sites/all/modules/views/includes/query.inc     |   26 ++++++++++++++++----
 .../sites/all/modules/views/includes/view.inc      |    6 ++++
 2 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/trunk/src/drupal/sites/all/modules/views/includes/query.inc b/trunk/src/drupal/sites/all/modules/views/includes/query.inc
index 02457a8..8ffc400 100644
--- a/trunk/src/drupal/sites/all/modules/views/includes/query.inc
+++ b/trunk/src/drupal/sites/all/modules/views/includes/query.inc
@@ -938,8 +938,24 @@ class views_query {
 
     $has_aggregate = FALSE;
     $non_aggregates = array();
-
-    foreach ($fields_array as $field) {
+    $too_long_fields = array();
+    foreach ($fields_array as $field_name => $field) {
+      // If aliases are longer than 63 chars, postgres cut them off
+      // and Views does cannot find the results. So we need to limit
+      // ourself here and make the aliases <= 63 chars.
+      if (strlen($field['alias']) > 63) {
+        $safe_alias_prefix = substr($field['alias'],0,60);
+        if (array_key_exists($safe_alias_prefix,$too_long_fields)) {
+          $too_long_fields[$safe_alias_prefix]++;
+        } else {
+          $too_long_fields[$safe_alias_prefix] = 0;
+        }
+        $this->fields[$field_name]['safe_alias'] = sprintf("%s_%d",$safe_alias_prefix,$too_long_fields[$safe_alias_prefix]);
+        $field['safe_alias'] = $this->fields[$field_name]['safe_alias'];
+      } else {
+        $this->fields[$field_name]['safe_alias'] = $field['alias'];
+        $field['safe_alias'] = $this->fields[$field_name]['safe_alias'];
+      }
       if ($fields) {
         $fields .= ",\n   ";
       }
@@ -950,7 +966,7 @@ class views_query {
       $string .= $field['field'];
 
       // store for use with non-aggregates below
-      $fieldname = (!empty($field['alias']) ? $field['alias'] : $string);
+      $fieldname = (!empty($field['safe_alias']) ? $field['safe_alias'] : $string);
 
       if (!empty($field['distinct'])) {
         $string = "DISTINCT($string)";
@@ -968,8 +984,8 @@ class views_query {
       else {
         $non_aggregates[] = $fieldname;
       }
-      if ($field['alias']) {
-        $string .= " AS $field[alias]";
+      if ($field['safe_alias']) {
+        $string .= " AS $field[safe_alias]";
       }
       $fields .= $string;
 
diff --git a/trunk/src/drupal/sites/all/modules/views/includes/view.inc b/trunk/src/drupal/sites/all/modules/views/includes/view.inc
index 8b92389..c10c09c 100644
--- a/trunk/src/drupal/sites/all/modules/views/includes/view.inc
+++ b/trunk/src/drupal/sites/all/modules/views/includes/view.inc
@@ -771,6 +771,12 @@ class view extends views_db_object {
 
         $this->result = array();
         while ($item = db_fetch_object($result)) {
+          // translate safe_alias back to normal alias
+          foreach($this->query->fields as $field) {
+            if ($field['alias'] != $field['safe_alias']) {
+              $item->{$field['alias']} = $item->{$field['safe_alias']};
+            }
+          }
           $this->result[] = $item;
         }
         if (!empty($external)) {
-- 
1.6.3.3

