From 7bb74f70e9d239a488e0c909c28b4131dbfd5067 Mon Sep 17 00:00:00 2001
From: Matt Riedemann <mriedem@us.ibm.com>
Date: Fri, 18 Jul 2014 11:42:38 -0700
Subject: [PATCH] Fix ibmdb2 unique constraint handling for sqlalchemy 0.9

The ibmdb2 unique constraint code was accessing the private _all_cols
member var in iterating over columns which breaks in sqlalchemy 0.9 so
fix up the code to not use internals of sqlalchemy.

UniqueConstraint in sqlalchemy extends ColumnCollectionConstraint
which implements __iter__ to generate a tuple of the columns in
the constraint, so we just iterate over the constraint as the fix.

This is based on a patch from Rahul Priyadarshi in ibm-db-sa issue
158:

https://code.google.com/p/ibm-db/issues/detail?id=158

Co-Authored-By: Rahul Priyadarshi <rahul.priyadarshi@in.ibm.com>

Change-Id: I0f06f6314c382e83573d762abe5981db0a02a83a
---
 migrate/changeset/databases/ibmdb2.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/migrate/changeset/databases/ibmdb2.py b/migrate/changeset/databases/ibmdb2.py
index fe28512..e583bd4 100644
--- a/migrate/changeset/databases/ibmdb2.py
+++ b/migrate/changeset/databases/ibmdb2.py
@@ -262,13 +262,13 @@ class IBMDBConstraintGenerator(ansisql.ANSIConstraintGenerator):
         if (isinstance(constraint, UniqueConstraint) and
                 is_unique_constraint_with_null_columns_supported(
                     self.dialect)):
-            for column in constraint.columns._all_cols:
+            for column in constraint:
                 if column.nullable:
                     constraint.exclude_nulls = True
                     break
         if getattr(constraint, 'exclude_nulls', None):
             index = Index(constraint.name,
-                          *(column for column in constraint.columns._all_cols),
+                          *(column for column in constraint),
                           unique=True)
             sql = self.process(CreateIndex(index))
             sql += ' EXCLUDE NULL KEYS'
@@ -285,7 +285,7 @@ class IBMDBConstraintDropper(ansisql.ANSIConstraintDropper,
         if (isinstance(constraint, UniqueConstraint) and
                 is_unique_constraint_with_null_columns_supported(
                     self.dialect)):
-            for column in constraint.columns._all_cols:
+            for column in constraint:
                 if column.nullable:
                     constraint.exclude_nulls = True
                     break