Skip to content

Commit 0fa4405

Browse files
authored
Merge pull request rails#41292 from intrip/41156-fix-mysql-virtual-column-with-escapes
Fix Mysql schema for virtual column expressions with quotes
2 parents 6572381 + 3fe5e26 commit 0fa4405

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

activerecord/lib/active_record/connection_adapters/mysql/schema_dumper.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,10 @@ def extract_expression_for_virtual_column(column)
7979
" WHERE table_schema = #{scope[:schema]}" \
8080
" AND table_name = #{scope[:name]}" \
8181
" AND column_name = #{column_name}"
82-
@connection.query_value(sql, "SCHEMA").inspect
82+
# Calling .inspect leads into issues with the query result
83+
# which already returns escaped quotes.
84+
# We remove the escape sequence from the result in order to deal with double escaping issues.
85+
@connection.query_value(sql, "SCHEMA").gsub("\\'", "'").inspect
8386
end
8487
end
8588
end

activerecord/test/cases/adapters/mysql2/virtual_column_test.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ def setup
1919
t.virtual :upper_name, type: :string, as: "UPPER(`name`)"
2020
t.virtual :name_length, type: :integer, as: "LENGTH(`name`)", stored: true
2121
t.virtual :name_octet_length, type: :integer, as: "OCTET_LENGTH(`name`)", stored: true
22+
t.json :profile
23+
t.virtual :profile_email, type: :string, as: "json_extract(`profile`,_utf8mb4'$.email')", stored: true
2224
end
2325
VirtualColumn.create(name: "Rails")
2426
end
@@ -58,6 +60,7 @@ def test_schema_dumping
5860
assert_match(/t\.virtual\s+"upper_name",\s+type: :string,\s+as: "(?:UPPER|UCASE)\(`name`\)"$/i, output)
5961
assert_match(/t\.virtual\s+"name_length",\s+type: :integer,\s+as: "(?:octet_length|length)\(`name`\)",\s+stored: true$/i, output)
6062
assert_match(/t\.virtual\s+"name_octet_length",\s+type: :integer,\s+as: "(?:octet_length|length)\(`name`\)",\s+stored: true$/i, output)
63+
assert_match(/t\.virtual\s+"profile_email",\s+type: :string,\s+as: "json_extract\(`profile`,\w*?'\$\.email'\)", stored: true$/i, output)
6164
end
6265
end
6366
end

0 commit comments

Comments
 (0)