db->escape_identifiers($table); $sqls = array(); for ($i = 0, $c = count($field); $i < $c; $i++) { if ($field[$i]['_literal'] !== false) { $field[$i] = "\n\t" . $field[$i]['_literal']; } else { $field[$i]['_literal'] = "\n\t" . $this->_process_column($field[$i]); if (! empty($field[$i]['comment'])) { $sqls[] = 'COMMENT ON COLUMN ' . $this->db->escape_identifiers($table) . '.' . $this->db->escape_identifiers($field[$i]['name']) . ' IS ' . $field[$i]['comment']; } if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name'])) { $sqls[] = $sql . ' RENAME COLUMN ' . $this->db->escape_identifiers($field[$i]['name']) . ' TO ' . $this->db->escape_identifiers($field[$i]['new_name']); } $field[$i] = "\n\t" . $field[$i]['_literal']; } } $sql .= ' ' . $alter_type . ' '; $sql .= (count($field) === 1) ? $field[0] : '(' . implode(',', $field) . ')'; // RENAME COLUMN must be executed after MODIFY array_unshift($sqls, $sql); return $sqls; } // -------------------------------------------------------------------- /** * Field attribute AUTO_INCREMENT * * @param array &$attributes * @param array &$field * @return void */ protected function _attr_auto_increment(&$attributes, &$field) { if (! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === true && stripos($field['type'], 'number') !== false && version_compare($this->db->version(), '12.1', '>=')) { $field['auto_increment'] = ' GENERATED ALWAYS AS IDENTITY'; } } // -------------------------------------------------------------------- /** * Process column * * @param array $field * @return string */ protected function _process_column($field) { return $this->db->escape_identifiers($field['name']) . ' ' . $field['type'] . $field['length'] . $field['unsigned'] . $field['default'] . $field['auto_increment'] . $field['null'] . $field['unique']; } // -------------------------------------------------------------------- /** * Field attribute TYPE * * Performs a data type mapping between different databases. * * @param array &$attributes * @return void */ protected function _attr_type(&$attributes) { switch (strtoupper($attributes['TYPE'])) { case 'TINYINT': $attributes['TYPE'] = 'NUMBER'; return; case 'MEDIUMINT': $attributes['TYPE'] = 'NUMBER'; return; case 'INT': $attributes['TYPE'] = 'NUMBER'; return; case 'BIGINT': $attributes['TYPE'] = 'NUMBER'; return; default: return; } } }