Skip to content

NoMethodError: undefined method `length' for #<Arel::Nodes::SelectStatement:0x00007f1640044518> #2072

@koic

Description

@koic

Probably related to the change by #2008.

Steps to reproduce

# frozen_string_literal: true

require "bundler/inline"

gemfile(true) do
  source "https://rubygems.org"

  git_source(:github) { |repo| "https://github.com/#{repo}.git" }

  gem "rails", github: "rails/rails", branch: "master"
  gem "activerecord-oracle_enhanced-adapter",  github: "rsim/oracle-enhanced", branch: "master"
  gem "minitest"

  platforms :ruby do
    gem "ruby-oci8"
  end
end

require "active_record"
require "minitest/autorun"
require "logger"
require "active_record/connection_adapters/oracle_enhanced_adapter"

# Set Oracle enhanced adapter specific connection parameters
DATABASE_NAME = ENV["DATABASE_NAME"] || "orcl"
DATABASE_HOST = ENV["DATABASE_HOST"]
DATABASE_PORT = ENV["DATABASE_PORT"]
DATABASE_USER = ENV["DATABASE_USER"] || "oracle_enhanced"
DATABASE_PASSWORD = ENV["DATABASE_PASSWORD"] || "oracle_enhanced"
DATABASE_SYS_PASSWORD = ENV["DATABASE_SYS_PASSWORD"] || "admin"

CONNECTION_PARAMS = {
  adapter: "oracle_enhanced",
  database: DATABASE_NAME,
  host: DATABASE_HOST,
  port: DATABASE_PORT,
  username: DATABASE_USER,
  password: DATABASE_PASSWORD
}

ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)

ActiveRecord::Base.logger = Logger.new(STDOUT)

ActiveRecord::Schema.define do
  create_table :posts, force: true do |t|
  end

  create_table :comments, force: true do |t|
    t.integer :post_id
  end
end

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

class BugTest < Minitest::Test
  def test_association_stuff
    post = Post.create!
    post.comments << Comment.create!

    assert_equal 1, Comment.where(post_id: Post.select(:id))
  end
end

Expected behavior

No errors.

Actual behavior

Error:
BugTest#test_association_stuff:
NoMethodError: undefined method `length' for #<Arel::Nodes::SelectStatement:0x00007f1640044518>
    /home/vagrant/.rvm/gems/ruby-2.7.2/bundler/gems/oracle-enhanced-662f543d1567/lib/arel/visitors/oracle.rb:144:in `visit_Arel_Nodes_In'
    /home/vagrant/.rvm/gems/ruby-2.7.2/bundler/gems/rails-75a65a905a5d/activerecord/lib/arel/visitors/visitor.rb:30:in `visit'
    /home/vagrant/.rvm/gems/ruby-2.7.2/bundler/gems/rails-75a65a905a5d/activerecord/lib/arel/visitors/to_sql.rb:779:in `block in inject_join'
    /home/vagrant/.rvm/gems/ruby-2.7.2/bundler/gems/rails-75a65a905a5d/activerecord/lib/arel/visitors/to_sql.rb:777:in `each'
    /home/vagrant/.rvm/gems/ruby-2.7.2/bundler/gems/rails-75a65a905a5d/activerecord/lib/arel/visitors/to_sql.rb:777:in `each_with_index'
    /home/vagrant/.rvm/gems/ruby-2.7.2/bundler/gems/rails-75a65a905a5d/activerecord/lib/arel/visitors/to_sql.rb:777:in `inject_join'
    /home/vagrant/.rvm/gems/ruby-2.7.2/bundler/gems/rails-75a65a905a5d/activerecord/lib/arel/visitors/to_sql.rb:177:in `collect_nodes_for'
    /home/vagrant/.rvm/gems/ruby-2.7.2/bundler/gems/rails-75a65a905a5d/activerecord/lib/arel/visitors/to_sql.rb:157:in `visit_Arel_Nodes_SelectCore'
    /home/vagrant/.rvm/gems/ruby-2.7.2/bundler/gems/rails-75a65a905a5d/activerecord/lib/arel/visitors/to_sql.rb:124:in `block in visit_Arel_Nodes_SelectStatement'

System configuration

6.1.0.rc1 (master)
rails/rails@75a65a9

Oracle enhanced adapter version:

6.1.0.alpha (master)
662f543

Ruby version:

ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux]

Oracle Database version:

As far as I can see, this error reproduced on Oracle 11g and 19c.

  • Oracle XE 11.2.0-1.0
  • Oracle Database 19c Enterprise Edition Release 19.0.0.0.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions