Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support default expression and expression indexes for MySQL #34307

Merged
merged 2 commits into from Oct 26, 2018

Conversation

kamipo
Copy link
Member

@kamipo kamipo commented Oct 25, 2018

MySQL 8.0.13 is released a few days ago.

https://mysqlserverteam.com/the-mysql-8-0-13-maintenance-release-is-generally-available/

Now we can supports default expression and expression indexes for mysql2 adapter.

MySQL 8.0.13 and higher supports functional key parts that index
expression values rather than column or column prefix values.

https://dev.mysql.com/doc/refman/8.0/en/create-index.html
MySQL 8.0.13 and higher supports default value to be a function or
expression.

https://dev.mysql.com/doc/refman/8.0/en/create-table.html
lengths = options.delete(:lengths)

columns = index[-2].map { |name|
[ name.to_sym, expressions[name] || +quote_column_name(name) ]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why would we want to dup quote_column_name(name) here?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is because the quoted columns would be mutated by add_index_length and add_index_sort_order:

def add_index_length(quoted_columns, **options)
lengths = options_for_index_columns(options[:length])
quoted_columns.each do |name, column|
column << "(#{lengths[name]})" if lengths[name].present?

def add_index_sort_order(quoted_columns, **options)
orders = options_for_index_columns(options[:order])
quoted_columns.each do |name, column|
column << " #{orders[name].upcase}" if orders[name].present?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah I see, I thought quote_column_name would return something that was already duped somehow... because it is the case of

def quote_column_name(column_name)
column_name.to_s
end

... but I didn't realise the method may always return the same object like ...
def quote_column_name(name)
@quoted_column_names[name] ||= "`#{super.gsub('`', '``')}`"
end

... got it :)

I'm just realising that there's no way (AFAIK) to know whether a method returns an object that is referenced elsewhere or not, which is kind of sad, because we may be duplicating strings for no reason (if a method returns a new object or an existing object), maybe we should do something about that one day.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nevermind, I misread this whole thing 👍

@kamipo kamipo merged commit 9e9e2b7 into rails:master Oct 26, 2018
@kamipo kamipo deleted the mysql_expression_support branch October 26, 2018 09:51
suketa added a commit to suketa/rails_sandbox that referenced this pull request Jul 6, 2019
Support default expression and expression indexes for MySQL
rails/rails#34307
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants