]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fixed bug whereby using a label_length on dialect that was smaller
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 9 Dec 2012 00:25:04 +0000 (19:25 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 9 Dec 2012 00:25:04 +0000 (19:25 -0500)
than the size of actual column identifiers would fail to render
the columns correctly in a SELECT statement.
[ticket:2610]

doc/build/changelog/changelog_08.rst
lib/sqlalchemy/schema.py
lib/sqlalchemy/sql/expression.py
test/sql/test_labels.py

index 3ef8bb6324dcfe761f57849696aa6dfe0bc9bb5e..012a052c8300ce0ddada0adc372bdbd5b2af9e41 100644 (file)
@@ -6,6 +6,14 @@
 .. changelog::
     :version: 0.8.0b2
 
+    .. change::
+        :tags: sql, bug
+        :tickets: 2610
+
+      Fixed bug whereby using a label_length on dialect that was smaller
+      than the size of actual column identifiers would fail to render
+      the columns correctly in a SELECT statement.
+
     .. change::
         :tags: sql, feature
         :tickets: 2623
index 2fb542a43051579afb58e9b1404e765772b0bf36..4f3655a1dac4447c2a6bc9a442dabfcdaaade786 100644 (file)
@@ -1114,7 +1114,8 @@ class Column(SchemaItem, expression.ColumnClause):
         c.dispatch._update(self.dispatch)
         return c
 
-    def _make_proxy(self, selectable, name=None, key=None):
+    def _make_proxy(self, selectable, name=None, key=None,
+                            name_is_truncatable=False, **kw):
         """Create a *proxy* for this column.
 
         This is a copy of this ``Column`` referenced by a different parent
@@ -1130,7 +1131,8 @@ class Column(SchemaItem, expression.ColumnClause):
                     "been assigned.")
         try:
             c = self._constructor(
-                expression._as_truncated(name or self.name),
+                expression._as_truncated(name or self.name) if \
+                                name_is_truncatable else (name or self.name),
                 self.type,
                 key=key if key else name if name else self.key,
                 primary_key=self.primary_key,
index 7065495181e8ab47a75a981b2a72e98affe2c649..ee6f134b4d4d3634352d6348c6f6c0dce98996d8 100644 (file)
@@ -2320,7 +2320,7 @@ class ColumnElement(ClauseElement, ColumnOperators):
         return hasattr(other, 'name') and hasattr(self, 'name') and \
                 other.name == self.name
 
-    def _make_proxy(self, selectable, name=None, **kw):
+    def _make_proxy(self, selectable, name=None, name_is_truncatable=False, **kw):
         """Create a new :class:`.ColumnElement` representing this
         :class:`.ColumnElement` as it appears in the select list of a
         descending selectable.
@@ -2331,7 +2331,7 @@ class ColumnElement(ClauseElement, ColumnOperators):
             key = str(self)
         else:
             key = name
-        co = ColumnClause(_as_truncated(name),
+        co = ColumnClause(_as_truncated(name) if name_is_truncatable else name,
                             selectable,
                             type_=getattr(self,
                           'type', None))
@@ -4490,12 +4490,15 @@ class ColumnClause(Immutable, ColumnElement):
                                 _compared_to_type=self.type,
                                 unique=True)
 
-    def _make_proxy(self, selectable, name=None, attach=True, **kw):
+    def _make_proxy(self, selectable, name=None, attach=True,
+                            name_is_truncatable=False, **kw):
         # propagate the "is_literal" flag only if we are keeping our name,
         # otherwise its considered to be a label
         is_literal = self.is_literal and (name is None or name == self.name)
         c = self._constructor(
-                    _as_truncated(name if name else self.name),
+                    _as_truncated(name or self.name) if \
+                                    name_is_truncatable else \
+                                    (name or self.name),
                     selectable=selectable,
                     type_=self.type,
                     is_literal=is_literal
@@ -5727,7 +5730,8 @@ class Select(HasPrefixes, SelectBase):
             if hasattr(c, '_make_proxy'):
                 c._make_proxy(self,
                         name=c._label if self.use_labels else None,
-                        key=c._key_label if self.use_labels else None)
+                        key=c._key_label if self.use_labels else None,
+                        name_is_truncatable=True)
 
     def _refresh_for_new_column(self, column):
         for fromclause in self._froms:
@@ -5738,7 +5742,8 @@ class Select(HasPrefixes, SelectBase):
                     if our_label not in self.c:
                         return col._make_proxy(self,
                             name=col._label if self.use_labels else None,
-                            key=col._key_label if self.use_labels else None)
+                            key=col._key_label if self.use_labels else None,
+                            name_is_truncatable=True)
                 return None
         return None
 
index 05671619efd19e6ce442afb5d05319666d1d0904..d7cb8db4a3cc6ae392a0f84aed7d4cf7e8c5a7d8 100644 (file)
@@ -491,3 +491,46 @@ class LabelLengthTest(fixtures.TestBase, AssertsCompiledSQL):
             dialect=compile_dialect)
 
 
+    def test_colnames_longer_than_labels_lowercase(self):
+        t1 = table('a', column('abcde'))
+        self._test_colnames_longer_than_labels(t1)
+
+    def test_colnames_longer_than_labels_uppercase(self):
+        m = MetaData()
+        t1 = Table('a', m, Column('abcde', Integer))
+        self._test_colnames_longer_than_labels(t1)
+
+    def _test_colnames_longer_than_labels(self, t1):
+        dialect = default.DefaultDialect(label_length=4)
+        a1 = t1.alias(name='asdf')
+
+        # 'abcde' is longer than 4, but rendered as itself
+        # needs to have all characters
+        s = select([a1])
+        self.assert_compile(
+            select([a1]),
+            "SELECT asdf.abcde FROM a AS asdf",
+            dialect=dialect
+        )
+        compiled = s.compile(dialect=dialect)
+        assert set(compiled.result_map['abcde'][1]).issuperset([
+                    'abcde',
+                    a1.c.abcde,
+                    'abcde'
+                ])
+
+        # column still there, but short label
+        s = select([a1]).apply_labels()
+        self.assert_compile(
+            s,
+            "SELECT asdf.abcde AS _1 FROM a AS asdf",
+            dialect=dialect
+        )
+        compiled = s.compile(dialect=dialect)
+        assert set(compiled.result_map['_1'][1]).issuperset([
+                    'asdf_abcde',
+                    a1.c.abcde,
+                    '_1'
+                ])
+
+