diff --git a/cassandra/metadata.py b/cassandra/metadata.py index 1cd801ee..9e92f938 100644 --- a/cassandra/metadata.py +++ b/cassandra/metadata.py @@ -1777,12 +1777,9 @@ class SchemaParserV22(_SchemaParser): comparator = types.lookup_casstype(row["comparator"]) table_meta.comparator = comparator - if issubclass(comparator, types.CompositeType): - column_name_types = comparator.subtypes - is_composite_comparator = True - else: - column_name_types = (comparator,) - is_composite_comparator = False + is_dct_comparator = issubclass(comparator, types.DynamicCompositeType) + is_composite_comparator = issubclass(comparator, types.CompositeType) + column_name_types = comparator.subtypes if is_composite_comparator else (comparator,) num_column_name_components = len(column_name_types) last_col = column_name_types[-1] @@ -1796,7 +1793,8 @@ class SchemaParserV22(_SchemaParser): if column_aliases is not None: column_aliases = json.loads(column_aliases) - else: + + if not column_aliases: # json load failed or column_aliases empty PYTHON-562 column_aliases = [r.get('column_name') for r in clustering_rows] if is_composite_comparator: @@ -1819,10 +1817,10 @@ class SchemaParserV22(_SchemaParser): # Some thrift tables define names in composite types (see PYTHON-192) if not column_aliases and hasattr(comparator, 'fieldnames'): - column_aliases = comparator.fieldnames + column_aliases = filter(None, comparator.fieldnames) else: is_compact = True - if column_aliases or not col_rows: + if column_aliases or not col_rows or is_dct_comparator: has_value = True clustering_size = num_column_name_components else: @@ -1867,7 +1865,7 @@ class SchemaParserV22(_SchemaParser): if len(column_aliases) > i: column_name = column_aliases[i] else: - column_name = "column%d" % i + column_name = "column%d" % (i + 1) data_type = column_name_types[i] cql_type = _cql_from_cass_type(data_type)