123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter

Relationships & Source Files
Namespace Children
Classes:
Extension / Inclusion / Inheritance Descendants
Subclasses:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Inherits: ActiveRecord::ConnectionAdapters::AbstractAdapter
Defined in: activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb

Constant Summary

::ActiveSupport::Callbacks - Included

CALLBACK_FILTER_TYPES

AbstractAdapter - Inherited

ADAPTER_NAME, SIMPLE_INT

Class Attribute Summary

Class Method Summary

AbstractAdapter - Inherited

::ActiveSupport::DescendantsTracker - Inherited

clear, descendants, direct_descendants,
store_inherited

This is the only method that is not thread safe, but is only ever called during the eager loading phase.

Instance Attribute Summary

AbstractAdapter - Inherited

#active?

Checks whether the connection to the database is still active.

#in_use?
#logger, #owner, #pool, #prepared_statements,
#requires_reloading?

Returns true if its required to reload the connection between requests for development mode.

#schema_cache, #schema_cache=, #supports_bulk_alter?,
#supports_ddl_transactions?

Does this adapter support DDL rollbacks in transactions? That is, would CREATE TABLE or ALTER TABLE get rolled back by a transaction?

#supports_explain?

Does this adapter support explain?

#supports_extensions?

Does this adapter support database extensions?

#supports_foreign_keys?

Does this adapter support creating foreign key constraints?

#supports_index_sort_order?

Does this adapter support index sort order?

#supports_indexes_in_create?

Does this adapter support creating indexes in the same statement as creating the table?

#supports_migrations?

Does this adapter support migrations?

#supports_partial_index?

Does this adapter support partial indices?

#supports_primary_key?

Can this adapter determine the primary key for tables not attached to an Active Record class, such as join tables?

#supports_savepoints?

Does this adapter support savepoints?

#supports_transaction_isolation?

Does this adapter support setting the isolation level for a transaction?

#supports_views?

Does this adapter support views?

#visitor

DatabaseStatements - Included

#begin_transaction, #commit_transaction, #current_transaction, #open_transactions, #rollback_transaction,
#supports_statement_cache?

Returns true when the connection adapter supports prepared statement caching, otherwise returns false

#transaction_open?, #within_new_transaction

Instance Method Summary

AbstractAdapter - Inherited

#adapter_name

Returns the human-readable name of the adapter.

#case_insensitive_comparison, #case_sensitive_comparison, #case_sensitive_modifier,
#clear_cache!

Clear any caching the database adapter may be doing, for example clearing the prepared statement cache.

#close

Check the connection back in to the connection pool.

#collector, #create_savepoint, #current_savepoint_name,
#disable_extension

This is meant to be implemented by the adapters that support extensions.

#disable_referential_integrity

Override to turn off referential integrity while executing &block.

#disconnect!

Disconnects from the database if already connected.

#enable_extension

This is meant to be implemented by the adapters that support extensions.

#expire,
#extensions

A list of extensions, to be filled in by adapters that support them.

#index_algorithms

A list of index algorithms, to be filled by adapters that support them.

#lease, #new_column,
#prefetch_primary_key?

Should primary key values be selected from their corresponding sequence before the insert statement? If true, next_sequence_value is called before each insert to set the record's primary key.

#raw_connection

Provides access to the underlying database driver for this adapter.

#reconnect!

Disconnects from the database if already connected, and establishes a new connection with the database.

#release_savepoint,
#reset!

Reset the state of this connection, directing the DBMS to clear transactions and other connection-related server-side state.

#schema_creation,
#substitute_at

Returns a bind substitution value given a bind column NOTE: The column param is currently being used by the sqlserver-adapter.

#unprepared_statement, #valid_type?,
#verify!

Checks whether the connection to the database is still active (i.e. not stale).

ColumnDumper - Included

#column_spec,
#migration_keys

Lists the valid migration options.

#prepare_column_options

This can be overridden on a Adapter level basis to support other extended datatypes (Example: Adding an array option in the PostgreSQLAdapter).

