Sha256: 19be1cb473bb09ea599ddfb8962c21be7abd4c376a8e98400e724184f08c064d

Contents?: true

Size: 775 Bytes

Versions: 7

Compression:

Stored size: 775 Bytes

Contents

module PgHero
  module Methods
    module Explain
      def explain(sql)
        sql = squish(sql)
        explanation = nil
        explain_safe = explain_safe?

        # use transaction for safety
        connection_model.transaction do
          if !explain_safe && (sql.sub(/;\z/, "").include?(";") || sql.upcase.include?("COMMIT"))
            raise ActiveRecord::StatementInvalid, "Unsafe statement"
          end
          explanation = select_all("EXPLAIN #{sql}").map { |v| v["QUERY PLAN"] }.join("\n")
          raise ActiveRecord::Rollback
        end

        explanation
      end

      private

      def explain_safe?
        select_all("SELECT 1; SELECT 1")
        false
      rescue ActiveRecord::StatementInvalid
        true
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
pghero-1.6.2 lib/pghero/methods/explain.rb
pghero-1.6.1 lib/pghero/methods/explain.rb
pghero-1.6.0 lib/pghero/methods/explain.rb
pghero-1.5.3 lib/pghero/methods/explain.rb
pghero-1.5.2 lib/pghero/methods/explain.rb
pghero-1.5.1 lib/pghero/methods/explain.rb
pghero-1.5.0 lib/pghero/methods/explain.rb