summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2017-12-06 14:12:42 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2017-12-06 16:06:52 -0500
commit5e8396a60ed69341b1e73ac415c7cd6dceec0c8a (patch)
tree44032f3c7009db43c77b523db3eed4d3c6520752
parent76b5981b41618048c4c593bbd9062c34ddc1fa36 (diff)
downloadsqlalchemy-5e8396a60ed69341b1e73ac415c7cd6dceec0c8a.tar.gz
Change visit name for ColumnElement
No SQLA built-in subclasses ColumnElement without specifying an alternate visit_name, and user defined ColumnElement subclasses should avoid being treated like ColumnClause, e.g. where a Table is present. Fixes: #4142 Change-Id: I15ed09ba8bdebae4cb0c7e5e5df3f59351477577
-rw-r--r--doc/build/changelog/unreleased_12/4142.rst9
-rw-r--r--lib/sqlalchemy/sql/elements.py2
-rw-r--r--test/sql/test_utils.py16
3 files changed, 24 insertions, 3 deletions
diff --git a/doc/build/changelog/unreleased_12/4142.rst b/doc/build/changelog/unreleased_12/4142.rst
new file mode 100644
index 000000000..be5ac2fb7
--- /dev/null
+++ b/doc/build/changelog/unreleased_12/4142.rst
@@ -0,0 +1,9 @@
+.. change::
+ :tags: bug, sql
+ :tickets: 4142
+
+ Changed the "visit name" of :class:`.ColumnElement` from "column" to
+ "column_element", so that when this element is used as the basis for a
+ user-defined SQL element, it is not assumed to behave like a table-bound
+ :class:`.ColumnClause` when processed by various SQL traversal utilities,
+ as are commonly used by the ORM.
diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py
index 3b2bcb4ff..2cc1d9c42 100644
--- a/lib/sqlalchemy/sql/elements.py
+++ b/lib/sqlalchemy/sql/elements.py
@@ -571,7 +571,7 @@ class ColumnElement(operators.ColumnOperators, ClauseElement):
"""
- __visit_name__ = 'column'
+ __visit_name__ = 'column_element'
primary_key = False
foreign_keys = []
diff --git a/test/sql/test_utils.py b/test/sql/test_utils.py
index 84e7ad732..bd8368cd2 100644
--- a/test/sql/test_utils.py
+++ b/test/sql/test_utils.py
@@ -1,8 +1,9 @@
-from sqlalchemy.testing import fixtures, is_true, is_false
+from sqlalchemy.testing import fixtures, is_true, is_false, eq_
from sqlalchemy import MetaData, Table, Column, Integer, String
from sqlalchemy import and_, or_, bindparam
-from sqlalchemy.sql.elements import ClauseList
+from sqlalchemy.sql.elements import ClauseList, ColumnElement
from sqlalchemy.sql import operators
+from sqlalchemy.sql import util as sql_util
class CompareClausesTest(fixtures.TestBase):
@@ -106,3 +107,14 @@ class CompareClausesTest(fixtures.TestBase):
is_false(b1.compare(b8))
is_false(b8.compare(b9))
is_true(b8.compare(b8))
+
+
+class MiscTest(fixtures.TestBase):
+ def test_column_element_no_visit(self):
+ class MyElement(ColumnElement):
+ pass
+
+ eq_(
+ sql_util.find_tables(MyElement(), check_columns=True),
+ []
+ )