From 162e1d8df332f170b9dafdc91f60ee2cb359c1e5 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Wed, 22 Dec 2010 18:02:56 -0800 Subject: [PATCH] sql literals may be used as column attributes --- History.txt | 1 + lib/arel.rb | 4 ++++ lib/arel/table.rb | 2 +- lib/arel/visitors/to_sql.rb | 45 +++++++++++++++++++----------------- test/visitors/test_to_sql.rb | 9 +++++++- 5 files changed, 38 insertions(+), 23 deletions(-) diff --git a/History.txt b/History.txt index d16baa5b30..3984a7aa44 100644 --- a/History.txt +++ b/History.txt @@ -4,6 +4,7 @@ * AST is now Enumerable * AND nodes are now n-ary nodes + * SQL Literals may be used as Attribute names * Deprecations diff --git a/lib/arel.rb b/lib/arel.rb index 3d0648263b..32fc8d9bc0 100644 --- a/lib/arel.rb +++ b/lib/arel.rb @@ -35,6 +35,10 @@ module Arel def self.sql raw_sql Arel::Nodes::SqlLiteral.new raw_sql end + + def self.star + sql '*' + end ## Convenience Alias Node = Arel::Nodes::Node end diff --git a/lib/arel/table.rb b/lib/arel/table.rb index a13fd9fa5b..d1d1e40e11 100644 --- a/lib/arel/table.rb +++ b/lib/arel/table.rb @@ -109,7 +109,7 @@ def columns end def [] name - ::Arel::Attribute.new self, name.to_sym + ::Arel::Attribute.new self, name end def select_manager diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index d959782620..7669fd67ab 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -318,26 +318,29 @@ def visit_Arel_Attributes_Attribute o alias :visit_Arel_Attributes_Time :visit_Arel_Attributes_Attribute alias :visit_Arel_Attributes_Boolean :visit_Arel_Attributes_Attribute - def visit_Fixnum o; o end - alias :visit_Arel_Nodes_SqlLiteral :visit_Fixnum - alias :visit_Arel_SqlLiteral :visit_Fixnum # This is deprecated - alias :visit_Bignum :visit_Fixnum - - def visit_String o; quote(o, @last_column) end - - alias :visit_ActiveSupport_Multibyte_Chars :visit_String - alias :visit_BigDecimal :visit_String - alias :visit_Date :visit_String - alias :visit_DateTime :visit_String - alias :visit_FalseClass :visit_String - alias :visit_Float :visit_String - alias :visit_Hash :visit_String - alias :visit_Symbol :visit_String - alias :visit_Time :visit_String - alias :visit_TrueClass :visit_String - alias :visit_NilClass :visit_String - alias :visit_ActiveSupport_StringInquirer :visit_String - alias :visit_Class :visit_String + def literal o; o end + + alias :visit_Arel_Nodes_SqlLiteral :literal + alias :visit_Arel_SqlLiteral :literal # This is deprecated + alias :visit_Bignum :literal + alias :visit_Fixnum :literal + + def quoted o; quote(o, @last_column) end + + alias :visit_ActiveSupport_Multibyte_Chars :quoted + alias :visit_ActiveSupport_StringInquirer :quoted + alias :visit_BigDecimal :quoted + alias :visit_Class :quoted + alias :visit_Date :quoted + alias :visit_DateTime :quoted + alias :visit_FalseClass :quoted + alias :visit_Float :quoted + alias :visit_Hash :quoted + alias :visit_NilClass :quoted + alias :visit_String :quoted + alias :visit_Symbol :quoted + alias :visit_Time :quoted + alias :visit_TrueClass :quoted def visit_Array o o.empty? ? 'NULL' : o.map { |x| visit x }.join(', ') @@ -352,7 +355,7 @@ def quote_table_name name end def quote_column_name name - @quoted_columns[name] ||= @connection.quote_column_name(name) + @quoted_columns[name] ||= Arel::Nodes::SqlLiteral === name ? name : @connection.quote_column_name(name) end end end diff --git a/test/visitors/test_to_sql.rb b/test/visitors/test_to_sql.rb index 80384d3c28..530bd73f6d 100644 --- a/test/visitors/test_to_sql.rb +++ b/test/visitors/test_to_sql.rb @@ -5,7 +5,14 @@ module Visitors describe 'the to_sql visitor' do before do @visitor = ToSql.new Table.engine - @attr = Table.new(:users)[:id] + @table = Table.new(:users) + @attr = @table[:id] + end + + it 'should not quote sql literals' do + node = @table[Arel.star] + sql = @visitor.accept node + sql.must_be_like '"users".*' end describe 'equality' do -- GitLab