aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/arel/collectors/sql_string.rb8
-rw-r--r--lib/arel/nodes.rb1
-rw-r--r--lib/arel/nodes/bind_param.rb6
-rw-r--r--lib/arel/nodes/sql_literal.rb3
-rw-r--r--lib/arel/visitors/postgresql.rb4
-rw-r--r--lib/arel/visitors/to_sql.rb5
6 files changed, 21 insertions, 6 deletions
diff --git a/lib/arel/collectors/sql_string.rb b/lib/arel/collectors/sql_string.rb
index 8ca89ca7bd..fd2faaef3a 100644
--- a/lib/arel/collectors/sql_string.rb
+++ b/lib/arel/collectors/sql_string.rb
@@ -5,8 +5,14 @@ require 'arel/collectors/plain_string'
module Arel
module Collectors
class SQLString < PlainString
+ def initialize(*)
+ super
+ @bind_index = 1
+ end
+
def add_bind bind
- self << bind.to_s
+ self << yield(@bind_index)
+ @bind_index += 1
self
end
diff --git a/lib/arel/nodes.rb b/lib/arel/nodes.rb
index ccccd471e2..2c3c48881b 100644
--- a/lib/arel/nodes.rb
+++ b/lib/arel/nodes.rb
@@ -4,6 +4,7 @@ require 'arel/nodes/select_statement'
require 'arel/nodes/select_core'
require 'arel/nodes/insert_statement'
require 'arel/nodes/update_statement'
+require 'arel/nodes/bind_param'
# terminal
diff --git a/lib/arel/nodes/bind_param.rb b/lib/arel/nodes/bind_param.rb
new file mode 100644
index 0000000000..160bc21b91
--- /dev/null
+++ b/lib/arel/nodes/bind_param.rb
@@ -0,0 +1,6 @@
+module Arel
+ module Nodes
+ class BindParam < Node
+ end
+ end
+end
diff --git a/lib/arel/nodes/sql_literal.rb b/lib/arel/nodes/sql_literal.rb
index b43288b29c..2c56644b99 100644
--- a/lib/arel/nodes/sql_literal.rb
+++ b/lib/arel/nodes/sql_literal.rb
@@ -10,8 +10,5 @@ module Arel
coder.scalar = self.to_s
end
end
-
- class BindParam < SqlLiteral
- end
end
end
diff --git a/lib/arel/visitors/postgresql.rb b/lib/arel/visitors/postgresql.rb
index 60878ddd20..f55aaf30fe 100644
--- a/lib/arel/visitors/postgresql.rb
+++ b/lib/arel/visitors/postgresql.rb
@@ -23,6 +23,10 @@ module Arel
collector << "DISTINCT ON ( "
visit(o.expr, collector) << " )"
end
+
+ def visit_Arel_Nodes_BindParam o, collector
+ collector.add_bind(o) { |i| "$#{i}" }
+ end
end
end
end
diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb
index a3f8cb565d..884076d987 100644
--- a/lib/arel/visitors/to_sql.rb
+++ b/lib/arel/visitors/to_sql.rb
@@ -186,7 +186,8 @@ module Arel
len = o.expressions.length - 1
o.expressions.zip(o.columns).each_with_index { |(value, attr), i|
- if Nodes::SqlLiteral === value
+ case value
+ when Nodes::SqlLiteral, Nodes::BindParam
collector = visit value, collector
else
collector << quote(value, attr && column_for(attr)).to_s
@@ -713,7 +714,7 @@ module Arel
def literal o, collector; collector << o.to_s; end
def visit_Arel_Nodes_BindParam o, collector
- collector.add_bind o
+ collector.add_bind(o) { "?" }
end
alias :visit_Arel_Nodes_SqlLiteral :literal