- sqlite:
- removed silly behavior where sqlite would reflect UNIQUE indexes
as part of the primary key (?!)
-
+- oracle:
+ - small fix to allow successive compiles of the same SELECT object
+ which features LIMIT/OFFSET. oracle dialect needs to modify
+ the object to have ROW_NUMBER OVER and wasn't performing
+ the full series of steps on successive compiles.
+
0.3.6
- sql:
- bindparam() names are now repeatable! specify two
the use_ansi flag is False.
"""
+ def __init__(self, *args, **kwargs):
+ super(OracleCompiler, self).__init__(*args, **kwargs)
+ # we have to modify SELECT objects a little bit, so store state here
+ self._select_state = {}
+
def default_from(self):
"""Called when a ``SELECT`` statement has no froms, and no ``FROM`` clause is to be appended.
# TODO: put a real copy-container on Select and copy, or somehow make this
# not modify the Select statement
- if getattr(select, '_oracle_visit', False):
+ if self._select_state.get((select, 'visit'), False):
# cancel out the compiled order_by on the select
if hasattr(select, "order_by_clause"):
self.strings[select.order_by_clause] = ""
return
if select.limit is not None or select.offset is not None:
- select._oracle_visit = True
+ self._select_state[(select, 'visit')] = True
# to use ROW_NUMBER(), an ORDER BY is required.
orderby = self.strings[select.order_by_clause]
if not orderby:
orderby = select.oid_column
self.traverse(orderby)
orderby = self.strings[orderby]
- select.append_column(sql.literal_column("ROW_NUMBER() OVER (ORDER BY %s)" % orderby).label("ora_rn"))
+ if not hasattr(select, '_oracle_visit'):
+ select.append_column(sql.literal_column("ROW_NUMBER() OVER (ORDER BY %s)" % orderby).label("ora_rn"))
+ select._oracle_visit = True
limitselect = sql.select([c for c in select.c if c.key!='ora_rn'])
if select.offset is not None:
limitselect.append_whereclause("ora_rn>%d" % select.offset)
def testoraclelimit(self):
metadata = MetaData()
users = Table('users', metadata, Column('name', String(10), key='username'))
- self.runtest(select([users.c.username], limit=5), "SELECT name FROM (SELECT users.name AS name, ROW_NUMBER() OVER (ORDER BY users.rowid) AS ora_rn FROM users) WHERE ora_rn<=5", dialect=oracle.dialect())
+ s = select([users.c.username], limit=5)
+ self.runtest(s, "SELECT name FROM (SELECT users.name AS name, ROW_NUMBER() OVER (ORDER BY users.rowid) AS ora_rn FROM users) WHERE ora_rn<=5", dialect=oracle.dialect())
+ self.runtest(s, "SELECT name FROM (SELECT users.name AS name, ROW_NUMBER() OVER (ORDER BY users.rowid) AS ora_rn FROM users) WHERE ora_rn<=5", dialect=oracle.dialect())
def testgroupby_and_orderby(self):
self.runtest(