]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug where multi-valued :class:`.Insert` construct would fail
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 14 Jul 2014 22:28:07 +0000 (18:28 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 14 Jul 2014 22:28:07 +0000 (18:28 -0400)
to check subsequent values entries beyond the first one given
for literal SQL expressions.
fixes #3069

doc/build/changelog/changelog_09.rst
lib/sqlalchemy/sql/compiler.py
test/sql/test_insert.py

index 862d5fb5eda552ee96e388284e1ab816752a5806..c7cacefe84390f0200e155ec2ac387a78a549715 100644 (file)
     :version: 0.9.7
     :released:
 
+    .. 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
index 90a65a7e26d85485bd32533a48f879492e50ffca..32ecb2eaeee9ae7e65a44b4c61cba4ccde50ec13 100644 (file)
@@ -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
index d9f7b16292f7bfda724ffcacbfab2f18bee9a751..6ee38d6a2dde1ec559915e41670f45d70afef330 100644 (file)
@@ -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,