diff --git a/lib/arel/nodes/sql_literal.rb b/lib/arel/nodes/sql_literal.rb index 73575a7d..060c1086 100644 --- a/lib/arel/nodes/sql_literal.rb +++ b/lib/arel/nodes/sql_literal.rb @@ -1,14 +1,25 @@ # frozen_string_literal: true + +require 'forwardable' + module Arel module Nodes - class SqlLiteral < String + class SqlLiteral include Arel::Expressions include Arel::Predications include Arel::AliasPredication include Arel::OrderPredications + extend Forwardable + + def_delegators :@string, + :===, :==, :to_str, :to_s, :gsub, :inspect, :hash + + def eql?(val) + self == val + end - def encode_with(coder) - coder.scalar = self.to_s + def initialize(string) + @string = string end end end diff --git a/lib/arel/update_manager.rb b/lib/arel/update_manager.rb index eac414ea..2e69586b 100644 --- a/lib/arel/update_manager.rb +++ b/lib/arel/update_manager.rb @@ -42,7 +42,8 @@ def where expr end def set values - if String === values + case values + when String, Nodes::SqlLiteral @ast.values = [values] else @ast.values = values.map { |column,value| diff --git a/test/nodes/test_sql_literal.rb b/test/nodes/test_sql_literal.rb index 74e4f2cc..01806062 100644 --- a/test/nodes/test_sql_literal.rb +++ b/test/nodes/test_sql_literal.rb @@ -65,8 +65,11 @@ def compile node describe 'serialization' do it 'serializes into YAML' do - yaml_literal = SqlLiteral.new('foo').to_yaml - assert_equal('foo', YAML.load(yaml_literal)) + literal = SqlLiteral.new('foo') + yaml_literal = literal.to_yaml + revived = YAML.load(yaml_literal) + assert_equal(literal, revived) + revived.must_be_kind_of Arel::Nodes::SqlLiteral end end end