aboutsummaryrefslogtreecommitdiffstats
path: root/lib/arel/visitors
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2017-12-28 10:35:15 -0800
committerGitHub <noreply@github.com>2017-12-28 10:35:15 -0800
commitdf2b74b53664cc3ce3a49156c555b84c134bb75a (patch)
tree89d2a363ead699b4e8916c9ddb7ffccd8d429f1d /lib/arel/visitors
parent6cf061ed6f3f9c8128385765c07eaa4f8a43bd34 (diff)
parentd8f463a3b87ff9f69eef2a3ed5718b198c2072a1 (diff)
downloadrails-df2b74b53664cc3ce3a49156c555b84c134bb75a.tar.gz
rails-df2b74b53664cc3ce3a49156c555b84c134bb75a.tar.bz2
rails-df2b74b53664cc3ce3a49156c555b84c134bb75a.zip
Merge pull request #481 from lautis/lateral
Lateral expressions for PostgreSQL
Diffstat (limited to 'lib/arel/visitors')
-rw-r--r--lib/arel/visitors/depth_first.rb1
-rw-r--r--lib/arel/visitors/postgresql.rb18
2 files changed, 19 insertions, 0 deletions
diff --git a/lib/arel/visitors/depth_first.rb b/lib/arel/visitors/depth_first.rb
index 5416a285f5..b3bbc9bd40 100644
--- a/lib/arel/visitors/depth_first.rb
+++ b/lib/arel/visitors/depth_first.rb
@@ -25,6 +25,7 @@ module Arel
alias :visit_Arel_Nodes_GroupingElement :unary
alias :visit_Arel_Nodes_Grouping :unary
alias :visit_Arel_Nodes_Having :unary
+ alias :visit_Arel_Nodes_Lateral :unary
alias :visit_Arel_Nodes_Limit :unary
alias :visit_Arel_Nodes_Not :unary
alias :visit_Arel_Nodes_Offset :unary
diff --git a/lib/arel/visitors/postgresql.rb b/lib/arel/visitors/postgresql.rb
index 2a935e4318..047f71aaa6 100644
--- a/lib/arel/visitors/postgresql.rb
+++ b/lib/arel/visitors/postgresql.rb
@@ -5,6 +5,7 @@ module Arel
CUBE = 'CUBE'
ROLLUP = 'ROLLUP'
GROUPING_SET = 'GROUPING SET'
+ LATERAL = 'LATERAL'
private
@@ -69,6 +70,23 @@ module Arel
grouping_array_or_grouping_element o, collector
end
+ def visit_Arel_Nodes_Lateral o, collector
+ collector << LATERAL
+ collector << SPACE
+ grouping_parentheses o, collector
+ end
+
+ # Used by Lateral visitor to enclose select queries in parentheses
+ def grouping_parentheses o, collector
+ if o.expr.is_a? Nodes::SelectStatement
+ collector << "("
+ visit o.expr, collector
+ collector << ")"
+ else
+ visit o.expr, collector
+ end
+ end
+
# Utilized by GroupingSet, Cube & RollUp visitors to
# handle grouping aggregation semantics
def grouping_array_or_grouping_element o, collector