diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sqlalchemy/dialects/firebird/base.py | 26 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/oracle/base.py | 30 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/default.py | 52 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/elements.py | 11 |
4 files changed, 59 insertions, 60 deletions
diff --git a/lib/sqlalchemy/dialects/firebird/base.py b/lib/sqlalchemy/dialects/firebird/base.py index a852c7824..c7c921cb4 100644 --- a/lib/sqlalchemy/dialects/firebird/base.py +++ b/lib/sqlalchemy/dialects/firebird/base.py @@ -86,7 +86,6 @@ from sqlalchemy.engine import default from sqlalchemy.engine import reflection from sqlalchemy.sql import compiler from sqlalchemy.sql import expression -from sqlalchemy.sql.elements import quoted_name from sqlalchemy.types import BIGINT from sqlalchemy.types import BLOB from sqlalchemy.types import DATE @@ -659,31 +658,6 @@ class FBDialect(default.DefaultDialect): "implicit_returning", True ) - def normalize_name(self, name): - # Remove trailing spaces: FB uses a CHAR() type, - # that is padded with spaces - name = name and name.rstrip() - if name is None: - return None - elif name.upper() == name and not ( - self.identifier_preparer._requires_quotes - )(name.lower()): - return name.lower() - elif name.lower() == name: - return quoted_name(name, quote=True) - else: - return name - - def denormalize_name(self, name): - if name is None: - return None - elif name.lower() == name and not ( - self.identifier_preparer._requires_quotes - )(name.lower()): - return name.upper() - else: - return name - def has_table(self, connection, table_name, schema=None): """Return ``True`` if the given table exists, ignoring the `schema`.""" diff --git a/lib/sqlalchemy/dialects/oracle/base.py b/lib/sqlalchemy/dialects/oracle/base.py index 48b90f7e9..4c5a717b9 100644 --- a/lib/sqlalchemy/dialects/oracle/base.py +++ b/lib/sqlalchemy/dialects/oracle/base.py @@ -457,7 +457,6 @@ from ...sql import compiler from ...sql import expression from ...sql import util as sql_util from ...sql import visitors -from ...sql.elements import quoted_name from ...types import BLOB from ...types import CHAR from ...types import CLOB @@ -1388,35 +1387,6 @@ class OracleDialect(default.DefaultDialect): ) return cursor.first() is not None - def normalize_name(self, name): - if name is None: - return None - if util.py2k: - if isinstance(name, str): - name = name.decode(self.encoding) - if name.upper() == name and not ( - self.identifier_preparer._requires_quotes - )(name.lower()): - return name.lower() - elif name.lower() == name: - return quoted_name(name, quote=True) - else: - return name - - def denormalize_name(self, name): - if name is None: - return None - elif name.lower() == name and not ( - self.identifier_preparer._requires_quotes - )(name.lower()): - name = name.upper() - if util.py2k: - if not self.supports_unicode_binds: - name = name.encode(self.encoding) - else: - name = unicode(name) # noqa - return name - def _get_default_schema_name(self, connection): return self.normalize_name( connection.execute("SELECT USER FROM DUAL").scalar() diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py index 79b8622d5..d1253f678 100644 --- a/lib/sqlalchemy/engine/default.py +++ b/lib/sqlalchemy/engine/default.py @@ -29,6 +29,7 @@ from .. import util from ..sql import compiler from ..sql import expression from ..sql import schema +from ..sql.elements import quoted_name AUTOCOMMIT_REGEXP = re.compile( @@ -580,6 +581,57 @@ class DefaultDialect(interfaces.Dialect): # the configured default of this dialect. self.set_isolation_level(dbapi_conn, self.default_isolation_level) + def normalize_name(self, name): + if name is None: + return None + if util.py2k: + if isinstance(name, str): + name = name.decode(self.encoding) + + name_lower = name.lower() + name_upper = name.upper() + + if name_upper == name_lower: + # name has no upper/lower conversion, e.g. non-european characters. + # return unchanged + return name + elif name_upper == name and not ( + self.identifier_preparer._requires_quotes + )(name_lower): + # name is all uppercase and doesn't require quoting; normalize + # to all lower case + return name_lower + elif name_lower == name: + # name is all lower case, which if denormalized means we need to + # force quoting on it + return quoted_name(name, quote=True) + else: + # name is mixed case, means it will be quoted in SQL when used + # later, no normalizes + return name + + def denormalize_name(self, name): + if name is None: + return None + + name_lower = name.lower() + name_upper = name.upper() + + if name_upper == name_lower: + # name has no upper/lower conversion, e.g. non-european characters. + # return unchanged + return name + elif name_lower == name and not ( + self.identifier_preparer._requires_quotes + )(name_lower): + name = name_upper + if util.py2k: + if not self.supports_unicode_binds: + name = name.encode(self.encoding) + else: + name = unicode(name) # noqa + return name + class StrCompileDialect(DefaultDialect): diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index 78c434cff..e1ff44285 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -4479,10 +4479,13 @@ class quoted_name(util.MemoizedSlots, util.text_type): return util.text_type(self).upper() def __repr__(self): - backslashed = self.encode("ascii", "backslashreplace") - if not util.py2k: - backslashed = backslashed.decode("ascii") - return "'%s'" % backslashed + if util.py2k: + backslashed = self.encode("ascii", "backslashreplace") + if not util.py2k: + backslashed = backslashed.decode("ascii") + return "'%s'" % backslashed + else: + return str.__repr__(self) def _select_iterables(elements): |
