def description(self): """This read-only attribute is a sequence of 7-item sequences. Each of these sequences contains information describing one result column: - name - type_code - display_size (None in current implementation) - internal_size (None in current implementation) - precision (None in current implementation) - scale (None in current implementation) - null_ok (always True in current implementation) This attribute will be ``None`` for operations that do not return rows or if the cursor has not had an operation invoked via the :py:meth:`execute` method yet. The ``type_code`` can be interpreted by comparing it to the Type Objects specified in the section below. """ if self._operationHandle is None or not self._operationHandle.hasResultSet: return None if self._description is None: req = ttypes.TGetResultSetMetadataReq(self._operationHandle) response = self._connection.client.GetResultSetMetadata(req) _check_status(response) columns = response.schema.columns self._description = [] for col in columns: precision = None scale = None varchar = None primary_type_entry = col.typeDesc.types[0] if primary_type_entry.primitiveEntry is None: # All fancy stuff maps to string type_code = ttypes.TTypeId._VALUES_TO_NAMES[ ttypes.TTypeId.STRING_TYPE] else: type_id = primary_type_entry.primitiveEntry.type type_code = ttypes.TTypeId._VALUES_TO_NAMES[type_id] typeQualifiers = primary_type_entry.primitiveEntry.typeQualifiers if typeQualifiers and typeQualifiers.qualifiers: if constants.PRECISION in typeQualifiers.qualifiers: precision = typeQualifiers.qualifiers[ constants.PRECISION].i32Value scale = typeQualifiers.qualifiers[ constants.SCALE].i32Value elif constants.CHARACTER_MAXIMUM_LENGTH in typeQualifiers.qualifiers: varchar = typeQualifiers.qualifiers[ constants.CHARACTER_MAXIMUM_LENGTH].i32Value self._description.append( (col.columnName.decode('utf-8'), type_code.decode('utf-8'), varchar, None, precision, scale, True)) return self._description
def description(self): """This read-only attribute is a sequence of 7-item sequences. Each of these sequences contains information describing one result column: - name - type_code - display_size (None in current implementation) - internal_size (None in current implementation) - precision (None in current implementation) - scale (None in current implementation) - null_ok (always True in current implementation) This attribute will be ``None`` for operations that do not return rows or if the cursor has not had an operation invoked via the :py:meth:`execute` method yet. The ``type_code`` can be interpreted by comparing it to the Type Objects specified in the section below. """ if self._operationHandle is None or not self._operationHandle.hasResultSet: return None if self._description is None: req = ttypes.TGetResultSetMetadataReq(self._operationHandle) response = self._connection.client.GetResultSetMetadata(req) hive._check_status(response) columns = response.schema.columns self._description = [] # If it's a cypher query, column comment is not null self._column_comments = [ col.comment for col in response.schema.columns if col.comment is not None ] for col in columns: primary_type_entry = col.typeDesc.types[0] if primary_type_entry.primitiveEntry is None: # All fancy stuff maps to string type_code = ttypes.TTypeId._VALUES_TO_NAMES[ ttypes.TTypeId.STRING_TYPE] else: type_id = primary_type_entry.primitiveEntry.type type_code = ttypes.TTypeId._VALUES_TO_NAMES[type_id] self._description.append( (col.columnName.decode('utf-8') if sys.version_info[0] == 2 else col.columnName, type_code.decode('utf-8') if sys.version_info[0] == 2 else type_code, None, None, None, None, True)) return self._description