diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2016-07-04 15:54:29 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-04-05 12:18:36 -0400 |
commit | 86ef507cc73ee4a0a104b334d7ce08ad045e0c76 (patch) | |
tree | a077e8f2de416e7a2affb898a13982f8136ad8ba /lib/sqlalchemy/sql/compiler.py | |
parent | 87b1404eda0f6d2e99b3b2a01ae1c641fbe91311 (diff) | |
download | sqlalchemy-86ef507cc73ee4a0a104b334d7ce08ad045e0c76.tar.gz |
Double percent signs based on paramstyle, not dialect
This patch moves the "doubling" of percent signs into
the base compiler and makes it completely a product
of whether or not the paramstyle is format/pyformat or
not. Without this paramstyle, percent signs
are not doubled across text(), literal_column(), and
column().
Change-Id: Ie2f278ab1dbb94b5078f85c0096d74dbfa049197
Fixes: #3740
Diffstat (limited to 'lib/sqlalchemy/sql/compiler.py')
-rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index b18f90312..cc4248009 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -695,7 +695,6 @@ class SQLCompiler(Compiled): name = self.escape_literal_column(name) else: name = self.preparer.quote(name) - table = column.table if table is None or not include_table or not table.named_with_column: return name @@ -715,12 +714,6 @@ class SQLCompiler(Compiled): self.preparer.quote(tablename) + \ "." + name - def escape_literal_column(self, text): - """provide escaping for the literal_column() construct.""" - - # TODO: some dialects might need different behavior here - return text.replace('%', '%%') - def visit_fromclause(self, fromclause, **kwargs): return fromclause.name @@ -732,6 +725,13 @@ class SQLCompiler(Compiled): return self.dialect.type_compiler.process(typeclause.type, **kw) def post_process_text(self, text): + if self.preparer._double_percents: + text = text.replace('%', '%%') + return text + + def escape_literal_column(self, text): + if self.preparer._double_percents: + text = text.replace('%', '%%') return text def visit_textclause(self, textclause, **kw): @@ -1048,6 +1048,14 @@ class SQLCompiler(Compiled): else: return self._generate_generic_binary(binary, opstring, **kw) + def visit_mod_binary(self, binary, operator, **kw): + if self.preparer._double_percents: + return self.process(binary.left, **kw) + " %% " + \ + self.process(binary.right, **kw) + else: + return self.process(binary.left, **kw) + " % " + \ + self.process(binary.right, **kw) + def visit_custom_op_binary(self, element, operator, **kw): kw['eager_grouping'] = operator.eager_grouping return self._generate_generic_binary( @@ -2888,6 +2896,7 @@ class IdentifierPreparer(object): self.escape_to_quote = self.escape_quote * 2 self.omit_schema = omit_schema self._strings = {} + self._double_percents = self.dialect.paramstyle in ('format', 'pyformat') def _with_schema_translate(self, schema_translate_map): prep = self.__class__.__new__(self.__class__) @@ -2902,7 +2911,10 @@ class IdentifierPreparer(object): escaping behavior. """ - return value.replace(self.escape_quote, self.escape_to_quote) + value = value.replace(self.escape_quote, self.escape_to_quote) + if self._double_percents: + value = value.replace('%', '%%') + return value def _unescape_identifier(self, value): """Canonicalize an escaped identifier. |