From a405b10d681584039d8a9ca8a8ec8f23c6037118 Mon Sep 17 00:00:00 2001 From: Angie Byron <webchick@24967.no-reply.drupal.org> Date: Wed, 1 Sep 2010 01:28:41 +0000 Subject: [PATCH] #761976 by Berdir, jhedstrom, tpfeiffer, Damien Tournoud, Rob van den Bogaard, andypost: Fixed DatabaseSchema_pgsql()::changeField() is broken. --- includes/database/pgsql/schema.inc | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/includes/database/pgsql/schema.inc b/includes/database/pgsql/schema.inc index afe3a5672fb6..4c9ce4638c76 100644 --- a/includes/database/pgsql/schema.inc +++ b/includes/database/pgsql/schema.inc @@ -470,17 +470,30 @@ public function changeField($table, $field, $field_new, $spec, $new_keys = array if (in_array($typecast, array('serial', 'bigserial', 'numeric'))) { $typecast = 'int'; } - - - $this->connection->query("ALTER TABLE {" . $table . "} ALTER $field SET $field_new = CAST(" . $field . "_old as " . $typecast . ")"); - - $this->addField($table, "$field_new", $spec); - - $this->dropField($table, $field . '_old'); + $this->connection->query('ALTER TABLE {' . $table . '} ALTER "' . $field . '" TYPE ' . $typecast . ' USING "' . $field . '"::' . $typecast); + + // Map type definition to the PostgreSQL type. + $pgsql_type = $map[$spec['type'] . ':' . $spec['size']]; + if (in_array($pgsql_type, array('serial', 'bigserial'))) { + // Type "serial" is known to PostgreSQL, but *only* during table creation, + // not when altering. Because of that, the sequence needs to be created + // and initialized by hand. + $seq = "{" . $table . "}_" . $field_new . "_seq"; + $this->connection->query("CREATE SEQUENCE " . $seq); + // Set sequence to maximal field value to not conflict with existing + // entries. + $this->connection->query("SELECT setval('" . $seq . "', MAX(\"" . $field . '")) FROM {' . $table . "}"); + $this->connection->query('ALTER TABLE {' . $table . '} ALTER "' . $field . '" SET DEFAULT nextval(\'' . $seq . '\')'); + } // Rename the column if necessary. if ($field != $field_new) { - $this->connection->query('ALTER TABLE {' . $table . '} RENAME "' . $field . '" TO "' . $field_new . '_old"'); + $this->connection->query('ALTER TABLE {' . $table . '} RENAME "' . $field . '" TO "' . $field_new . '"'); + } + + // Change description if necessary. + if (!empty($spec['description'])) { + $this->connection->query('COMMENT ON COLUMN {' . $table . '}."' . $field_new . '" IS ' . $this->prepareComment($spec['description'])); } if (isset($new_keys)) { -- GitLab