Method: ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#check_constraints

Defined in:
activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb

#check_constraints(table_name) ⇒ Object



502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
# File 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb', line 502

def check_constraints(table_name)
  if supports_check_constraints?
    scope = quoted_scope(table_name)

    sql = <<~SQL
      SELECT cc.constraint_name AS 'name',
            cc.check_clause AS 'expression'
      FROM information_schema.check_constraints cc
      JOIN information_schema.table_constraints tc
      USING (constraint_schema, constraint_name)
      WHERE tc.table_schema = #{scope[:schema]}
        AND tc.table_name = #{scope[:name]}
        AND cc.constraint_schema = #{scope[:schema]}
    SQL
    sql += " AND cc.table_name = #{scope[:name]}" if mariadb?

    chk_info = internal_exec_query(sql, "SCHEMA")

    chk_info.map do |row|
      options = {
        name: row["name"]
      }
      expression = row["expression"]
      expression = expression[1..-2] if expression.start_with?("(") && expression.end_with?(")")
      expression = strip_whitespace_characters(expression)

      unless mariadb?
        # MySQL returns check constraints expression in an already escaped form.
        # This leads to duplicate escaping later (e.g. when the expression is used in the SchemaDumper).
        expression = expression.gsub("\\'", "'")
      end

      CheckConstraintDefinition.new(table_name, expression, options)
    end
  else
    raise NotImplementedError
  end
end