How to change data type from varchar to text? I'm trying to change the data type of column "mail" from table "simplenews_subscriber" from varchar to text using hook_update_N but its not getting reflected.

/**
 * Implements hook_schema().
 */
function simplenews_schema() {
  $schema['simplenews_subscriber'] = array(
    'description' =&gt; 'Subscribers to {simplenews_category}. Many-to-many relation via {simplenews_subscription}',
    'fields' =&gt; array(
      'snid' =&gt; array(
        'description' =&gt; 'Primary key: Unique subscriber ID.',
        'type' =&gt; 'serial',
        'not null' =&gt; TRUE,
      ),
      'activated' =&gt; array(
        'description' =&gt; 'Boolean indicating the status of the subscription.',
        'type' =&gt; 'int',
        'size' =&gt; 'tiny',
        'not null' =&gt; TRUE,
        'default' =&gt; 0,
      ),
      'mail' =&gt; array(
        'description' =&gt; "The subscriber's email address.",
        'type' =&gt; 'varchar',
        'length' =&gt; 64,
        'not null' =&gt; TRUE,
        'default' =&gt; '',
      ),
      'uid' =&gt; array(
        'description' =&gt; 'The {users}.uid that has the same email address.',
        'type' =&gt; 'int',
        'not null' =&gt; TRUE,
        'default' =&gt; 0,
      ),
      'language' =&gt; array(
        'type' =&gt; 'varchar',
        'length' =&gt; 12,
        'not null' =&gt; TRUE,
        'default' =&gt; '',
        'description' =&gt; 'Subscriber preferred language.',
      ),
      'timestamp' =&gt; array(
        'description' =&gt; 'UNIX timestamp of when the user is (un)subscribed.',
        'type' =&gt; 'int',
        'unsigned' =&gt; TRUE,
        'not null' =&gt; TRUE,
        'default' =&gt; 0,
      ),
      'changes' =&gt; array(
        'description' =&gt; 'Contains the requested subscription changes',
        'type' =&gt; 'text',
        'serialize' =&gt; TRUE,
      ),
      'created' =&gt; array(
        'description' =&gt; 'UNIX timestamp of when the subscription record was added.',
        'type' =&gt; 'int',
        'unsigned' =&gt; TRUE,
        'not null' =&gt; TRUE,
        'default' =&gt; 0,
      ),
    ),
    'primary key' =&gt; array('snid'),
    'indexes' =&gt; array(
      'mail' =&gt; array('mail'),
      'uid' =&gt; array('uid'),
    ),
    'foreign keys' =&gt; array(
      'uid' =&gt; array(
        'table' =&gt; 'users',
        'columns' =&gt; array('uid' =&gt; 'uid'),
      ),
    ),
  );

  return $schema;
}


Update Hook:

function MY_MODULE_update_7001() {
  db_drop_index('simplenews_subscriber', 'mail');
  db_change_field('simplenews_subscriber', 'mail', 'mail', array(
    'type' =&gt; 'text',
    'size' =&gt; 'medium',
    )
  );
}


Any help of this will be appreciated.
You are missing recreating the index.
Also you can use your schema changes:

$schema = drupal_get_schema_unprocessed('my_module', 'simplenews_subscriber');
db_change_field('simplenews_subscriber', 'mail', 'mail', $schema['simplenews_subscriber']['fields']['mail']);


Another thing you can do is test out altering the table manually just so you can see what errors are popping up.