diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2019-02-17 01:17:37 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2019-02-17 01:18:19 +0900 |
commit | 263cfd5cad703a789d56c7e4bb269255048eeeef (patch) | |
tree | a9448b38607cb4b9312a5e8601ae7cc186568c24 /activerecord/lib/active_record/connection_adapters | |
parent | fed7888c83183892f5a7ceb5df40004df7ad5b06 (diff) | |
parent | 3ac195c5349c9f72d169a4961acd2df230519ed4 (diff) | |
download | rails-263cfd5cad703a789d56c7e4bb269255048eeeef.tar.gz rails-263cfd5cad703a789d56c7e4bb269255048eeeef.tar.bz2 rails-263cfd5cad703a789d56c7e4bb269255048eeeef.zip |
Merge pull request #35299 from kamipo/fix_mismatched_foreign_key
Fix the regex that extract mismatched foreign key information
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb index 569c146f92..246c6b5123 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb @@ -795,17 +795,27 @@ module ActiveRecord end def mismatched_foreign_key(message, sql:, binds:) - parts = sql.scan(/`(\w+)`[ $)]/).flatten - MismatchedForeignKey.new( - self, + match = %r/ + (?:CREATE|ALTER)\s+TABLE\s*(?:`?\w+`?\.)?`?(?<table>\w+)`?.+? + FOREIGN\s+KEY\s*\(`?(?<foreign_key>\w+)`?\)\s* + REFERENCES\s*(`?(?<target_table>\w+)`?)\s*\(`?(?<primary_key>\w+)`?\) + /xmi.match(sql) + + options = { message: message, sql: sql, binds: binds, - table: parts[0], - foreign_key: parts[1], - target_table: parts[2], - primary_key: parts[3], - ) + } + + if match + options[:table] = match[:table] + options[:foreign_key] = match[:foreign_key] + options[:target_table] = match[:target_table] + options[:primary_key] = match[:primary_key] + options[:primary_key_column] = column_for(match[:target_table], match[:primary_key]) + end + + MismatchedForeignKey.new(options) end def integer_to_sql(limit) # :nodoc: |