aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/arel/table.rb8
-rw-r--r--lib/arel/visitors/bind_visitor.rb1
-rw-r--r--lib/arel/visitors/dot.rb11
-rw-r--r--lib/arel/visitors/ibm_db.rb1
-rw-r--r--lib/arel/visitors/informix.rb1
-rw-r--r--lib/arel/visitors/mssql.rb1
-rw-r--r--lib/arel/visitors/mysql.rb1
-rw-r--r--lib/arel/visitors/oracle.rb18
-rw-r--r--lib/arel/visitors/oracle12.rb1
-rw-r--r--lib/arel/visitors/postgresql.rb1
-rw-r--r--lib/arel/visitors/sqlite.rb1
-rw-r--r--lib/arel/visitors/to_sql.rb1
-rw-r--r--lib/arel/visitors/where_sql.rb1
-rw-r--r--test/test_table.rb9
-rw-r--r--test/visitors/test_dot.rb7
-rw-r--r--test/visitors/test_oracle.rb16
-rw-r--r--test/visitors/test_oracle12.rb2
17 files changed, 60 insertions, 21 deletions
diff --git a/lib/arel/table.rb b/lib/arel/table.rb
index b4b4a861b8..0e7214f269 100644
--- a/lib/arel/table.rb
+++ b/lib/arel/table.rb
@@ -6,7 +6,7 @@ module Arel
@engine = nil
class << self; attr_accessor :engine; end
- attr_accessor :name, :aliases, :table_alias
+ attr_accessor :name, :table_alias
# TableAlias and Table both have a #table_name which is the name of the underlying table
alias :table_name :name
@@ -14,7 +14,6 @@ module Arel
def initialize(name, as: nil, type_caster: nil)
@name = name.to_s
@columns = nil
- @aliases = []
@type_caster = type_caster
# Sometime AR sends an :as parameter to table, to let the table know
@@ -27,9 +26,7 @@ module Arel
end
def alias name = "#{self.name}_2"
- Nodes::TableAlias.new(self, name).tap do |node|
- @aliases << node
- end
+ Nodes::TableAlias.new(self, name)
end
def from
@@ -94,7 +91,6 @@ module Arel
def eql? other
self.class == other.class &&
self.name == other.name &&
- self.aliases == other.aliases &&
self.table_alias == other.table_alias
end
alias :== :eql?
diff --git a/lib/arel/visitors/bind_visitor.rb b/lib/arel/visitors/bind_visitor.rb
index c336e87395..8a5570cf5c 100644
--- a/lib/arel/visitors/bind_visitor.rb
+++ b/lib/arel/visitors/bind_visitor.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
module Arel
module Visitors
module BindVisitor
diff --git a/lib/arel/visitors/dot.rb b/lib/arel/visitors/dot.rb
index ca8d2b0bd0..9aa22d33f6 100644
--- a/lib/arel/visitors/dot.rb
+++ b/lib/arel/visitors/dot.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
module Arel
module Visitors
class Dot < Arel::Visitors::Visitor
@@ -155,6 +156,11 @@ module Arel
visit_edge o, "name"
end
+ def visit_Arel_Nodes_Casted o
+ visit_edge o, 'val'
+ visit_edge o, 'attribute'
+ end
+
def visit_Arel_Attribute o
visit_edge o, "relation"
visit_edge o, "name"
@@ -204,7 +210,6 @@ module Arel
alias :visit_NilClass :visit_String
alias :visit_TrueClass :visit_String
alias :visit_FalseClass :visit_String
- alias :visit_Arel_Nodes_BindParam :visit_String
alias :visit_Integer :visit_String
alias :visit_Fixnum :visit_String
alias :visit_BigDecimal :visit_String
@@ -212,6 +217,8 @@ module Arel
alias :visit_Symbol :visit_String
alias :visit_Arel_Nodes_SqlLiteral :visit_String
+ def visit_Arel_Nodes_BindParam o; end
+
def visit_Hash o
o.each_with_index do |pair, i|
edge("pair_#{i}") { visit pair }
@@ -271,7 +278,7 @@ module Arel
label = "<f0>#{node.name}"
node.fields.each_with_index do |field, i|
- label << "|<f#{i + 1}>#{quote field}"
+ label += "|<f#{i + 1}>#{quote field}"
end
"#{node.id} [label=\"#{label}\"];"
diff --git a/lib/arel/visitors/ibm_db.rb b/lib/arel/visitors/ibm_db.rb
index f1d126790d..e85a5a08a7 100644
--- a/lib/arel/visitors/ibm_db.rb
+++ b/lib/arel/visitors/ibm_db.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
module Arel
module Visitors
class IBM_DB < Arel::Visitors::ToSql
diff --git a/lib/arel/visitors/informix.rb b/lib/arel/visitors/informix.rb
index c33ef50554..b53ab18b82 100644
--- a/lib/arel/visitors/informix.rb
+++ b/lib/arel/visitors/informix.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
module Arel
module Visitors
class Informix < Arel::Visitors::ToSql
diff --git a/lib/arel/visitors/mssql.rb b/lib/arel/visitors/mssql.rb
index 92362a0c5f..8347d05d06 100644
--- a/lib/arel/visitors/mssql.rb
+++ b/lib/arel/visitors/mssql.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
module Arel
module Visitors
class MSSQL < Arel::Visitors::ToSql
diff --git a/lib/arel/visitors/mysql.rb b/lib/arel/visitors/mysql.rb
index ac3ad7b470..4c734f6292 100644
--- a/lib/arel/visitors/mysql.rb
+++ b/lib/arel/visitors/mysql.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
module Arel
module Visitors
class MySQL < Arel::Visitors::ToSql
diff --git a/lib/arel/visitors/oracle.rb b/lib/arel/visitors/oracle.rb
index 875b0e5b6a..3b452836db 100644
--- a/lib/arel/visitors/oracle.rb
+++ b/lib/arel/visitors/oracle.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
module Arel
module Visitors
class Oracle < Arel::Visitors::ToSql
@@ -26,11 +27,22 @@ module Arel
FROM ("
collector = super(o, collector)
- collector << ") raw_sql_
+
+ if offset.expr.is_a? Nodes::BindParam
+ offset_bind = nil
+ collector << ') raw_sql_ WHERE rownum <= ('
+ collector.add_bind(offset.expr) { |i| offset_bind = ":a#{i}" }
+ collector << ' + '
+ collector.add_bind(limit) { |i| ":a#{i}" }
+ collector << ") ) WHERE raw_rnum_ > #{offset_bind}"
+ return collector
+ else
+ collector << ") raw_sql_
WHERE rownum <= #{offset.expr.to_i + limit}
)
WHERE "
- return visit(offset, collector)
+ return visit(offset, collector)
+ end
end
if o.limit
@@ -125,7 +137,7 @@ module Arel
array[i] << ',' << part
else
# to ensure that array[i] will be String and not Arel::Nodes::SqlLiteral
- array[i] = '' << part
+ array[i] = part.to_s
end
i += 1 if array[i].count('(') == array[i].count(')')
end
diff --git a/lib/arel/visitors/oracle12.rb b/lib/arel/visitors/oracle12.rb
index 9b722e8c0c..ce90e994ae 100644
--- a/lib/arel/visitors/oracle12.rb
+++ b/lib/arel/visitors/oracle12.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
module Arel
module Visitors
class Oracle12 < Arel::Visitors::ToSql
diff --git a/lib/arel/visitors/postgresql.rb b/lib/arel/visitors/postgresql.rb
index ef0f0ea2ef..f0991a2f11 100644
--- a/lib/arel/visitors/postgresql.rb
+++ b/lib/arel/visitors/postgresql.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
module Arel
module Visitors
class PostgreSQL < Arel::Visitors::ToSql
diff --git a/lib/arel/visitors/sqlite.rb b/lib/arel/visitors/sqlite.rb
index 165e9cb6db..4ae093968b 100644
--- a/lib/arel/visitors/sqlite.rb
+++ b/lib/arel/visitors/sqlite.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
module Arel
module Visitors
class SQLite < Arel::Visitors::ToSql
diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb
index 5429bf4ee8..3f61842c3f 100644
--- a/lib/arel/visitors/to_sql.rb
+++ b/lib/arel/visitors/to_sql.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
require 'bigdecimal'
require 'date'
require 'arel/visitors/reduce'
diff --git a/lib/arel/visitors/where_sql.rb b/lib/arel/visitors/where_sql.rb
index 41972d5836..55e6ca9a21 100644
--- a/lib/arel/visitors/where_sql.rb
+++ b/lib/arel/visitors/where_sql.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: true
module Arel
module Visitors
class WhereSql < Arel::Visitors::ToSql
diff --git a/test/test_table.rb b/test/test_table.rb
index e8eaf901cc..168fde370d 100644
--- a/test/test_table.rb
+++ b/test/test_table.rb
@@ -110,10 +110,7 @@ module Arel
describe 'alias' do
it 'should create a node that proxies to a table' do
- @relation.aliases.must_equal []
-
node = @relation.alias
- @relation.aliases.must_equal [node]
node.name.must_equal 'users_2'
node[:id].relation.must_equal node
end
@@ -191,10 +188,8 @@ module Arel
describe 'equality' do
it 'is equal with equal ivars' do
relation1 = Table.new(:users)
- relation1.aliases = %w[a b c]
relation1.table_alias = 'zomg'
relation2 = Table.new(:users)
- relation2.aliases = %w[a b c]
relation2.table_alias = 'zomg'
array = [relation1, relation2]
assert_equal 1, array.uniq.size
@@ -202,11 +197,9 @@ module Arel
it 'is not equal with different ivars' do
relation1 = Table.new(:users)
- relation1.aliases = %w[a b c]
relation1.table_alias = 'zomg'
relation2 = Table.new(:users)
- relation2.aliases = %w[x y z]
- relation2.table_alias = 'zomg'
+ relation2.table_alias = 'zomg2'
array = [relation1, relation2]
assert_equal 2, array.uniq.size
end
diff --git a/test/visitors/test_dot.rb b/test/visitors/test_dot.rb
index 4dc3c9c6c5..179a2c297c 100644
--- a/test/visitors/test_dot.rb
+++ b/test/visitors/test_dot.rb
@@ -64,12 +64,19 @@ module Arel
Arel::Nodes::As,
Arel::Nodes::DeleteStatement,
Arel::Nodes::JoinSource,
+ Arel::Nodes::Casted,
].each do |klass|
define_method("test_#{klass.name.gsub('::', '_')}") do
binary = klass.new(:a, :b)
@visitor.accept binary, Collectors::PlainString.new
end
end
+
+ def test_Arel_Nodes_BindParam
+ node = Arel::Nodes::BindParam.new
+ collector = Collectors::PlainString.new
+ assert_match '[label="<f0>Arel::Nodes::BindParam"]', @visitor.accept(node, collector).value
+ end
end
end
end
diff --git a/test/visitors/test_oracle.rb b/test/visitors/test_oracle.rb
index e9ed9d76b3..4c22be5cbb 100644
--- a/test/visitors/test_oracle.rb
+++ b/test/visitors/test_oracle.rb
@@ -124,6 +124,21 @@ module Arel
}
end
+ it 'creates a subquery when there is limit and offset with BindParams' do
+ stmt = Nodes::SelectStatement.new
+ stmt.limit = Nodes::Limit.new(Nodes::BindParam.new)
+ stmt.offset = Nodes::Offset.new(Nodes::BindParam.new)
+ sql = compile stmt
+ sql.must_be_like %{
+ SELECT * FROM (
+ SELECT raw_sql_.*, rownum raw_rnum_
+ FROM (SELECT ) raw_sql_
+ WHERE rownum <= (:a1 + :a2)
+ )
+ WHERE raw_rnum_ > :a1
+ }
+ end
+
it 'is idempotent with different subquery' do
stmt = Nodes::SelectStatement.new
stmt.limit = Nodes::Limit.new(10)
@@ -148,7 +163,6 @@ module Arel
}
end
end
-
end
it 'modified except to be minus' do
diff --git a/test/visitors/test_oracle12.rb b/test/visitors/test_oracle12.rb
index 5dac2994cf..43235fd72c 100644
--- a/test/visitors/test_oracle12.rb
+++ b/test/visitors/test_oracle12.rb
@@ -35,7 +35,7 @@ module Arel
stmt.limit = Nodes::Limit.new(10)
stmt.lock = Nodes::Lock.new(Arel.sql('FOR UPDATE'))
assert_raises ArgumentError do
- sql = compile(stmt)
+ compile(stmt)
end
end