Fix modify_column() issues (#2020)
diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php
index 06e47a6..bb1ee48 100644
--- a/system/database/DB_forge.php
+++ b/system/database/DB_forge.php
@@ -642,7 +642,7 @@
 			show_error('Field information is required.');
 		}
 
-		$sqls = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->fields);
+		$sqls = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->_process_fields());
 		$this->_reset();
 		if ($sqls === FALSE)
 		{
diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php
index 05762ba..9a7cdb8 100644
--- a/system/database/drivers/cubrid/cubrid_forge.php
+++ b/system/database/drivers/cubrid/cubrid_forge.php
@@ -108,12 +108,8 @@
 			}
 			else
 			{
-				$sqls[] = $sql.' CHANGE '.$this->_process_column($field[$i]);
-				if ( ! empty($field[$i]['new_name']))
-				{
-					$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
-						.' AS '.$this->db->escape_identifiers($field[$i]['name']);
-				}
+				$alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE ';
+				$sqls[] = $sql.$alter_type$this->_process_column($field[$i]);
 			}
 		}
 
@@ -139,7 +135,7 @@
 		}
 
 		return $this->db->escape_identifiers($field['name'])
-			.(empty($field['new_name']) ? '' : $this->db->escape_identifiers($field['new_name']))
+			.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))
 			.' '.$field['type'].$field['length']
 			.$field['unsigned']
 			.$field['null']
diff --git a/system/database/drivers/ibase/ibase_forge.php b/system/database/drivers/ibase/ibase_forge.php
index a0c4e65..39c7828 100644
--- a/system/database/drivers/ibase/ibase_forge.php
+++ b/system/database/drivers/ibase/ibase_forge.php
@@ -137,7 +137,7 @@
 
 		$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);
 		$sqls = array();
-		for ($i = 0, $c = count($field), $sql .= $alter_type.' '; $i < $c; $i++)
+		for ($i = 0, $c = count($field); $i < $c; $i++)
 		{
 			if ($field[$i]['_literal'] !== FALSE)
 			{
@@ -146,13 +146,14 @@
 
 			if (isset($field[$i]['type']))
 			{
-				$sqls[] = $sql.' TYPE '.$field[$i]['type'].$field[$i]['length'];
+				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identififers($field[$i]['name'])
+					.' TYPE '.$field[$i]['type'].$field[$i]['length'];
 			}
 
 			if ( ! empty($field[$i]['default']))
 			{
-				$sqls[] = $sql.' ALTER '.$this->db->escape_identifiers($field[$i]['name'])
-					.' SET '.$field[$i]['default'];
+				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
+					.' SET DEFAULT '.$field[$i]['default'];
 			}
 
 			if (isset($field[$i]['null']))
@@ -165,7 +166,7 @@
 
 			if ( ! empty($field[$i]['new_name']))
 			{
-				$sqls[] = $sql.' ALTER '.$this->db->escape_identifiers($field[$i]['name'])
+				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
 					.' TO '.$this->db->escape_identifiers($field[$i]['new_name']);
 			}
 		}
diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php
index 6c5dfc6..1e9145e 100644
--- a/system/database/drivers/mysql/mysql_forge.php
+++ b/system/database/drivers/mysql/mysql_forge.php
@@ -157,7 +157,7 @@
 		}
 
 		return $this->db->escape_identifiers($field['name'])
-			.(empty($field['new_name']) ? '' : $this->db->escape_identifiers($field['new_name']))
+			.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))
 			.' '.$field['type'].$field['length']
 			.$field['unsigned']
 			.$field['null']
diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php
index a70eef8..1a6e284 100644
--- a/system/database/drivers/mysqli/mysqli_forge.php
+++ b/system/database/drivers/mysqli/mysqli_forge.php
@@ -157,7 +157,7 @@
 		}
 
 		return $this->db->escape_identifiers($field['name'])
-			.(empty($field['new_name']) ? '' : $this->db->escape_identifiers($field['new_name']))
+			.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))
 			.' '.$field['type'].$field['length']
 			.$field['unsigned']
 			.$field['null']
diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php
index bd9d2df..a0efa95 100644
--- a/system/database/drivers/oci8/oci8_forge.php
+++ b/system/database/drivers/oci8/oci8_forge.php
@@ -105,7 +105,7 @@
 
 		$sql .= ' '.$alter_type.' ';
 		$sql .= (count($field) === 1)
-				? $fields[0]
+				? $field[0]
 				: '('.implode(',', $field).')';
 
 		// RENAME COLUMN must be executed after MODIFY
diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php
index e8421ec..cb7d9e6 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php
@@ -108,12 +108,8 @@
 			}
 			else
 			{
-				$sqls[] = $sql.' CHANGE '.$this->_process_column($field[$i]);
-				if ( ! empty($field[$i]['new_name']))
-				{
-					$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
-						.' AS '.$this->db->escape_identifiers($field[$i]['name']);
-				}
+				$alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE ';
+				$sqls[] = $sql.$alter_type.$this->_process_column($field[$i]);
 			}
 		}
 
@@ -139,7 +135,7 @@
 		}
 
 		return $this->db->escape_identifiers($field['name'])
-			.(empty($field['new_name']) ? '' : $this->db->escape_identifiers($field['new_name']))
+			.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))
 			.' '.$field['type'].$field['length']
 			.$field['unsigned']
 			.$field['null']
diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php
index 474188f..7b86de9 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php
@@ -123,7 +123,7 @@
 
 		$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);
 		$sqls = array();
-		for ($i = 0, $c = count($field), $sql .= $alter_type.' '; $i < $c; $i++)
+		for ($i = 0, $c = count($field); $i < $c; $i++)
 		{
 			if ($field[$i]['_literal'] !== FALSE)
 			{
@@ -132,13 +132,14 @@
 
 			if (isset($field[$i]['type']))
 			{
-				$sqls[] = $sql.' TYPE '.$field[$i]['type'].$field[$i]['length'];
+				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
+					.' TYPE '.$field[$i]['type'].$field[$i]['length'];
 			}
 
 			if ( ! empty($field[$i]['default']))
 			{
-				$sqls[] = $sql.' ALTER '.$this->db->escape_identifiers($field[$i]['name'])
-					.' SET '.$field[$i]['default'];
+				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
+					.' SET DEFAULT '.$field[$i]['default'];
 			}
 
 			if (isset($field[$i]['null']))
@@ -151,7 +152,7 @@
 
 			if ( ! empty($field[$i]['new_name']))
 			{
-				$sqls[] = $sql.' ALTER '.$this->db->escape_identifiers($field[$i]['name'])
+				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
 					.' TO '.$this->db->escape_identifiers($field[$i]['new_name']);
 			}
 		}
diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php
index 866b6fb..85d9445 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php
@@ -171,7 +171,7 @@
 		}
 
 		return $this->db->escape_identifiers($field['name'])
-			.(empty($field['new_name']) ? '' : $this->db->escape_identifiers($field['new_name']))
+			.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))
 			.' '.$field['type'].$field['length']
 			.$field['unsigned']
 			.$field['null']
diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php
index 8052d21..6d51a14 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php
@@ -105,7 +105,7 @@
 
 		$sql .= ' '.$alter_type.' ';
 		$sql .= (count($field) === 1)
-				? $fields[0]
+				? $field[0]
 				: '('.implode(',', $field).')';
 
 		// RENAME COLUMN must be executed after MODIFY
diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php
index 484c160..a24c898 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php
@@ -103,7 +103,7 @@
 
 		$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);
 		$sqls = array();
-		for ($i = 0, $c = count($field), $sql .= $alter_type.' '; $i < $c; $i++)
+		for ($i = 0, $c = count($field); $i < $c; $i++)
 		{
 			if ($field[$i]['_literal'] !== FALSE)
 			{
@@ -112,24 +112,25 @@
 
 			if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type']))
 			{
-				$sqls[] = $sql.' TYPE '.$field[$i]['type'].$field[$i]['length'];
+				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
+					.' TYPE '.$field[$i]['type'].$field[$i]['length'];
 			}
 
 			if ( ! empty($field[$i]['default']))
 			{
-				$sqls[] = $sql.' ALTER '.$this->db->escape_identifiers($field[$i]['name'])
-					.' SET '.$field[$i]['default'];
+				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
+					.' SET DEFAULT '.$field[$i]['default'];
 			}
 
 			if (isset($field[$i]['null']))
 			{
-				$sqls[] = $sql.' ALTER '.$this->db->escape_identifiers($field[$i]['name'])
+				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
 					.($field[$i]['null'] === TRUE ? ' DROP NOT NULL' : ' SET NOT NULL');
 			}
 
 			if ( ! empty($field[$i]['new_name']))
 			{
-				$sqls[] = $sql.' RENAME '.$this->db->escape_identifiers($field[$i]['name'])
+				$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
 					.' TO '.$this->db->escape_identifiers($field[$i]['new_name']);
 			}
 		}
diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php
index 425622f..5e37838 100644
--- a/system/database/drivers/postgre/postgre_forge.php
+++ b/system/database/drivers/postgre/postgre_forge.php
@@ -96,7 +96,7 @@
 
 		$sql = 'ALTER TABLE '.$this->db->escape_identifiers($table);
 		$sqls = array();
-		for ($i = 0, $c = count($field), $sql .= $alter_type.' '; $i < $c; $i++)
+		for ($i = 0, $c = count($field); $i < $c; $i++)
 		{
 			if ($field[$i]['_literal'] !== FALSE)
 			{
@@ -105,24 +105,25 @@
 
 			if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type']))
 			{
-				$sqls[] = $sql.' TYPE '.$field[$i]['type'].$field[$i]['length'];
+				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
+					.' TYPE '.$field[$i]['type'].$field[$i]['length'];
 			}
 
 			if ( ! empty($field[$i]['default']))
 			{
-				$sqls[] = $sql.' ALTER '.$this->db->escape_identifiers($field[$i]['name'])
-					.' SET '.$field[$i]['default'];
+				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
+					.' SET DEFAULT '.$field[$i]['default'];
 			}
 
 			if (isset($field[$i]['null']))
 			{
-				$sqls[] = $sql.' ALTER '.$this->db->escape_identifiers($field[$i]['name'])
+				$sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
 					.($field[$i]['null'] === TRUE ? ' DROP NOT NULL' : ' SET NOT NULL');
 			}
 
 			if ( ! empty($field[$i]['new_name']))
 			{
-				$sqls[] = $sql.' RENAME '.$this->db->escape_identifiers($field[$i]['name'])
+				$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
 					.' TO '.$this->db->escape_identifiers($field[$i]['new_name']);
 			}
 		}