diff --git a/CHANGES.txt b/CHANGES.txt index 2664f0f7be..92a177d952 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ 2.1.0 + * (cqlsh) Fix column name formatting for functions, CAS operations, + and UDT field selections (CASSANDRA-7806) * (cqlsh) Fix COPY FROM handling of null/empty primary key values (CASSANDRA-7792) * Fix ordering of static cells (CASSANDRA-7763) diff --git a/bin/cqlsh b/bin/cqlsh index 4c90f2dd10..686e07bd3f 100755 --- a/bin/cqlsh +++ b/bin/cqlsh @@ -107,7 +107,7 @@ except ImportError, e: 'Error: %s\n' % (sys.executable, sys.path, e)) from cassandra.cluster import Cluster -from cassandra.query import SimpleStatement +from cassandra.query import SimpleStatement, ordered_dict_factory from cassandra.policies import WhiteListRoundRobinPolicy from cassandra.metadata import protect_name, protect_names, protect_value from cassandra.auth import PlainTextAuthProvider @@ -521,6 +521,7 @@ class Shell(cmd.Cmd): self.session = self.conn.connect(keyspace) else: self.session = self.conn.connect() + self.session.row_factory = ordered_dict_factory self.get_connection_versions() self.current_keyspace = keyspace @@ -612,9 +613,9 @@ class Shell(cmd.Cmd): def get_connection_versions(self): result, = self.session.execute("select * from system.local where key = 'local'") vers = { - 'build': result.release_version, - 'protocol': result.native_protocol_version, - 'cql': result.cql_version, + 'build': result['release_version'], + 'protocol': result['native_protocol_version'], + 'cql': result['cql_version'], } self.connection_versions = vers self.cass_ver_tuple = tuple(map(int, vers['build'].split('-', 1)[0].split('.')[:3])) @@ -952,9 +953,9 @@ class Shell(cmd.Cmd): def print_static_result(self, rows): if not rows: return - colnames = rows[0]._fields + colnames = rows[0].keys() formatted_names = [self.myformat_colname(name) for name in colnames] - formatted_values = [map(self.myformat_value, row) for row in rows] + formatted_values = [map(self.myformat_value, row.values()) for row in rows] if self.expand_enabled: self.print_formatted_result_vertically(formatted_names, formatted_values) else: @@ -1423,7 +1424,7 @@ class Shell(cmd.Cmd): format_value(v, output_encoding=encoding, nullval=nullval, time_format=self.display_time_format, float_precision=self.display_float_precision).strval - writer.writerow(map(fmt, row)) + writer.writerow(map(fmt, row.values())) rows += 1 finally: if do_close: diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py index 3d489d30e8..1c9b00fc29 100644 --- a/pylib/cqlshlib/cql3handling.py +++ b/pylib/cqlshlib/cql3handling.py @@ -1149,7 +1149,7 @@ def username_name_completer(ctxt, cass): return [Hint('')] session = cass.session - return [maybe_quote(row[0].replace("'", "''")) for row in session.execute("LIST USERS")] + return [maybe_quote(row.values()[0].replace("'", "''")) for row in session.execute("LIST USERS")] # END SYNTAX/COMPLETION RULE DEFINITIONS @@ -1167,12 +1167,12 @@ class UserTypesMeta(object): def from_layout(cls, layout): result = {} for row in layout: - ksname = row.keyspace_name + ksname = row['keyspace_name'] if ksname not in result: result[ksname] = {} - utname = row.type_name + utname = row['type_name'] - result[ksname][utname] = zip(row.field_names, row.field_types) + result[ksname][utname] = zip(row['field_names'], row['field_types']) return cls(meta=result) def get_usertypes_names(self, keyspace):