method

build_insert_sql

build_insert_sql(insert)
public

No documentation available.

# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 664
      def build_insert_sql(insert) # :nodoc:
        # Can use any column as it will be assigned to itself.
        no_op_column = quote_column_name(insert.keys.first) if insert.keys.first

        # MySQL 8.0.19 replaces `VALUES(<expression>)` clauses with row and column alias names, see https://dev.mysql.com/worklog/task/?id=6312 .
        # then MySQL 8.0.20 deprecates the `VALUES(<expression>)` see https://dev.mysql.com/worklog/task/?id=13325 .
        if supports_insert_raw_alias_syntax?
          quoted_table_name = insert.model.quoted_table_name
          values_alias = quote_table_name("#{insert.model.table_name.parameterize}_values")
          sql = +"INSERT #{insert.into} #{insert.values_list} AS #{values_alias}"

          if insert.skip_duplicates?
            if no_op_column
              sql << " ON DUPLICATE KEY UPDATE #{no_op_column}=#{quoted_table_name}.#{no_op_column}"
            end
          elsif insert.update_duplicates?
            if insert.raw_update_sql?
              sql = +"INSERT #{insert.into} #{insert.values_list} ON DUPLICATE KEY UPDATE #{insert.raw_update_sql}"
            else
              sql << " ON DUPLICATE KEY UPDATE "
              sql << insert.touch_model_timestamps_unless { |column| "#{quoted_table_name}.#{column}<=>#{values_alias}.#{column}" }
              sql << insert.updatable_columns.map { |column| "#{column}=#{values_alias}.#{column}" }.join(",")
            end
          end
        else
          sql = +"INSERT #{insert.into} #{insert.values_list}"

          if insert.skip_duplicates?
            if no_op_column
              sql << " ON DUPLICATE KEY UPDATE #{no_op_column}=#{no_op_column}"
            end
          elsif insert.update_duplicates?
            sql << " ON DUPLICATE KEY UPDATE "
            if insert.raw_update_sql?
              sql << insert.raw_update_sql
            else
              sql << insert.touch_model_timestamps_unless { |column| "#{column}<=>VALUES(#{column})" }
              sql << insert.updatable_columns.map { |column| "#{column}=VALUES(#{column})" }.join(",")
            end
          end
        end

        sql << " RETURNING #{insert.returning}" if insert.returning
        sql
      end