diff options
Diffstat (limited to 'lib/sqlalchemy/sql')
| -rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 10 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/selectable.py | 3 |
2 files changed, 13 insertions, 0 deletions
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index bc463f9a1..ad0a3b686 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -4668,6 +4668,16 @@ class SQLCompiler(Compiled): from_linter = None warn_linting = False + # adjust the whitespace for no inner columns, part of #9440, + # so that a no-col SELECT comes out as "SELECT WHERE..." or + # "SELECT FROM ...". + # while it would be better to have built the SELECT starting string + # without trailing whitespace first, then add whitespace only if inner + # cols were present, this breaks compatibility with various custom + # compilation schemes that are currently being tested. + if not inner_columns: + text = text.rstrip() + if froms: text += " \nFROM " diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py index 39ef420dd..56cca6f73 100644 --- a/lib/sqlalchemy/sql/selectable.py +++ b/lib/sqlalchemy/sql/selectable.py @@ -89,6 +89,7 @@ from .elements import literal_column from .elements import TableValuedColumn from .elements import UnaryExpression from .operators import OperatorType +from .sqltypes import NULLTYPE from .visitors import _TraverseInternalsType from .visitors import InternalTraversal from .visitors import prefix_anon_map @@ -5167,6 +5168,8 @@ class Select( GenerativeSelect.__init__(self) def _scalar_type(self) -> TypeEngine[Any]: + if not self._raw_columns: + return NULLTYPE elem = self._raw_columns[0] cols = list(elem._select_iterable) return cols[0].type |
