From a3712ceefd603ac12c1e4a6bb79e3f4cb37276e4 Mon Sep 17 00:00:00 2001 From: Loic Nageleisen Date: Tue, 21 Nov 2017 11:14:45 +0100 Subject: [PATCH] Add support for SELECT without FROM --- lib/rebel/sql.rb | 7 ++++++- test/test_raw.rb | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/rebel/sql.rb b/lib/rebel/sql.rb index cda9ce9..9379fdc 100644 --- a/lib/rebel/sql.rb +++ b/lib/rebel/sql.rb @@ -180,7 +180,8 @@ module Rebel::SQL def select(*fields, from: nil, where: nil, inner: nil, left: nil, right: nil) raw <<-SQL - SELECT #{names(*fields)} FROM #{name(from)} + SELECT #{names(*fields)} + #{from?(from)} #{inner?(inner)} #{left?(left)} #{right?(right)} @@ -329,6 +330,10 @@ module Rebel::SQL end.join(' AND ') end + def from?(from) + from ? "FROM #{name(from)}" : nil + end + def where?(*clause) clause.any? ? "WHERE #{and_clause(*clause)}" : nil end diff --git a/test/test_raw.rb b/test/test_raw.rb index 26ed190..b19aee1 100644 --- a/test/test_raw.rb +++ b/test/test_raw.rb @@ -105,6 +105,10 @@ class TestRaw < Minitest::Test assert_str_equal(Rebel::SQL.select(Rebel::SQL.raw('*'), from: Rebel::SQL.name(:foo)).gsub(/\s+/, ' ').strip, 'SELECT * FROM "foo"') end + def test_select_without_from + assert_str_equal(Rebel::SQL.select(Rebel::SQL.raw('1')).strip, 'SELECT 1') + end + def test_nested_select assert_str_equal(Rebel::SQL.select(Rebel::SQL.raw('*'), from: Rebel::SQL.name(:foo), where: Rebel::SQL.name(:bar).in(Rebel::SQL.select(Rebel::SQL.name(:bar), from: Rebel::SQL.name(:foo)))).gsub(/\s+/, ' ').strip, 'SELECT * FROM "foo" WHERE "bar" IN ( SELECT "bar" FROM "foo" )') end