db_add_field

Versions
6 db_add_field(&$ret, $table, $field, $spec, $new_keys = array())

Add a new field to a table.

Parameters

$ret Array to which query results will be added.

$table Name of the table to be altered.

$field Name of the field to be added.

$spec The field specification array, as taken from a schema definition. The specification may also contain the key 'initial', the newly created field will be set to the value of the key in all rows. This is most useful for creating NOT NULL columns with no default value in existing tables.

$new_keys Optional keys and indexes specification to be created on the table along with adding the field. The format is the same as a table specification but without the 'fields' element. If you are adding a type 'serial' field, you MUST specify at least one key or index including it in this array. See db_change_field() for more explanation why.

Code

includes/database.pgsql.inc, line 667

<?php
function db_add_field(&$ret, $table, $field, $spec, $new_keys = array()) {
  $fixnull = FALSE;
  if (!empty($spec['not null']) && !isset($spec['default'])) {
    $fixnull = TRUE;
    $spec['not null'] = FALSE;
  }
  $query = 'ALTER TABLE {' . $table . '} ADD COLUMN ';
  $query .= _db_create_field_sql($field, _db_process_field($spec));
  $ret[] = update_sql($query);
  if (isset($spec['initial'])) {
    // All this because update_sql does not support %-placeholders.
    $sql = 'UPDATE {' . $table . '} SET ' . $field . ' = ' . db_type_placeholder($spec['type']);
    $result = db_query($sql, $spec['initial']);
    $ret[] = array(
      'success' => $result !== FALSE,
      'query' => check_plain($sql . ' (' . $spec['initial'] . ')'),
    );
  }
  if ($fixnull) {
    $ret[] = update_sql("ALTER TABLE {" . $table . "} ALTER $field SET NOT NULL");
  }
  if (isset($new_keys)) {
    _db_create_keys($ret, $table, $new_keys);
  }
}
?>
Login or register to post comments