mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-23 16:12:01 +00:00
Merge pull request #33021 from DevTeamBK/Issue135
Fix null pointer dereference in low cardinality data
This commit is contained in:
commit
e1a58d0889
@ -636,6 +636,9 @@ void SerializationLowCardinality::deserializeBinaryBulkWithMultipleStreams(
|
||||
|
||||
if (!low_cardinality_state->index_type.need_global_dictionary)
|
||||
{
|
||||
if(additional_keys == nullptr)
|
||||
throw Exception("No additional keys found.", ErrorCodes::INCORRECT_DATA);
|
||||
|
||||
ColumnPtr keys_column = additional_keys;
|
||||
if (low_cardinality_state->null_map)
|
||||
keys_column = ColumnNullable::create(additional_keys, low_cardinality_state->null_map);
|
||||
@ -662,6 +665,9 @@ void SerializationLowCardinality::deserializeBinaryBulkWithMultipleStreams(
|
||||
|
||||
if (!maps.additional_keys_map->empty())
|
||||
{
|
||||
if(additional_keys == nullptr)
|
||||
throw Exception("No additional keys found.", ErrorCodes::INCORRECT_DATA);
|
||||
|
||||
auto used_add_keys = additional_keys->index(*maps.additional_keys_map, 0);
|
||||
|
||||
if (dictionary_type->isNullable())
|
||||
|
@ -302,11 +302,44 @@ def insertLowCardinalityRowWithIncorrectDictType():
|
||||
print(readException(s))
|
||||
s.close()
|
||||
|
||||
def insertLowCardinalityRowWithIncorrectAdditionalKeys():
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
||||
s.settimeout(30)
|
||||
s.connect((CLICKHOUSE_HOST, CLICKHOUSE_PORT))
|
||||
sendHello(s)
|
||||
receiveHello(s)
|
||||
sendQuery(s, 'insert into {}.tab format TSV'.format(CLICKHOUSE_DATABASE))
|
||||
|
||||
# external tables
|
||||
sendEmptyBlock(s)
|
||||
readHeader(s)
|
||||
|
||||
# Data
|
||||
ba = bytearray()
|
||||
writeVarUInt(2, ba) # Data
|
||||
writeStringBinary('', ba)
|
||||
serializeBlockInfo(ba)
|
||||
writeVarUInt(1, ba) # rows
|
||||
writeVarUInt(1, ba) # columns
|
||||
writeStringBinary('x', ba)
|
||||
writeStringBinary('LowCardinality(String)', ba)
|
||||
ba.extend([1] + [0] * 7) # SharedDictionariesWithAdditionalKeys
|
||||
ba.extend([3, 0] + [0] * 6) # indexes type: UInt64 [3], with NO additional keys [0]
|
||||
ba.extend([1] + [0] * 7) # num_keys in dict
|
||||
writeStringBinary('hello', ba) # key
|
||||
ba.extend([1] + [0] * 7) # num_indexes
|
||||
ba.extend([0] * 8) # UInt64 index (0 for 'hello')
|
||||
s.sendall(ba)
|
||||
|
||||
assertPacket(readVarUInt(s), 2)
|
||||
print(readException(s))
|
||||
s.close()
|
||||
|
||||
def main():
|
||||
insertValidLowCardinalityRow()
|
||||
insertLowCardinalityRowWithIndexOverflow()
|
||||
insertLowCardinalityRowWithIncorrectDictType()
|
||||
insertLowCardinalityRowWithIncorrectAdditionalKeys()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
@ -6,3 +6,6 @@ code 117: Index for LowCardinality is out of range. Dictionary size is 1, but f
|
||||
Rows 0 Columns 1
|
||||
Column x type LowCardinality(String)
|
||||
code 117: LowCardinality indexes serialization type for Native format cannot use global dictionary
|
||||
Rows 0 Columns 1
|
||||
Column x type LowCardinality(String)
|
||||
code 117: No additional keys found.
|
||||
|
Loading…
Reference in New Issue
Block a user