--- /dev/null
+.. change::
+ :tags: bug, sql
+ :tickets: 4231
+ :versions: 1.3.0b1
+
+ Fixed issue where the compilation of an INSERT statement with the
+ "literal_binds" option that also uses an explicit sequence and "inline"
+ generation, as on Postgresql and Oracle, would fail to accommodate the
+ extra keyword argument within the sequence processing routine.
def default_from(self):
return " FROM rdb$database"
- def visit_sequence(self, seq):
+ def visit_sequence(self, seq, **kw):
return "gen_id(%s, 1)" % self.preparer.format_sequence(seq)
def get_select_precolumns(self, select, **kw):
def visit_outer_join_column(self, vc, **kw):
return self.process(vc.column, **kw) + "(+)"
- def visit_sequence(self, seq):
+ def visit_sequence(self, seq, **kw):
return (self.dialect.identifier_preparer.format_sequence(seq) +
".nextval")
value = value.replace('\\', '\\\\')
return value
- def visit_sequence(self, seq):
+ def visit_sequence(self, seq, **kw):
return "nextval('%s')" % self.preparer.format_sequence(seq)
def limit_clause(self, select, **kw):
def visit_next_value_func(self, next_value, **kw):
return self.visit_sequence(next_value.sequence)
- def visit_sequence(self, sequence):
+ def visit_sequence(self, sequence, **kw):
raise NotImplementedError(
"Dialect '%s' does not support sequence increments." %
self.dialect.name
from ..assertions import eq_
from ... import testing
-from ... import Integer, String, Sequence, schema
+from ... import Integer, String, Sequence, schema, MetaData
from ..schema import Table, Column
)
+class SequenceCompilerTest(testing.AssertsCompiledSQL, fixtures.TestBase):
+ __requires__ = ('sequences',)
+ __backend__ = True
+
+ def test_literal_binds_inline_compile(self):
+ table = Table(
+ 'x', MetaData(),
+ Column('y', Integer, Sequence('y_seq')),
+ Column('q', Integer))
+
+ stmt = table.insert().values(q=5)
+
+ seq_nextval = testing.db.dialect.statement_compiler(
+ statement=None, dialect=testing.db.dialect).visit_sequence(
+ Sequence("y_seq"))
+ self.assert_compile(
+ stmt,
+ "INSERT INTO x (y, q) VALUES (%s, 5)" % (seq_nextval, ),
+ literal_binds=True,
+ dialect=testing.db.dialect)
+
+
class HasSequenceTest(fixtures.TestBase):
__requires__ = 'sequences',
__backend__ = True
literal, and_, null, type_coerce, alias, or_, literal_column,\
Float, TIMESTAMP, Numeric, Date, Text, union, except_,\
intersect, union_all, Boolean, distinct, join, outerjoin, asc, desc,\
- over, subquery, case, true, CheckConstraint
+ over, subquery, case, true, CheckConstraint, Sequence
import decimal
from sqlalchemy.util import u
from sqlalchemy import exc, sql, util, types, schema
"INSERT INTO mytable (myid, name) VALUES (3, 'jack')",
literal_binds=True)
+ def test_insert_literal_binds_sequence_notimplemented(self):
+ table = Table('x', MetaData(), Column('y', Integer, Sequence('y_seq')))
+ dialect = default.DefaultDialect()
+ dialect.supports_sequences = True
+
+ stmt = table.insert().values(myid=3, name='jack')
+
+ assert_raises(
+ NotImplementedError,
+ stmt.compile,
+ compile_kwargs=dict(literal_binds=True), dialect=dialect
+ )
+
def test_update_literal_binds(self):
stmt = table1.update().values(name='jack').\
where(table1.c.name == 'jill')