/**
  * generates the sql for altering an existing table on postgresql
  *
  * @param string $name          name of the table that is intended to be changed.
  * @param array $changes        associative array that contains the details of each type      *
  * @param boolean $check        indicates whether the function should just check if the DBMS driver
  *                              can perform the requested table alterations if the value is true or
  *                              actually perform them otherwise.
  * @see Doctrine_Export::alterTable()
  * @return array
  * @override
  */
 public function getAlterTableSql($name, array $changes, $check = false)
 {
     foreach ($changes as $changeName => $change) {
         switch ($changeName) {
             case 'add':
             case 'remove':
             case 'change':
             case 'name':
             case 'rename':
                 break;
             default:
                 throw DoctrineException::alterTableChangeNotSupported($changeName);
         }
     }
     if ($check) {
         return true;
     }
     $sql = array();
     if (isset($changes['add']) && is_array($changes['add'])) {
         foreach ($changes['add'] as $fieldName => $field) {
             $query = 'ADD ' . $this->getColumnDeclarationSql($fieldName, $field);
             $sql[] = 'ALTER TABLE ' . $name . ' ' . $query;
         }
     }
     if (isset($changes['remove']) && is_array($changes['remove'])) {
         foreach ($changes['remove'] as $fieldName => $field) {
             $query = 'DROP ' . $fieldName;
             $sql[] = 'ALTER TABLE ' . $name . ' ' . $query;
         }
     }
     if (isset($changes['change']) && is_array($changes['change'])) {
         foreach ($changes['change'] as $fieldName => $field) {
             if (isset($field['type'])) {
                 $serverInfo = $this->getServerVersion();
                 if (is_array($serverInfo) && $serverInfo['major'] < 8) {
                     throw DoctrineException::changeColumnRequiresPostgreSQL8OrAbove($field['type']);
                 }
                 $query = 'ALTER ' . $fieldName . ' TYPE ' . $this->getTypeDeclarationSql($field['definition']);
                 $sql[] = 'ALTER TABLE ' . $name . ' ' . $query;
             }
             if (array_key_exists('default', $field)) {
                 $query = 'ALTER ' . $fieldName . ' SET DEFAULT ' . $this->quote($field['definition']['default'], $field['definition']['type']);
                 $sql[] = 'ALTER TABLE ' . $name . ' ' . $query;
             }
             if (!empty($field['notnull'])) {
                 $query = 'ALTER ' . $fieldName . ' ' . ($field['definition']['notnull'] ? 'SET' : 'DROP') . ' NOT NULL';
                 $sql[] = 'ALTER TABLE ' . $name . ' ' . $query;
             }
         }
     }
     if (isset($changes['rename']) && is_array($changes['rename'])) {
         foreach ($changes['rename'] as $fieldName => $field) {
             $sql[] = 'ALTER TABLE ' . $name . ' RENAME COLUMN ' . $fieldName . ' TO ' . $field['name'];
         }
     }
     if (isset($changes['name'])) {
         $sql[] = 'ALTER TABLE ' . $name . ' RENAME TO ' . $changes['name'];
     }
     return $sql;
 }