From 1a836b21b93acd6851bcb4f83c8b2678282d9122 Mon Sep 17 00:00:00 2001 From: Matt Jones Date: Sun, 8 Feb 2015 18:36:11 -0500 Subject: Match table names exactly on MySQL The `SHOW TABLES LIKE` command accepts metacharacters `%` and `_` in potentially unexpected ways. This can be avoided by querying `information_schema.tables` directly. Fixes #17897 --- .../active_record/connection_adapters/abstract_mysql_adapter.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'activerecord/lib/active_record') 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 5c8c4b883a..48e1ec008b 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb @@ -422,9 +422,11 @@ module ActiveRecord end def tables(name = nil, database = nil, like = nil) #:nodoc: - sql = "SHOW TABLES " - sql << "IN #{quote_table_name(database)} " if database - sql << "LIKE #{quote(like)}" if like + database ||= current_database + + sql = "SELECT table_name FROM information_schema.tables " + sql << "WHERE table_schema = #{quote(database)}" + sql << " AND table_name = #{quote(like)}" if like execute_and_free(sql, 'SCHEMA') do |result| result.collect(&:first) -- cgit v1.2.3