::ActiveSupport::Callbacks - Included

#run_callbacks

Runs the callbacks for the given event.

::ActiveRecord::QueryCache - Included

DatabaseLimits - Included

#allowed_index_name_length

Returns the maximum allowed length for an index name.

#column_name_length

Returns the maximum length of a column name.

#columns_per_multicolumn_index

Returns the maximum number of columns in a multicolumn index.

#columns_per_table

Returns the maximum number of columns per table.

#in_clause_length

Returns the maximum number of elements in an IN (x,y,z) clause.

#index_name_length

Returns the maximum length of an index name.

#indexes_per_table

Returns the maximum number of indexes per table.

#joins_per_query

Returns maximum number of joins in a single query.

#sql_query_length

Returns the maximum length of an SQL query.

#table_alias_length

Returns the maximum length of a table alias.

#table_name_length

Returns the maximum length of a table name.

Quoting - Included

#quote

Quotes the column value to help prevent SQL injection attacks.

#quote_column_name

Quotes the column name.

#quote_string

Quotes a string, escaping any ' (single quote) and \ (backslash) characters.

#quote_table_name

Quotes the table name.

#quote_table_name_for_assignment

Override to return the quoted table name for assignment.

#quoted_date, #quoted_false, #quoted_true,
#type_cast

Cast a value to a type that the database understands.

#unquoted_false, #unquoted_true

DatabaseStatements - Included

#add_transaction_record

Register a record with the current transaction so that its after_commit and after_rollback callbacks can be called.

#begin_db_transaction

Begins the transaction (and turns off auto-committing).

#begin_isolated_db_transaction

Begins the transaction with the isolation level set.

#commit_db_transaction

Commits the transaction (and turns on auto-committing).

#default_sequence_name,
#delete

Executes the delete statement and returns the number of rows affected.

#empty_insert_statement_value,
#exec_delete

Executes delete sql statement in the context of this connection using binds as the bind substitutes.

#exec_insert

Executes insert sql statement in the context of this connection using binds as the bind substitutes.

#exec_query

Executes sql statement in the context of this connection using binds as the bind substitutes.

#exec_update

Executes update sql statement in the context of this connection using binds as the bind substitutes.

#execute

Executes the SQL statement in the context of this connection.

#initialize,
#insert

Returns the last auto-generated ID from the affected table.

#insert_fixture

Inserts the given fixture into the table.

#reset_sequence!

Set the sequence to the max value of the table's column.

#rollback_db_transaction

Rolls back the transaction (and turns on auto-committing).

#rollback_to_savepoint,
#sanitize_limit

Sanitizes the given LIMIT parameter in order to prevent SQL injection.

#select_all

Returns an ::ActiveRecord::Result instance.

#select_one

Returns a record hash with the column names as keys and column values as values.

#select_rows

Returns an array of arrays containing the field values.

#select_value

Returns a single value from a record.

#select_values

Returns an array of the values of the first column in a select:

#to_sql

Converts an arel AST to SQL.

#transaction

Runs the given block in a database transaction, and returns the result of the block.

#transaction_isolation_levels, #transaction_state,
#truncate

Executes the truncate statement.

#update

Executes the update statement and returns the number of rows affected.

SchemaStatements - Included

#add_belongs_to
#add_column

Adds a new column to the named table.

#add_foreign_key

Adds a new foreign key.

#add_index

Adds a new index to the table.

#add_reference

Adds a reference.

#add_timestamps

Adds timestamps (created_at and updated_at) columns to table_name.

#assume_migrated_upto_version,
#change_column

Changes the column's definition according to the new options.

#change_column_default

Sets a new default value for a column:

#change_column_null

Sets or removes a NOT NULL constraint on a column.

#change_table

A block for changing columns in table.

#column_exists?

Checks to see if a column exists in a given table.

#columns

Returns an array of Column objects for the table specified by table_name.

#create_join_table

Creates a new join table with the name created using the lexical order of the first two arguments.

#create_table

Creates a new table with the name table_name.

#data_source_exists?

Checks to see if the data source name exists on the database.

