text: // MySQL Column Compiler
  // -------
  import inherits from 'inherits';
  import ColumnCompiler from '../../../schema/columncompiler';
  
  import { assign } from 'lodash';
  
  function supportsPreciseTimestamps(client) {
    if (!client.version) {
      const message =
        'To get rid of this warning you should specify the mysql dialect version in ' +
        'your knex configuration. Currently this defaults to 5.5, but in a future ' +
        'release it will default to 5.6 which supports high precision timestamps. ' +
        'See http://knexjs.org/#Schema-timestamps for more information.';
      client.logger.warn(message);
    }
  
    return client.version && parseFloat(client.version) > 5.5;
  }
  
  function ColumnCompiler_MySQL() {
    ColumnCompiler.apply(this, arguments);
    this.modifiers = [
      'unsigned',
      'nullable',
      'defaultTo',
      'comment',
      'collate',
      'first',
      'after',
    ];
  }
  inherits(ColumnCompiler_MySQL, ColumnCompiler);
  
  // Types
  // ------
  
  assign(ColumnCompiler_MySQL.prototype, {
    increments: 'int unsigned not null auto_increment primary key',
  
    bigincrements: 'bigint unsigned not null auto_increment primary key',
  
    bigint: 'bigint',
  
    double(precision, scale) {
      if (!precision) return 'double';
      return `double(${this._num(precision, 8)}, ${this._num(scale, 2)})`;
    },
  
    integer(length) {
      length = length ? `(${this._num(length, 11)})` : '';
      return `int${length}`;
    },
  
    mediumint: 'mediumint',
  
    smallint: 'smallint',
  
    tinyint(length) {
      length = length ? `(${this._num(length, 1)})` : '';
      return `tinyint${length}`;
    },
  
    text(column) {
      switch (column) {
        case 'medium':
        case 'mediumtext':
          return 'mediumtext';
        case 'long':
        case 'longtext':
          return 'longtext';
        default:
          return 'text';
      }
    },
  
    mediumtext() {
      return this.text('medium');
    },
  
    longtext() {
      return this.text('long');
    },
  
    enu(allowed) {
      return `enum('${allowed.join("', '")}')`;
    },
  
    datetime() {
      return supportsPreciseTimestamps(this.client) ? 'datetime(6)' : 'datetime';
    },
  
    timestamp() {
      return supportsPreciseTimestamps(this.client)
        ? 'timestamp(6)'
        : 'timestamp';
    },
  
    bit(length) {
      return length ? `bit(${this._num(length)})` : 'bit';
    },
  
    binary(length) {
      return length ? `varbinary(${this._num(length)})` : 'blob';
    },
  
    json() {
      return 'json';
    },
  
    // Modifiers
    // ------
  
    defaultTo(value) {
      const defaultVal = ColumnCompiler_MySQL.super_.prototype.defaultTo.apply(
        this,
        arguments
      );
      if (this.type !== 'blob' && this.type.indexOf('text') === -1) {
        return defaultVal;
      }
      return '';
    },
  
    unsigned() {
      return 'unsigned';
    },
  
    comment(comment) {
      if (comment && comment.length > 255) {
        this.client.logger.warn(
          'Your comment is longer than the max comment length for MySQL'
        );
      }
      return comment && `comment '${comment}'`;
    },
  
    first() {
      return 'first';
    },
  
    after(column) {
      return `after ${this.formatter.wrap(column)}`;
    },
  
    collate(collation) {
      return collation && `collate '${collation}'`;
    },
  });
  
  export default ColumnCompiler_MySQL;
  