diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-08-21 20:43:54 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-08-21 20:43:54 +0000 |
| commit | 72efa9db3a2591a36de69158435df9f4bb67ee15 (patch) | |
| tree | 500b10760093489e0dac0fd5416aa3bc64ce457f /lib/sqlalchemy/sql | |
| parent | b8e92e6692568476c8bbaa4b27d0e4eace0a3a81 (diff) | |
| download | sqlalchemy-72efa9db3a2591a36de69158435df9f4bb67ee15.tar.gz | |
fixed generative behavior to copy collections, [ticket:752]
Diffstat (limited to 'lib/sqlalchemy/sql')
| -rw-r--r-- | lib/sqlalchemy/sql/expression.py | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index ea87a8c4f..41f2b741b 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -2905,6 +2905,11 @@ class Select(_SelectBaseMixin, FromClause): self._should_correlate = correlate self._distinct = distinct + + # NOTE: the _generate() + # operation creates a *shallow* copy of the object, so append_XXX() methods, + # usually called via a generative method, create a copy of each collection + # by default self._raw_columns = [] self.__correlate = util.Set() @@ -2915,11 +2920,11 @@ class Select(_SelectBaseMixin, FromClause): if columns is not None: for c in columns: - self.append_column(c) + self.append_column(c, copy_collection=False) if from_obj is not None: for f in from_obj: - self.append_from(f) + self.append_from(f, copy_collection=False) if whereclause is not None: self.append_whereclause(whereclause) @@ -2929,7 +2934,7 @@ class Select(_SelectBaseMixin, FromClause): if prefixes is not None: for p in prefixes: - self.append_prefix(p) + self.append_prefix(p, copy_collection=False) _SelectBaseMixin.__init__(self, **kwargs) @@ -3078,20 +3083,29 @@ class Select(_SelectBaseMixin, FromClause): s.append_correlation(fromclause) return s - def append_correlation(self, fromclause): - self.__correlate.add(fromclause) + def append_correlation(self, fromclause, copy_collection=True): + if not copy_collection: + self.__correlate.add(fromclause) + else: + self.__correlate = util.Set(list(self.__correlate) + [fromclause]) - def append_column(self, column): + def append_column(self, column, copy_collection=True): column = _literal_as_column(column) if isinstance(column, _ScalarSelect): column = column.self_group(against=operators.comma_op) + + if not copy_collection: + self._raw_columns.append(column) + else: + self._raw_columns = self._raw_columns + [column] - self._raw_columns.append(column) - - def append_prefix(self, clause): + def append_prefix(self, clause, copy_collection=True): clause = _literal_as_text(clause) - self._prefixes.append(clause) + if not copy_collection: + self._prefixes.append(clause) + else: + self._prefixes = self._prefixes + [clause] def append_whereclause(self, whereclause): if self._whereclause is not None: @@ -3105,10 +3119,14 @@ class Select(_SelectBaseMixin, FromClause): else: self._having = _literal_as_text(having) - def append_from(self, fromclause): + def append_from(self, fromclause, copy_collection=True): if _is_literal(fromclause): fromclause = FromClause(fromclause) - self._froms.add(fromclause) + + if not copy_collection: + self._froms.add(fromclause) + else: + self._froms = util.Set(list(self._froms) + [fromclause]) def _exportable_columns(self): return [c for c in self._raw_columns if isinstance(c, (Selectable, ColumnElement))] |
