public function alterColumn($table, $column, $type)
    {
        $columnName = $this->db->quoteColumnName($column);
        $tableName = $this->db->quoteTableName($table);

        // https://github.com/yiisoft/yii2/issues/4492
        // http://www.postgresql.org/docs/9.1/static/sql-altertable.html
        if (preg_match('/^(DROP|SET|RESET)\s+/i', $type)) {
            return "ALTER TABLE {$tableName} ALTER COLUMN {$columnName} {$type}";
        }

        $type = 'TYPE ' . $this->getColumnType($type);

        $multiAlterStatement = [];
        $constraintPrefix = preg_replace('/[^a-z0-9_]/i', '', $table . '_' . $column);

        if (preg_match('/\s+DEFAULT\s+(["\']?\w+["\']?)/i', $type, $matches)) {
            $type = preg_replace('/\s+DEFAULT\s+(["\']?\w+["\']?)/i', '', $type);
            $multiAlterStatement[] = "ALTER COLUMN {$columnName} SET DEFAULT {$matches[1]}";
        } else {
            // safe to drop default even if there was none in the first place
            $multiAlterStatement[] = "ALTER COLUMN {$columnName} DROP DEFAULT";
        }

        $type = preg_replace('/\s+NOT\s+NULL/i', '', $type, -1, $count);
        if ($count) {
            $multiAlterStatement[] = "ALTER COLUMN {$columnName} SET NOT NULL";
        } else {
            // remove additional null if any
            $type = preg_replace('/\s+NULL/i', '', $type);
            // safe to drop not null even if there was none in the first place
            $multiAlterStatement[] = "ALTER COLUMN {$columnName} DROP NOT NULL";
        }

        if (preg_match('/\s+CHECK\s+\((.+)\)/i', $type, $matches)) {
            $type = preg_replace('/\s+CHECK\s+\((.+)\)/i', '', $type);
            $multiAlterStatement[] = "ADD CONSTRAINT {$constraintPrefix}_check CHECK ({$matches[1]})";
        }

        $type = preg_replace('/\s+UNIQUE/i', '', $type, -1, $count);
        if ($count) {
            $multiAlterStatement[] = "ADD UNIQUE ({$columnName})";
        }

        // add what's left at the beginning
        array_unshift($multiAlterStatement, "ALTER COLUMN {$columnName} {$type}");

        return 'ALTER TABLE ' . $tableName . ' ' . implode(', ', $multiAlterStatement);
    }
public function alterColumn($table, $column, $type)
    {
        $columnName = $this->db->quoteColumnName($column);
        $tableName = $this->db->quoteTableName($table);

        // https://github.com/yiisoft/yii2/issues/4492
        // http://www.postgresql.org/docs/9.1/static/sql-altertable.html
        if (preg_match('/^(DROP|SET|RESET)\s+/i', $type)) {
            return "ALTER TABLE {$tableName} ALTER COLUMN {$columnName} {$type}";
        }

        $type = 'TYPE ' . $this->getColumnType($type);

        $multiAlterStatement = [];
        $constraintPrefix = preg_replace('/[^a-z0-9_]/i', '', $table . '_' . $column);

        if (preg_match('/\s+DEFAULT\s+(["\']?\w+["\']?)/i', $type, $matches)) {
            $type = preg_replace('/\s+DEFAULT\s+(["\']?\w+["\']?)/i', '', $type);
            $multiAlterStatement[] = "ALTER COLUMN {$columnName} SET DEFAULT {$matches[1]}";
        } else {
            // safe to drop default even if there was none in the first place
            $multiAlterStatement[] = "ALTER COLUMN {$columnName} DROP DEFAULT";
        }

        $type = preg_replace('/\s+NOT\s+NULL/i', '', $type, -1, $count);
        if ($count) {
            $multiAlterStatement[] = "ALTER COLUMN {$columnName} SET NOT NULL";
        } else {
            // remove additional null if any
            $type = preg_replace('/\s+NULL/i', '', $type);
            // safe to drop not null even if there was none in the first place
            $multiAlterStatement[] = "ALTER COLUMN {$columnName} DROP NOT NULL";
        }

        if (preg_match('/\s+CHECK\s+\((.+)\)/i', $type, $matches)) {
            $type = preg_replace('/\s+CHECK\s+\((.+)\)/i', '', $type);
            $multiAlterStatement[] = "ADD CONSTRAINT {$constraintPrefix}_check CHECK ({$matches[1]})";
        }

        $type = preg_replace('/\s+UNIQUE/i', '', $type, -1, $count);
        if ($count) {
            $multiAlterStatement[] = "ADD UNIQUE ({$columnName})";
        }

        // add what's left at the beginning
        array_unshift($multiAlterStatement, "ALTER COLUMN {$columnName} {$type}");

        return 'ALTER TABLE ' . $tableName . ' ' . implode(', ', $multiAlterStatement);
    }
