summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql/selectable.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2020-04-01 18:31:16 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2020-04-01 19:25:23 -0400
commit49b6c50016c8a038a6df7104560bb3945debe064 (patch)
tree9b5b6b9ad6a6aba5374768afd52783fd8c2170f3 /lib/sqlalchemy/sql/selectable.py
parenta9b62055bfa61c11e9fe0b2984437e2c3e32bf0e (diff)
downloadsqlalchemy-49b6c50016c8a038a6df7104560bb3945debe064.tar.gz
Repair caching / traversals for values
The test suite wasn't running the copy_internals most fixtures, enable that and try to get all cases working. Set up selectable.values to do tuple conversion within compilation step. at the same time, disable caching for selectable.values for the moment and make it equivalent to dml_multi_values. fix cache / compare / copy cases for dml_values and dml_multi_values which weren't fully tested or covered. Change-Id: I484ca6e9cb2b66c2e6a321698f2abc0838db1460
Diffstat (limited to 'lib/sqlalchemy/sql/selectable.py')
-rw-r--r--lib/sqlalchemy/sql/selectable.py24
1 files changed, 8 insertions, 16 deletions
diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py
index e39d61fdb..a0df45b52 100644
--- a/lib/sqlalchemy/sql/selectable.py
+++ b/lib/sqlalchemy/sql/selectable.py
@@ -47,7 +47,6 @@ from .elements import ColumnClause
from .elements import GroupedElement
from .elements import Grouping
from .elements import literal_column
-from .elements import Tuple
from .elements import UnaryExpression
from .visitors import InternalTraversal
from .. import exc
@@ -1264,14 +1263,16 @@ class AliasedReturnsRows(NoInit, FromClause):
self.element._generate_fromclause_column_proxies(self)
def _copy_internals(self, clone=_clone, **kw):
- element = clone(self.element, **kw)
+ existing_element = self.element
+
+ super(AliasedReturnsRows, self)._copy_internals(clone=clone, **kw)
# the element clone is usually against a Table that returns the
# same object. don't reset exported .c. collections and other
- # memoized details if nothing changed
- if element is not self.element:
+ # memoized details if it was not changed. this saves a lot on
+ # performance.
+ if existing_element is not self.element:
self._reset_column_collection()
- self.element = element
@property
def _from_objects(self):
@@ -1528,15 +1529,6 @@ class CTE(Generative, HasPrefixes, HasSuffixes, AliasedReturnsRows):
self._suffixes = _suffixes
super(CTE, self)._init(selectable, name=name)
- def _copy_internals(self, clone=_clone, **kw):
- super(CTE, self)._copy_internals(clone, **kw)
- # TODO: I don't like that we can't use the traversal data here
- if self._cte_alias is not None:
- self._cte_alias = clone(self._cte_alias, **kw)
- self._restates = frozenset(
- [clone(elem, **kw) for elem in self._restates]
- )
-
def alias(self, name=None, flat=False):
"""Return an :class:`.Alias` of this :class:`.CTE`.
@@ -2064,7 +2056,7 @@ class Values(Generative, FromClause):
_traverse_internals = [
("_column_args", InternalTraversal.dp_clauseelement_list,),
- ("_data", InternalTraversal.dp_clauseelement_list),
+ ("_data", InternalTraversal.dp_dml_multi_values),
("name", InternalTraversal.dp_string),
("literal_binds", InternalTraversal.dp_boolean),
]
@@ -2155,7 +2147,7 @@ class Values(Generative, FromClause):
"""
- self._data += tuple(Tuple(*row).self_group() for row in values)
+ self._data += (values,)
def _populate_column_collection(self):
for c in self._column_args: