cqlsh: preserve original result column names

Patch by Tyler Hobbs; reviewed by Aleksey Yeschenko for CASSANDRA-7806
This commit is contained in:
Tyler Hobbs 2014-08-20 17:46:41 -05:00
parent 58554decc2
commit c4191ed1c9
3 changed files with 14 additions and 11 deletions

View File

@ -1,4 +1,6 @@
2.1.0 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 * (cqlsh) Fix COPY FROM handling of null/empty primary key
values (CASSANDRA-7792) values (CASSANDRA-7792)
* Fix ordering of static cells (CASSANDRA-7763) * Fix ordering of static cells (CASSANDRA-7763)

View File

@ -107,7 +107,7 @@ except ImportError, e:
'Error: %s\n' % (sys.executable, sys.path, e)) 'Error: %s\n' % (sys.executable, sys.path, e))
from cassandra.cluster import Cluster 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.policies import WhiteListRoundRobinPolicy
from cassandra.metadata import protect_name, protect_names, protect_value from cassandra.metadata import protect_name, protect_names, protect_value
from cassandra.auth import PlainTextAuthProvider from cassandra.auth import PlainTextAuthProvider
@ -521,6 +521,7 @@ class Shell(cmd.Cmd):
self.session = self.conn.connect(keyspace) self.session = self.conn.connect(keyspace)
else: else:
self.session = self.conn.connect() self.session = self.conn.connect()
self.session.row_factory = ordered_dict_factory
self.get_connection_versions() self.get_connection_versions()
self.current_keyspace = keyspace self.current_keyspace = keyspace
@ -612,9 +613,9 @@ class Shell(cmd.Cmd):
def get_connection_versions(self): def get_connection_versions(self):
result, = self.session.execute("select * from system.local where key = 'local'") result, = self.session.execute("select * from system.local where key = 'local'")
vers = { vers = {
'build': result.release_version, 'build': result['release_version'],
'protocol': result.native_protocol_version, 'protocol': result['native_protocol_version'],
'cql': result.cql_version, 'cql': result['cql_version'],
} }
self.connection_versions = vers self.connection_versions = vers
self.cass_ver_tuple = tuple(map(int, vers['build'].split('-', 1)[0].split('.')[:3])) 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): def print_static_result(self, rows):
if not rows: if not rows:
return return
colnames = rows[0]._fields colnames = rows[0].keys()
formatted_names = [self.myformat_colname(name) for name in colnames] 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: if self.expand_enabled:
self.print_formatted_result_vertically(formatted_names, formatted_values) self.print_formatted_result_vertically(formatted_names, formatted_values)
else: else:
@ -1423,7 +1424,7 @@ class Shell(cmd.Cmd):
format_value(v, output_encoding=encoding, nullval=nullval, format_value(v, output_encoding=encoding, nullval=nullval,
time_format=self.display_time_format, time_format=self.display_time_format,
float_precision=self.display_float_precision).strval float_precision=self.display_float_precision).strval
writer.writerow(map(fmt, row)) writer.writerow(map(fmt, row.values()))
rows += 1 rows += 1
finally: finally:
if do_close: if do_close:

View File

@ -1149,7 +1149,7 @@ def username_name_completer(ctxt, cass):
return [Hint('<username>')] return [Hint('<username>')]
session = cass.session 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 # END SYNTAX/COMPLETION RULE DEFINITIONS
@ -1167,12 +1167,12 @@ class UserTypesMeta(object):
def from_layout(cls, layout): def from_layout(cls, layout):
result = {} result = {}
for row in layout: for row in layout:
ksname = row.keyspace_name ksname = row['keyspace_name']
if ksname not in result: if ksname not in result:
result[ksname] = {} 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) return cls(meta=result)
def get_usertypes_names(self, keyspace): def get_usertypes_names(self, keyspace):