diff options
Diffstat (limited to 'test/sql/test_insert.py')
-rw-r--r-- | test/sql/test_insert.py | 95 |
1 files changed, 72 insertions, 23 deletions
diff --git a/test/sql/test_insert.py b/test/sql/test_insert.py index ac9ac4022..1c24d4c79 100644 --- a/test/sql/test_insert.py +++ b/test/sql/test_insert.py @@ -488,7 +488,8 @@ class InsertTest(_InsertTestBase, fixtures.TablesTest, AssertsCompiledSQL): dialect=postgresql.dialect(), ) - def test_heterogeneous_multi_values(self): + @testing.variation("paramstyle", ["pg", "qmark", "numeric", "dollar"]) + def test_heterogeneous_multi_values(self, paramstyle): """for #6047, originally I thought we'd take any insert().values() and be able to convert it to a "many" style execution that we can cache. @@ -519,33 +520,81 @@ class InsertTest(_InsertTestBase, fixtures.TablesTest, AssertsCompiledSQL): ] ) + pos_par = ( + 1, + 1, + 2, + 2, + 1, + 2, + 2, + 3, + 1, + 2, + 2, + 10, + ) + # SQL expressions in the params at arbitrary locations means # we have to scan them at compile time, and the shape of the bound # parameters is not predictable. so for #6047 where I originally # thought all of values() could be rewritten, this makes it not # really worth it. - self.assert_compile( - stmt, - "INSERT INTO t (x, y, z) VALUES " - "(%(x_m0)s, sum(%(sum_1)s, %(sum_2)s), %(z_m0)s), " - "(sum(%(sum_3)s, %(sum_4)s), %(y_m1)s, %(z_m1)s), " - "(sum(%(sum_5)s, %(sum_6)s), %(y_m2)s, foo(%(foo_1)s))", - checkparams={ - "x_m0": 1, - "sum_1": 1, - "sum_2": 2, - "z_m0": 2, - "sum_3": 1, - "sum_4": 2, - "y_m1": 2, - "z_m1": 3, - "sum_5": 1, - "sum_6": 2, - "y_m2": 2, - "foo_1": 10, - }, - dialect=postgresql.dialect(), - ) + if paramstyle.pg: + self.assert_compile( + stmt, + "INSERT INTO t (x, y, z) VALUES " + "(%(x_m0)s, sum(%(sum_1)s, %(sum_2)s), %(z_m0)s), " + "(sum(%(sum_3)s, %(sum_4)s), %(y_m1)s, %(z_m1)s), " + "(sum(%(sum_5)s, %(sum_6)s), %(y_m2)s, foo(%(foo_1)s))", + checkparams={ + "x_m0": 1, + "sum_1": 1, + "sum_2": 2, + "z_m0": 2, + "sum_3": 1, + "sum_4": 2, + "y_m1": 2, + "z_m1": 3, + "sum_5": 1, + "sum_6": 2, + "y_m2": 2, + "foo_1": 10, + }, + dialect=postgresql.dialect(), + ) + elif paramstyle.qmark: + self.assert_compile( + stmt, + "INSERT INTO t (x, y, z) VALUES " + "(?, sum(?, ?), ?), " + "(sum(?, ?), ?, ?), " + "(sum(?, ?), ?, foo(?))", + checkpositional=pos_par, + dialect=sqlite.dialect(), + ) + elif paramstyle.numeric: + self.assert_compile( + stmt, + "INSERT INTO t (x, y, z) VALUES " + "(:1, sum(:2, :3), :4), " + "(sum(:5, :6), :7, :8), " + "(sum(:9, :10), :11, foo(:12))", + checkpositional=pos_par, + dialect=sqlite.dialect(paramstyle="numeric"), + ) + elif paramstyle.dollar: + self.assert_compile( + stmt, + "INSERT INTO t (x, y, z) VALUES " + "($1, sum($2, $3), $4), " + "(sum($5, $6), $7, $8), " + "(sum($9, $10), $11, foo($12))", + checkpositional=pos_par, + dialect=sqlite.dialect(paramstyle="numeric_dollar"), + ) + else: + paramstyle.fail() def test_insert_seq_pk_multi_values_seq_not_supported(self): m = MetaData() |