diff options
Diffstat (limited to 'lib/sqlalchemy/dialects/postgresql/ext.py')
-rw-r--r-- | lib/sqlalchemy/dialects/postgresql/ext.py | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/lib/sqlalchemy/dialects/postgresql/ext.py b/lib/sqlalchemy/dialects/postgresql/ext.py index 426028239..f9cbc945a 100644 --- a/lib/sqlalchemy/dialects/postgresql/ext.py +++ b/lib/sqlalchemy/dialects/postgresql/ext.py @@ -6,9 +6,12 @@ # the MIT License: http://www.opensource.org/licenses/mit-license.php from .array import ARRAY +from ... import util +from ...sql import coercions from ...sql import elements from ...sql import expression from ...sql import functions +from ...sql import roles from ...sql.schema import ColumnCollectionConstraint @@ -50,16 +53,18 @@ class aggregate_order_by(expression.ColumnElement): __visit_name__ = "aggregate_order_by" def __init__(self, target, *order_by): - self.target = elements._literal_as_binds(target) + self.target = coercions.expect(roles.ExpressionElementRole, target) _lob = len(order_by) if _lob == 0: raise TypeError("at least one ORDER BY element is required") elif _lob == 1: - self.order_by = elements._literal_as_binds(order_by[0]) + self.order_by = coercions.expect( + roles.ExpressionElementRole, order_by[0] + ) else: self.order_by = elements.ClauseList( - *order_by, _literal_as_text=elements._literal_as_binds + *order_by, _literal_as_text_role=roles.ExpressionElementRole ) def self_group(self, against=None): @@ -166,7 +171,10 @@ class ExcludeConstraint(ColumnCollectionConstraint): expressions, operators = zip(*elements) for (expr, column, strname, add_element), operator in zip( - self._extract_col_expression_collection(expressions), operators + coercions.expect_col_expression_collection( + roles.DDLConstraintColumnRole, expressions + ), + operators, ): if add_element is not None: columns.append(add_element) @@ -177,8 +185,6 @@ class ExcludeConstraint(ColumnCollectionConstraint): # backwards compat self.operators[name] = operator - expr = expression._literal_as_column(expr) - render_exprs.append((expr, name, operator)) self._render_exprs = render_exprs @@ -193,9 +199,21 @@ class ExcludeConstraint(ColumnCollectionConstraint): self.using = kw.get("using", "gist") where = kw.get("where") if where is not None: - self.where = expression._literal_as_text( - where, allow_coercion_to_text=True + self.where = coercions.expect(roles.StatementOptionRole, where) + + def _set_parent(self, table): + super(ExcludeConstraint, self)._set_parent(table) + + self._render_exprs = [ + ( + expr if isinstance(expr, elements.ClauseElement) else colexpr, + name, + operator, + ) + for (expr, name, operator), colexpr in util.zip_longest( + self._render_exprs, self.columns ) + ] def copy(self, **kw): elements = [(col, self.operators[col]) for col in self.columns.keys()] |