#data_sources

Returns the relation names useable to back Active Record models.

#drop_join_table

Drops the join table specified by the given arguments.

#drop_table

Drops a table from the database.

#foreign_keys

Returns an array of foreign keys for the given table.

#index_exists?

Checks to see if an index exists on a table for a given index definition.

#index_name_exists?

Verifies the existence of an index with a given name.

#initialize_schema_migrations_table

Should not be called normally, but this operation is non-destructive.

#native_database_types

Returns a hash of mappings from the abstract data types to the native database types.

#remove_belongs_to
#remove_column

Removes the column from the table definition.

#remove_columns

Removes the given columns from the table definition.

#remove_foreign_key

Removes the given foreign key from the table.

#remove_index

Removes the given index from the table.

#remove_reference

Removes the reference(s).

#remove_timestamps

Removes the timestamp columns (created_at and updated_at) from the table definition.

#rename_column

Renames a column.

#rename_index

Renames an index.

#rename_table

Renames a table.

#table_alias_for

Truncates a table alias according to the limits of the current adapter.

#table_exists?

Checks to see if the table table_name exists on the database.

Constructor Details

.new(connection, logger, connection_options, config) ⇒ AbstractMysqlAdapter

FIXME: Make the first parameter more similar for the two adapters

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 168

def initialize(connection, logger, connection_options, config)
  super(connection, logger)
  @connection_options, @config = connection_options, config
  @quoted_column_names, @quoted_table_names = {}, {}

  @visitor = Arel::Visitors::MySQL.new self

  if self.class.type_cast_config_to_boolean(config.fetch(:prepared_statements) { true })
    @prepared_statements = true
  else
    @prepared_statements = false
  end
end

Class Attribute Details

