diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-11-28 22:25:09 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-11-28 22:25:09 -0500 |
commit | 4aaf3753d75c68050c136e734c29aae5ff9504b4 (patch) | |
tree | 21cf4c877fca83271447a7e1637a7876aa42f423 /lib/sqlalchemy/sql | |
parent | bb60a8ad946dd331f546f06a156b7ebb87d1709d (diff) | |
download | sqlalchemy-4aaf3753d75c68050c136e734c29aae5ff9504b4.tar.gz |
- fix up rendering of "of"
- move out tests, dialect specific out of compiler, compiler tests use new API,
legacy API tests in test_selecatble
- add support for adaptation of ForUpdateArg, alias support in compilers
Diffstat (limited to 'lib/sqlalchemy/sql')
-rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 4 | ||||
-rw-r--r-- | lib/sqlalchemy/sql/selectable.py | 18 |
2 files changed, 15 insertions, 7 deletions
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 0fc99897e..3ba3957d6 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -1513,9 +1513,11 @@ class SQLCompiler(Compiled): text += self.order_by_clause(select, order_by_select=order_by_select, **kwargs) + if select._limit is not None or select._offset is not None: text += self.limit_clause(select) - if select._for_update_arg: + + if select._for_update_arg is not None: text += self.for_update_clause(select) if self.ctes and \ diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py index e49c10001..01c803f3b 100644 --- a/lib/sqlalchemy/sql/selectable.py +++ b/lib/sqlalchemy/sql/selectable.py @@ -1151,7 +1151,7 @@ class TableClause(Immutable, FromClause): return [self] -class ForUpdateArg(object): +class ForUpdateArg(ClauseElement): @classmethod def parse_legacy_select(self, arg): @@ -1185,6 +1185,8 @@ class ForUpdateArg(object): read = True elif arg == 'read_nowait': read = nowait = True + elif arg is not True: + raise exc.ArgumentError("Unknown for_update argument: %r" % arg) return ForUpdateArg(read=read, nowait=nowait) @@ -1195,9 +1197,13 @@ class ForUpdateArg(object): elif self.read and self.nowait: return "read_nowait" elif self.nowait: - return "update_nowait" + return "nowait" else: - return "update" + return True + + def _copy_internals(self, clone=_clone, **kw): + if self.of is not None: + self.of = [clone(col, **kw) for col in self.of] def __init__(self, nowait=False, read=False, of=None): """Represents arguments specified to :meth:`.Select.for_update`. @@ -1208,7 +1214,7 @@ class ForUpdateArg(object): self.nowait = nowait self.read = read if of is not None: - self.of = [_only_column_elements(of, "of") + self.of = [_only_column_elements(elem, "of") for elem in util.to_list(of)] else: self.of = None @@ -1770,7 +1776,7 @@ class CompoundSelect(SelectBase): self.selects = [clone(s, **kw) for s in self.selects] if hasattr(self, '_col_map'): del self._col_map - for attr in ('_order_by_clause', '_group_by_clause'): + for attr in ('_order_by_clause', '_group_by_clause', '_for_update_arg'): if getattr(self, attr) is not None: setattr(self, attr, clone(getattr(self, attr), **kw)) @@ -2255,7 +2261,7 @@ class Select(HasPrefixes, SelectBase): # present here. self._raw_columns = [clone(c, **kw) for c in self._raw_columns] for attr in '_whereclause', '_having', '_order_by_clause', \ - '_group_by_clause': + '_group_by_clause', '_for_update_arg': if getattr(self, attr) is not None: setattr(self, attr, clone(getattr(self, attr), **kw)) |