public function alterColumn ( $ table , $ column , $ type ) { $ columnName = $ this -> db -> quoteColumnName ( $ column ) ; $ tableName = $ this -> db -> quoteTableName ( $ table ) ; // https://github.com/yiisoft/yii2/issues/4492 // http://www.postgresql.org/docs/9.1/static/sql-altertable.html if ( preg_match ( '/^(DROP|SET|RESET)\s+/i' , $ type ) ) { return "ALTER TABLE {$tableName} ALTER COLUMN {$columnName} {$type}" ; } $ type = 'TYPE ' . $ this -> getColumnType ( $ type ) ; $ multiAlterStatement = [ ] ; $ constraintPrefix = preg_replace ( '/[^a-z0-9_]/i' , '' , $ table . '_' . $ column ) ; if ( preg_match ( '/\s+DEFAULT\s+(["\']?\w+["\']?)/i' , $ type , $ matches ) ) { $ type = preg_replace ( '/\s+DEFAULT\s+(["\']?\w+["\']?)/i' , '' , $ type ) ; $ multiAlterStatement [ ] = "ALTER COLUMN {$columnName} SET DEFAULT {$matches[1]}" ; } else { // safe to drop default even if there was none in the first place $ multiAlterStatement [ ] = "ALTER COLUMN {$columnName} DROP DEFAULT" ; } $ type = preg_replace ( '/\s+NOT\s+NULL/i' , '' , $ type , - 1 , $ count ) ; if ( $ count ) { $ multiAlterStatement [ ] = "ALTER COLUMN {$columnName} SET NOT NULL" ; } else { // remove additional null if any $ type = preg_replace ( '/\s+NULL/i' , '' , $ type ) ; // safe to drop not null even if there was none in the first place $ multiAlterStatement [ ] = "ALTER COLUMN {$columnName} DROP NOT NULL" ; } if ( preg_match ( '/\s+CHECK\s+\((.+)\)/i' , $ type , $ matches ) ) { $ type = preg_replace ( '/\s+CHECK\s+\((.+)\)/i' , '' , $ type ) ; $ multiAlterStatement [ ] = "ADD CONSTRAINT {$constraintPrefix}_check CHECK ({$matches[1]})" ; } $ type = preg_replace ( '/\s+UNIQUE/i' , '' , $ type , - 1 , $ count ) ; if ( $ count ) { $ multiAlterStatement [ ] = "ADD UNIQUE ({$columnName})" ; } // add what's left at the beginning array_unshift ( $ multiAlterStatement , "ALTER COLUMN {$columnName} {$type}" ) ; return 'ALTER TABLE ' . $ tableName . ' ' . implode ( ', ' , $ multiAlterStatement ) ; }
Builds a SQL statement for changing the definition of a column.
@param string $table the table whose column is to be changed. The table name will be properly quoted by the method.
@param string $column the name of the column to be changed. The name will be properly quoted by the method.
@param string $type the new column type. The [[getColumnType()]] method will be invoked to convert abstract
column type (if any) into the physical one. Anything that is not recognized as abstract type will be kept
in the generated SQL. For example, 'string' will be turned into 'varchar(255)', while 'string not null'
will become 'varchar(255) not null'. You can also use PostgreSQL-specific syntax such as `SET NOT NULL`.
@return string the SQL statement for changing the definition of a column.
Builds a SQL statement for changing the definition of a column .