Browse Source

Create rename field statements in postgres

Refs #3622
nojimage 13 years ago
parent
commit
fbb1a812dd

+ 6 - 0
lib/Cake/Model/Datasource/Database/Postgres.php

@@ -526,6 +526,12 @@ class Postgres extends DboSource {
 								$default = isset($col['default']) ? $col['default'] : null;
 								$nullable = isset($col['null']) ? $col['null'] : null;
 								unset($col['default'], $col['null']);
+								if ($field !== $col['name']) {
+									$newName = $this->name($col['name']);
+									$out .= "\tRENAME {$fieldName} TO {$newName};\n";
+									$out .= 'ALTER TABLE ' . $this->fullTableName($curTable) . " \n";
+									$fieldName = $newName;
+								}
 								$colList[] = 'ALTER COLUMN ' . $fieldName . ' TYPE ' . str_replace(array($fieldName, 'NOT NULL'), '', $this->buildColumn($col));
 								if (isset($nullable)) {
 									$nullable = ($nullable) ? 'DROP NOT NULL' : 'SET NOT NULL';

+ 15 - 0
lib/Cake/Test/Case/Model/Datasource/Database/PostgresTest.php

@@ -740,6 +740,21 @@ class PostgresTest extends CakeTestCase {
 	}
 
 /**
+ * Test the alterSchema  RENAME statements
+ *
+ * @return void
+ */
+	public function testAlterSchemaRenameTo() {
+		$query = $this->Dbo->alterSchema(array(
+			'posts' => array('change' => array('title' => array('name' => 'subject', 'type' => 'string', 'null' => false)))
+			));
+		$this->assertRegExp('/RENAME "title" TO "subject";/i', $query);
+		$this->assertRegExp('/ALTER COLUMN "subject" TYPE /i', $query);
+		$this->assertNotRegExp('/;\n\tALTER COLUMN "subject" TYPE /i', $query);
+		$this->assertNotRegExp('/ALTER COLUMN "title" TYPE "subject"/i', $query);
+	}
+
+/**
  * Test it is possible to use virtual field with postgresql
  *
  * @return void