if the data type of numeric key is not native uint, convert to complex.

This commit is contained in:
xiebin 2023-05-10 23:43:40 +08:00
parent dc3aca6e98
commit f9eb6ca6fd
3 changed files with 16 additions and 6 deletions

View File

@ -19,6 +19,7 @@
#include <Functions/FunctionFactory.h>
#include <Common/isLocalAddress.h>
#include <Interpreters/Context.h>
#include <DataTypes/DataTypeFactory.h>
namespace DB
@ -609,17 +610,20 @@ getDictionaryConfigurationFromAST(const ASTCreateQuery & query, ContextPtr conte
bool complex = DictionaryFactory::instance().isComplex(dictionary_layout->layout_type);
if (pk_attrs.size() > 1 && !complex
&& DictionaryFactory::instance().convertToComplex(dictionary_layout->layout_type))
{
complex = true;
}
auto all_attr_names_and_types = buildDictionaryAttributesConfiguration(
xml_document, structure_element, query.dictionary_attributes_list, pk_attrs);
checkPrimaryKey(all_attr_names_and_types, pk_attrs);
/// If the pk size is 1 and pk's DataType is not native uint(UInt8~UInt64), we should convert to complex,
/// because the data type of Numeric key(simple layout) is UInt64.
if ((pk_attrs.size() > 1 || (pk_attrs.size() == 1 && !WhichDataType(DataTypeFactory::instance().get(all_attr_names_and_types.find(pk_attrs[0])->second.type)).isNativeUInt()))
&& !complex
&& DictionaryFactory::instance().convertToComplex(dictionary_layout->layout_type))
{
complex = true;
}
buildPrimaryKeyConfiguration(xml_document, structure_element, complex, pk_attrs, query.dictionary_attributes_list);
buildLayoutConfiguration(xml_document, current_dictionary, query.dictionary->dict_settings, dictionary_layout);

View File

@ -2,3 +2,4 @@ dict_flat_simple Flat
dict_hashed_simple Hashed
dict_hashed_complex ComplexKeyHashed
dict_hashed_simple_auto_convert ComplexKeyHashed
dict_hashed_simple_int_auto_convert ComplexKeyHashed

View File

@ -26,4 +26,9 @@ SYSTEM RELOAD DICTIONARY dict_hashed_simple_auto_convert;
SELECT name, type FROM system.dictionaries WHERE database = currentDatabase() AND name = 'dict_hashed_simple_auto_convert';
DROP DICTIONARY dict_hashed_simple_auto_convert;
CREATE DICTIONARY dict_hashed_simple_int_auto_convert (v0 Int16, v1 UInt16, v2 UInt16) PRIMARY KEY v0 SOURCE(CLICKHOUSE(TABLE 'dict_data')) LIFETIME(0) LAYOUT(hashed());
SYSTEM RELOAD DICTIONARY dict_hashed_simple_int_auto_convert;
SELECT name, type FROM system.dictionaries WHERE database = currentDatabase() AND name = 'dict_hashed_simple_int_auto_convert';
DROP DICTIONARY dict_hashed_simple_int_auto_convert;
DROP TABLE dict_data;