summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2013-11-28 22:25:09 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2013-11-28 22:25:09 -0500
commit4aaf3753d75c68050c136e734c29aae5ff9504b4 (patch)
tree21cf4c877fca83271447a7e1637a7876aa42f423 /lib/sqlalchemy/sql
parentbb60a8ad946dd331f546f06a156b7ebb87d1709d (diff)
downloadsqlalchemy-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.py4
-rw-r--r--lib/sqlalchemy/sql/selectable.py18
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))