aboutsummaryrefslogblamecommitdiffstats
path: root/activerecord/test/cases/adapters/postgresql/optimizer_hints_test.rb
blob: 5e4bf232e1d99bd82d6b9897b651a96ffb9e2367 (plain) (tree)


















                                                                      
       
 
                                         




                                                             
 







                                                              




                                                             


       
# frozen_string_literal: true

require "cases/helper"
require "models/post"

if supports_optimizer_hints?
  class PostgresqlOptimzerHintsTest < ActiveRecord::PostgreSQLTestCase
    fixtures :posts

    def setup
      enable_extension!("pg_hint_plan", ActiveRecord::Base.connection)
    end

    def test_optimizer_hints
      assert_sql(%r{\ASELECT /\*\+ SeqScan\(posts\) \*/}) do
        posts = Post.optimizer_hints("SeqScan(posts)")
        posts = posts.select(:id).where(author_id: [0, 1])
        assert_includes posts.explain, "Seq Scan on posts"
      end
    end

    def test_optimizer_hints_is_sanitized
      assert_sql(%r{\ASELECT /\*\+ SeqScan\(posts\) \*/}) do
        posts = Post.optimizer_hints("/*+ SeqScan(posts) */")
        posts = posts.select(:id).where(author_id: [0, 1])
        assert_includes posts.explain, "Seq Scan on posts"
      end

      assert_sql(%r{\ASELECT /\*\+  "posts"\.\*,  \*/}) do
        posts = Post.optimizer_hints("**// \"posts\".*, //**")
        posts = posts.select(:id).where(author_id: [0, 1])
        assert_equal({ "id" => 1 }, posts.first.as_json)
      end
    end

    def test_optimizer_hints_with_unscope
      assert_sql(%r{\ASELECT "posts"\."id"}) do
        posts = Post.optimizer_hints("/*+ SeqScan(posts) */")
        posts = posts.select(:id).where(author_id: [0, 1])
        posts.unscope(:optimizer_hints).load
      end
    end
  end
end