Skip to content

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
@kamipo kamipo force-pushed the mysql_expression_support branch from 1ac65ef to a2ad8f4 Compare October 25, 2018 09:14
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

@chrismaximin chrismaximin Oct 26, 2018

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

@chrismaximin chrismaximin Oct 26, 2018

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.

2 participants