# frozen_string_literal: truemoduleArel# :nodoc: allmoduleVisitorsclassMySQL<Arel::Visitors::ToSqlprivatedefvisit_Arel_Nodes_Bin(o,collector)collector<<"CAST("visito.expr,collectorcollector<<" AS BINARY)"enddefvisit_Arel_Nodes_UnqualifiedColumn(o,collector)visito.expr,collectorend#### :'(# To retrieve all rows from a certain offset up to the end of the result set,# you can use some large number for the second parameter.# https://dev.mysql.com/doc/refman/en/select.htmldefvisit_Arel_Nodes_SelectStatement(o,collector)ifo.offset&&!o.limito.limit=Arel::Nodes::Limit.new(18446744073709551615)endsuperenddefvisit_Arel_Nodes_SelectCore(o,collector)o.froms||=Arel.sql("DUAL",retryable: true)superenddefvisit_Arel_Nodes_Concat(o,collector)collector<<" CONCAT("visito.left,collectorcollector<<", "visito.right,collectorcollector<<") "collectorenddefvisit_Arel_Nodes_IsNotDistinctFrom(o,collector)collector=visito.left,collectorcollector<<" <=> "visito.right,collectorenddefvisit_Arel_Nodes_IsDistinctFrom(o,collector)collector<<"NOT "visit_Arel_Nodes_IsNotDistinctFromo,collectorenddefvisit_Arel_Nodes_Regexp(o,collector)infix_valueo,collector," REGEXP "enddefvisit_Arel_Nodes_NotRegexp(o,collector)infix_valueo,collector," NOT REGEXP "enddefvisit_Arel_Nodes_NullsFirst(o,collector)visit(o.expr.expr,collector)<<" IS NOT NULL, "visit(o.expr,collector)enddefvisit_Arel_Nodes_NullsLast(o,collector)visit(o.expr.expr,collector)<<" IS NULL, "visit(o.expr,collector)enddefvisit_Arel_Nodes_Cte(o,collector)collector<<quote_table_name(o.name)collector<<" AS "visito.relation,collectorend# In the simple case, MySQL allows us to place JOINs directly into the UPDATE# query. However, this does not allow for LIMIT, OFFSET and ORDER. To support# these, we must use a subquery.defprepare_update_statement(o)ifo.offset||has_group_by_and_having?(o)||has_join_sources?(o)&&has_limit_or_offset_or_orders?(o)superelseoendendalias:prepare_delete_statement:prepare_update_statement# MySQL doesn't automatically create a temporary table for use subquery, so we have# to give it some prompting in the form of a subsubquery.defbuild_subselect(key,o)subselect=super# Materialize subquery by adding distinct# to work with MySQL 5.7.6 which sets optimizer_switch='derived_merge=on'unlesshas_limit_or_offset_or_orders?(subselect)core=subselect.cores.lastcore.set_quantifier=Arel::Nodes::Distinct.newendNodes::SelectStatement.new.tapdo|stmt|core=stmt.cores.lastcore.froms=Nodes::Grouping.new(subselect).as("__active_record_temp")core.projections=[Arel.sql(quote_column_name(key.name),retryable: true)]endendendendend