]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fix result set handling for case insensitive dupe cols
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 21 Apr 2016 14:36:19 +0000 (10:36 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 21 Apr 2016 14:39:14 +0000 (10:39 -0400)
Fixed bug where when using ``case_sensitive=False`` with an
:class:`.Engine`, the result set would fail to correctly accomodate
for duplicate column names in the result set, causing an error
when the statement is executed in 1.0, and preventing the
"ambiguous column" exception from functioning in 1.1.

Change-Id: If582bb9fdd057e4da3ae42f7180b17d1a1a2d98e
Fixes: #3690
(cherry picked from commit 1f3e5d9826fe989f2212745f6b3592b2ef9b5e32)

doc/build/changelog/changelog_10.rst
lib/sqlalchemy/engine/result.py
test/sql/test_resultset.py

index 07188b7711e97af38c2c0edac99c7b3ed2194739..f5de4f763238900427acdef6936c625433d82447 100644 (file)
 .. changelog::
     :version: 1.0.13
 
+    .. change::
+        :tags: bug, sql
+        :tickets: 3690
+
+        Fixed bug where when using ``case_sensitive=False`` with an
+        :class:`.Engine`, the result set would fail to correctly accomodate
+        for duplicate column names in the result set, causing an error
+        when the statement is executed in 1.0, and preventing the
+        "ambiguous column" exception from functioning in 1.1.
+
     .. change::
         :tags: bug, sql
         :tickets: 3682
index 850bc62ef2271c1be73041dfaba17d7a9dc8787a..a4bfa02be6cfc08bc42ee44a25bab2c1326232be 100644 (file)
@@ -304,6 +304,7 @@ class ResultMetaData(object):
                 for rec in raw:
                     key = rec[1]
                     if key in seen:
+                        key = key.lower() if not self.case_sensitive else key
                         by_key[key] = (None, by_key[key][1], None)
                     seen.add(key)
 
index 2a77fed463eb049edc1c1e37bc8337b5f33cf582..f79318236ad83bcdd8f8de1faeac9254a94c4861 100644 (file)
@@ -707,6 +707,21 @@ class ResultProxyTest(fixtures.TablesTest):
             lambda: row[u2.c.user_id]
         )
 
+    @testing.requires.duplicate_names_in_cursor_description
+    def test_ambiguous_column_case_sensitive(self):
+        eng = engines.testing_engine(options=dict(case_sensitive=False))
+
+        row = eng.execute(select([
+            literal_column('1').label('SOMECOL'),
+            literal_column('1').label('SOMECOL'),
+        ])).first()
+
+        assert_raises_message(
+            exc.InvalidRequestError,
+            "Ambiguous column name",
+            lambda: row['somecol']
+        )
+
     @testing.requires.duplicate_names_in_cursor_description
     def test_ambiguous_column_contains(self):
         users = self.tables.users