From 8908ea81d230185ddda53509594757929e65e3a5 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 4 Feb 2007 03:19:54 +0000 Subject: [PATCH] OK nevermind that last commit, rolling the quoting fix back --- lib/sqlalchemy/ansisql.py | 29 +++++++++++++++-------------- lib/sqlalchemy/sql.py | 2 +- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/lib/sqlalchemy/ansisql.py b/lib/sqlalchemy/ansisql.py index 794c484394..40ea5b00ac 100644 --- a/lib/sqlalchemy/ansisql.py +++ b/lib/sqlalchemy/ansisql.py @@ -850,13 +850,12 @@ class ANSIIdentifierPreparer(object): self.initial_quote = initial_quote self.final_quote = final_quote or self.initial_quote self.omit_schema = omit_schema - self._is_quoted_regexp = re.compile(r"""^['"%s].+['"%s]$""" % (self.initial_quote, self.final_quote)) self.__strings = {} def _escape_identifier(self, value): """escape an identifier. subclasses should override this to provide database-dependent escaping behavior.""" - return value.replace("'", "''") + return value.replace('"', '""') def _quote_identifier(self, value): """quote an identifier. @@ -873,10 +872,6 @@ class ANSIIdentifierPreparer(object): # some tests would need to be rewritten if this is done. #return value.upper() - def _is_quoted(self, ident): - """return true if the given identifier is already quoted""" - return self._is_quoted_regexp.match(ident) - def _reserved_words(self): return RESERVED_WORDS @@ -889,11 +884,10 @@ class ANSIIdentifierPreparer(object): def _requires_quotes(self, value, case_sensitive): """return true if the given identifier requires quoting.""" return \ - not self._is_quoted(value) and \ - (value in self._reserved_words() \ + value in self._reserved_words() \ or (value[0] in self._illegal_initial_characters()) \ or bool(len([x for x in str(value) if x not in self._legal_characters()])) \ - or (case_sensitive and not value.islower())) + or (case_sensitive and value.lower() != value) def __generic_obj_format(self, obj, ident): if getattr(obj, 'quote', False): @@ -903,13 +897,13 @@ class ANSIIdentifierPreparer(object): try: return self.__strings[(ident, case_sens)] except KeyError: - if self._requires_quotes(ident, getattr(obj, 'case_sensitive', ident.islower())): + if self._requires_quotes(ident, getattr(obj, 'case_sensitive', ident == ident.lower())): self.__strings[(ident, case_sens)] = self._quote_identifier(ident) else: self.__strings[(ident, case_sens)] = ident return self.__strings[(ident, case_sens)] else: - if self._requires_quotes(ident, getattr(obj, 'case_sensitive', ident.islower())): + if self._requires_quotes(ident, getattr(obj, 'case_sensitive', ident == ident.lower())): return self._quote_identifier(ident) else: return ident @@ -940,10 +934,17 @@ class ANSIIdentifierPreparer(object): """Prepare a quoted column name """ # TODO: isinstance alert ! get ColumnClause and Column to better # differentiate themselves - if use_table: - return self.format_table(column.table, use_schema=False) + "." + self.__generic_obj_format(column, column.name) + if isinstance(column, schema.SchemaItem): + if use_table: + return self.format_table(column.table, use_schema=False) + "." + self.__generic_obj_format(column, column.name) + else: + return self.__generic_obj_format(column, column.name) else: - return self.__generic_obj_format(column, column.name) + # literal textual elements get stuck into ColumnClause alot, which shouldnt get quoted + if use_table: + return self.format_table(column.table, use_schema=False) + "." + column.name + else: + return column.name def format_column_with_table(self, column): """Prepare a quoted column name with table name""" diff --git a/lib/sqlalchemy/sql.py b/lib/sqlalchemy/sql.py index 823c8afc84..a59b91b4c0 100644 --- a/lib/sqlalchemy/sql.py +++ b/lib/sqlalchemy/sql.py @@ -1257,7 +1257,7 @@ class _ColumnClause(ColumnElement): self.type = sqltypes.to_instance(type) self._is_oid = _is_oid self.__label = None - self.case_sensitive = case_sensitive + self.case_sensitive = False #text.isalpha() and not text.islower() def _get_label(self): if self.__label is None: if self.table is not None and self.table.named_with_column(): -- 2.47.2