.emulate_booleans (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 139

class_attribute :emulate_booleans

.emulate_booleans?Boolean (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 139

class_attribute :emulate_booleans

Instance Attribute Details

#emulate_booleans (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 139

class_attribute :emulate_booleans

#emulate_booleans?Boolean (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 139

class_attribute :emulate_booleans

#strict_mode?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 682

def strict_mode?
  self.class.type_cast_config_to_boolean(@config.fetch(:strict, true))
end

#supports_datetime_with_precision?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 221

def supports_datetime_with_precision?
  version >= '5.6.4'
end

#supports_foreign_keys?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 213

def supports_foreign_keys?
  true
end

#supports_index_sort_order?Boolean (readonly)

Technically MySQL allows to create indexes with the sort order syntax but at the moment (5.5) it doesn't yet implement them

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 197

def supports_index_sort_order?
  true
end

#supports_indexes_in_create?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 209

def supports_indexes_in_create?
  true
end

#supports_migrations?Boolean (readonly)

Returns true, since this connection adapter supports migrations.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 183

def supports_migrations?
  true
end

#supports_primary_key?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 187

def supports_primary_key?
  true
end

#supports_transaction_isolation?Boolean (readonly)

MySQL 4 technically support transaction isolation, but it is affected by a bug where the transaction level gets persisted for the whole session:

bugs.mysql.com/bug.php?id=39170

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 205

def supports_transaction_isolation?
  version >= '5.0.0'
end

#supports_views?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 217

def supports_views?
  version >= '5.0.0'
end

Instance Method Details

#begin_db_transaction

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 332

def begin_db_transaction
  execute "BEGIN"
end

#begin_isolated_db_transaction(isolation)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 336

def begin_isolated_db_transaction(isolation)
  execute "SET TRANSACTION ISOLATION LEVEL #{transaction_isolation_levels.fetch(isolation)}"
  begin_db_transaction
end

#case_insensitive_comparison(table, attribute, column, value)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 659

def case_insensitive_comparison(table, attribute, column, value)
  if column.case_sensitive?
    super
  else
    table[attribute].eq(value)
  end
end

#case_sensitive_comparison(table, attribute, column, value)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 651

def case_sensitive_comparison(table, attribute, column, value)
  if column.case_sensitive?
    table[attribute].eq(value)
  else
    super
  end
end

#case_sensitive_modifier(node, table_attribute)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 646

def case_sensitive_modifier(node, table_attribute)
  node = Arel::Nodes.build_quoted node, table_attribute
  Arel::Nodes::Bin.new(node)
end

#change_column_null(table_name, column_name, null, default = nil)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 528

def change_column_null(table_name, column_name, null, default = nil)
  column = column_for(table_name, column_name)

  unless null || default.nil?
    execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
  end

  change_column table_name, column_name, column.sql_type, :null => null
end

#charset

Returns the database character set.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 404

def charset
  show_variable 'character_set_database'
end

#clear_cache!

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 310

def clear_cache!
  super
  reload_type_map
end

#collation

Returns the database collation strategy.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 409

def collation
  show_variable 'collation_database'
end

#create_database(name, options = {})

Create a new MySQL database with optional :charset and :collation. Charset defaults to utf8.

Example:

create_database 'charset_test', charset: 'latin1', collation: 'latin1_bin'
create_database 'matt_development'
create_database 'matt_development', charset: :big5
[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 383

def create_database(name, options = {})
  if options[:collation]
    execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}` COLLATE `#{options[:collation]}`"
  else
    execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}`"
  end
end

#current_database

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 399

def current_database
  select_value 'SELECT DATABASE() as db'
end

#data_source_exists?(name)

Alias for #table_exists?.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 442

alias data_source_exists? table_exists?

#data_sources(name = nil, database = nil, like = nil)

Alias for #tables.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 422

alias data_sources tables

#drop_table(table_name, options = {})

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 509

def drop_table(table_name, options = {})
  execute "DROP#{' TEMPORARY' if options[:temporary]} TABLE #{quote_table_name(table_name)}#{' CASCADE' if options[:force] == :cascade}"
end

#empty_insert_statement_value

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 361

def empty_insert_statement_value
  "VALUES ()"
end

#execute(sql, name = nil)

Executes the SQL statement in the context of this connection.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 316

def execute(sql, name = nil)
  log(sql, name) { @connection.query(sql) }
end

#foreign_keys(table_name)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 552

def foreign_keys(table_name)
  fk_info = select_all <<-SQL.strip_heredoc
    SELECT fk.referenced_table_name as 'to_table'
          ,fk.referenced_column_name as 'primary_key'
          ,fk.column_name as 'column'
          ,fk.constraint_name as 'name'
    FROM information_schema.key_column_usage fk
    WHERE fk.referenced_column_name is not null
      AND fk.table_schema = '#{@config[:database]}'
      AND fk.table_name = '#{table_name}'
  SQL

  create_table_info = select_one("SHOW CREATE TABLE #{quote_table_name(table_name)}")["Create Table"]

  fk_info.map do |row|
    options = {
      column: row['column'],
      name: row['name'],
      primary_key: row['primary_key']
    }

    options[:on_update] = extract_foreign_key_action(create_table_info, row['name'], "UPDATE")
    options[:on_delete] = extract_foreign_key_action(create_table_info, row['name'], "DELETE")

    ForeignKeyDefinition.new(table_name, row['to_table'], options)
  end
end

#index_algorithms

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 229

def index_algorithms
  { default: 'ALGORITHM = DEFAULT', copy: 'ALGORITHM = COPY', inplace: 'ALGORITHM = INPLACE' }
end

#native_database_types

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 225

def native_database_types
  NATIVE_DATABASE_TYPES
end

#pk_and_sequence_for(table)

Returns a table's primary key and belonging sequence.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 628

def pk_and_sequence_for(table)
  execute_and_free("SHOW CREATE TABLE #{quote_table_name(table)}", 'SCHEMA') do |result|
    create_table = each_hash(result).first[:"Create Table"]
    if create_table.to_s =~ /PRIMARY KEY\s(?:USING\s\w\s)?\((.+)\)/
      keys = $1.split(",").map { |key| key.delete('`"') }
      keys.length == 1 ? [keys.first, nil] : nil
    else
      nil
    end
  end
end

#primary_key(table)

Returns just a table's primary key

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 641

def primary_key(table)
  pk_and_sequence = pk_and_sequence_for(table)
  pk_and_sequence && pk_and_sequence.first
end

#quoted_date(value)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 285

def quoted_date(value)
  if supports_datetime_with_precision? && value.acts_like?(:time) && value.respond_to?(:usec)
    "#{super}.#{sprintf("%06d", value.usec)}"
  else
    super
  end
end

#quoted_false

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 277

def quoted_false
  QUOTED_FALSE
end

#quoted_true

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 269

def quoted_true
  QUOTED_TRUE
end

#recreate_database(name, options = {})

Drops the database specified on the name attribute and creates it again using the provided options.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 369

def recreate_database(name, options = {})
  drop_database(name)
  sql = create_database(name, options)
  reconnect!
  sql
end

#rename_index(table_name, old_name, new_name)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 513

def rename_index(table_name, old_name, new_name)
  if supports_rename_index?
    validate_index_length!(table_name, new_name)

    execute "ALTER TABLE #{quote_table_name(table_name)} RENAME INDEX #{quote_table_name(old_name)} TO #{quote_table_name(new_name)}"
  else
    super
  end
end

#rename_table(table_name, new_name)

Renames a table.

Example:

rename_table('octopuses', 'octopi')
[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 504

def rename_table(table_name, new_name)
  execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}"
  rename_table_indexes(table_name, new_name)
end

#schema_creation

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 57

def schema_creation
  SchemaCreation.new self
end

#show_variable(name)

SHOW VARIABLES LIKE 'name'

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 620

def show_variable(name)
  variables = select_all("select @@#{name} as 'Value'", 'SCHEMA')
  variables.first['Value'] unless variables.empty?
rescue ActiveRecord::StatementInvalid
  nil
end

#table_exists?(name) ⇒ Boolean Also known as: #data_source_exists?

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 428

def table_exists?(name)
  return false unless name.present?
  return true if tables(nil, nil, name).any?

  name          = name.to_s
  schema, table = name.split('.', 2)

  unless table # A table was provided without a schema
    table  = schema
    schema = nil
  end

  tables(nil, schema, table).any?
end

#truncate(table_name, name = nil)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 424

def truncate(table_name, name = nil)
  execute "TRUNCATE TABLE #{quote_table_name(table_name)}", name
end

#type_to_sql(type, limit = nil, precision = nil, scale = nil)

Maps logical ::Rails types to MySQL-specific data types.

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 581

def type_to_sql(type, limit = nil, precision = nil, scale = nil)
  case type.to_s
  when 'binary'
    case limit
    when 0..0xfff;           "varbinary(#{limit})"
    when nil;                "blob"
    when 0x1000..0xffffffff; "blob(#{limit})"
    else raise(ActiveRecordError, "No binary type has character length #{limit}")
    end
  when 'integer'
    case limit
    when 1; 'tinyint'
    when 2; 'smallint'
    when 3; 'mediumint'
    when nil, 4, 11; 'int(11)'  # compatibility with MySQL default
    when 5..8; 'bigint'
    else raise(ActiveRecordError, "No integer type has byte size #{limit}")
    end
  when 'text'
    case limit
    when 0..0xff;               'tinytext'
    when nil, 0x100..0xffff;    'text'
    when 0x10000..0xffffff;     'mediumtext'
    when 0x1000000..0xffffffff; 'longtext'
    else raise(ActiveRecordError, "No text type has character length #{limit}")
    end
  when 'datetime'
    return super unless precision

    case precision
      when 0..6; "datetime(#{precision})"
      else raise(ActiveRecordError, "No datetime type has precision of #{precision}. The allowed range of precision is from 0 to 6.")
    end
  else
    super
  end
end

#unquoted_false

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 281

def unquoted_false
  0
end

#unquoted_true

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 273

def unquoted_true
  1
end

#valid_type?(type) ⇒ Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 686

def valid_type?(type)
  !native_database_types[type].nil?
end