summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-07-14 18:28:07 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-07-14 18:28:07 -0400
commiteb4abda8117263f1e1775460b47076ec70e092d4 (patch)
treea3d76c4ca6f17ac46d251eb2d4d6962f8e372aa2
parentc6de724785df9beeb38a8796d5f37d9e1d9a0a83 (diff)
downloadsqlalchemy-eb4abda8117263f1e1775460b47076ec70e092d4.tar.gz
- Fixed bug where multi-valued :class:`.Insert` construct would fail
to check subsequent values entries beyond the first one given for literal SQL expressions. fixes #3069
-rw-r--r--doc/build/changelog/changelog_09.rst9
-rw-r--r--lib/sqlalchemy/sql/compiler.py6
-rw-r--r--test/sql/test_insert.py41
3 files changed, 54 insertions, 2 deletions
diff --git a/doc/build/changelog/changelog_09.rst b/doc/build/changelog/changelog_09.rst
index 862d5fb5e..c7cacefe8 100644
--- a/doc/build/changelog/changelog_09.rst
+++ b/doc/build/changelog/changelog_09.rst
@@ -16,6 +16,15 @@
.. change::
:tags: bug, sql
+ :tickets: 3069
+ :versions: 1.0.0
+
+ Fixed bug where multi-valued :class:`.Insert` construct would fail
+ to check subsequent values entries beyond the first one given
+ for literal SQL expressions.
+
+ .. change::
+ :tags: bug, sql
:tickets: 3123
:versions: 1.0.0
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py
index 90a65a7e2..32ecb2eae 100644
--- a/lib/sqlalchemy/sql/compiler.py
+++ b/lib/sqlalchemy/sql/compiler.py
@@ -2211,10 +2211,12 @@ class SQLCompiler(Compiled):
[
(
c,
- self._create_crud_bind_param(
+ (self._create_crud_bind_param(
c, row[c.key],
name="%s_%d" % (c.key, i + 1)
- )
+ ) if elements._is_literal(row[c.key])
+ else self.process(
+ row[c.key].self_group(), **kw))
if c.key in row else param
)
for (c, param) in values_0
diff --git a/test/sql/test_insert.py b/test/sql/test_insert.py
index d9f7b1629..6ee38d6a2 100644
--- a/test/sql/test_insert.py
+++ b/test/sql/test_insert.py
@@ -382,6 +382,47 @@ class MultirowTest(_InsertTestBase, fixtures.TablesTest, AssertsCompiledSQL):
'(%(id_2)s, %(data_2)s, foobar())',
checkparams=checkparams, dialect=postgresql.dialect())
+ def test_sql_functions(self):
+ metadata = MetaData()
+ table = Table('sometable', metadata,
+ Column('id', Integer, primary_key=True),
+ Column('data', String),
+ Column('foo', Integer))
+
+ values = [
+ {"id": 1, "data": "foo", "foo": func.foob()},
+ {"id": 2, "data": "bar", "foo": func.foob()},
+ {"id": 3, "data": "bar", "foo": func.bar()},
+ {"id": 4, "data": "bar", "foo": 15},
+ {"id": 5, "data": "bar", "foo": func.foob()},
+ ]
+ checkparams = {
+ 'id_0': 1,
+ 'data_0': 'foo',
+
+ 'id_1': 2,
+ 'data_1': 'bar',
+
+ 'id_2': 3,
+ 'data_2': 'bar',
+
+ 'id_3': 4,
+ 'data_3': 'bar',
+ 'foo_3': 15,
+
+ 'id_4': 5,
+ 'data_4': 'bar'
+ }
+
+ self.assert_compile(table.insert().values(values),
+ "INSERT INTO sometable (id, data, foo) VALUES "
+ "(%(id_0)s, %(data_0)s, foob()), "
+ "(%(id_1)s, %(data_1)s, foob()), "
+ "(%(id_2)s, %(data_2)s, bar()), "
+ "(%(id_3)s, %(data_3)s, %(foo_3)s), "
+ "(%(id_4)s, %(data_4)s, foob())",
+ checkparams=checkparams, dialect=postgresql.dialect())
+
def test_server_default(self):
metadata = MetaData()
table = Table('sometable', metadata,