Skip to content

Commit c0aa135

Browse files
committed
[NEW] Now supportes OUTER as a LEFT/RIGHT join modifier (e.g. LEFT OUTER
JOIN)
1 parent 40513c1 commit c0aa135

File tree

3 files changed

+17
-0
lines changed

3 files changed

+17
-0
lines changed

lib/sql_tree/node/join.rb

+8
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@ module SQLTree::Node
33
class Join < Base
44

55
leaf :join_type
6+
leaf :is_outer
67
child :table_reference
78
child :join_expression
89

910
def initialize(values = {})
11+
self.is_outer = false
1012
values.each { |key, value| self.send(:"#{key}=", value) }
1113
end
1214

1315
def to_sql(options = {})
1416
join_sql = join_type ? "#{join_type.to_s.upcase} " : ""
17+
join_sql << "OUTER " if is_outer
1518
join_sql << "JOIN #{table_reference.to_sql(options)} "
1619
join_sql << "ON #{join_expression.to_sql(options)}"
1720
join_sql
@@ -35,6 +38,11 @@ def self.parse(tokens)
3538
join.join_type = tokens.next.literal.downcase.to_sym
3639
end
3740

41+
if [:right, :left].include?(join.join_type) && tokens.peek.class == SQLTree::Token::OUTER
42+
join.is_outer = true
43+
tokens.consume(SQLTree::Token::OUTER)
44+
end
45+
3846
tokens.consume(SQLTree::Token::JOIN)
3947
join.table_reference = SQLTree::Node::TableReference.parse(tokens)
4048
tokens.consume(SQLTree::Token::ON)

spec/integration/parse_and_generate_spec.rb

+5
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,9 @@
9999
# SQLTree["SELECT count(*) FROM jobs"].to_sql.should ==
100100
# "SELECT count(*) FROM jobs"
101101
# end
102+
103+
it "should parse and generate a LEFT OUTER JOIN query" do
104+
SQLTree["SELECT * FROM table_a LEFT OUTER JOIN table_b ON foo = bar"].to_sql.should ==
105+
"SELECT * FROM \"table_a\" LEFT OUTER JOIN \"table_b\" ON (\"foo\" = \"bar\")"
106+
end
102107
end

spec/unit/select_query_spec.rb

+4
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@
7373
it "should parse a table alias without AS" do
7474
SQLTree::Node::Join['LEFT JOIN table t ON other.field = table.field'].table_alias.should == 't'
7575
end
76+
77+
it "should parse an outer join table" do
78+
SQLTree::Node::Join['LEFT OUTER JOIN table ON other.field = table.field'].table.should == 'table'
79+
end
7680
end
7781

7882
describe SQLTree::Node::Ordering do

0 commit comments

Comments
 (0)