diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-07-14 18:28:07 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-07-14 18:28:07 -0400 |
commit | eb4abda8117263f1e1775460b47076ec70e092d4 (patch) | |
tree | a3d76c4ca6f17ac46d251eb2d4d6962f8e372aa2 | |
parent | c6de724785df9beeb38a8796d5f37d9e1d9a0a83 (diff) | |
download | sqlalchemy-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.rst | 9 | ||||
-rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 6 | ||||
-rw-r--r-- | test/sql/test_insert.py | 41 |
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, |