77#include " ip4.h"
88#include " ip6.h"
99#include " lowcardinality.h"
10+ #include " lowcardinalityadaptor.h"
1011#include " nothing.h"
1112#include " nullable.h"
1213#include " numeric.h"
@@ -94,17 +95,17 @@ static ColumnRef CreateTerminalColumn(const TypeAst& ast) {
9495 }
9596}
9697
97- static ColumnRef CreateColumnFromAst (const TypeAst& ast) {
98+ static ColumnRef CreateColumnFromAst (const TypeAst& ast, CreateColumnByTypeSettings settings ) {
9899 switch (ast.meta ) {
99100 case TypeAst::Array: {
100101 return std::make_shared<ColumnArray>(
101- CreateColumnFromAst (ast.elements .front ())
102+ CreateColumnFromAst (ast.elements .front (), settings )
102103 );
103104 }
104105
105106 case TypeAst::Nullable: {
106107 return std::make_shared<ColumnNullable>(
107- CreateColumnFromAst (ast.elements .front ()),
108+ CreateColumnFromAst (ast.elements .front (), settings ),
108109 std::make_shared<ColumnUInt8>()
109110 );
110111 }
@@ -118,7 +119,7 @@ static ColumnRef CreateColumnFromAst(const TypeAst& ast) {
118119
119120 columns.reserve (ast.elements .size ());
120121 for (const auto & elem : ast.elements ) {
121- if (auto col = CreateColumnFromAst (elem)) {
122+ if (auto col = CreateColumnFromAst (elem, settings )) {
122123 columns.push_back (col);
123124 } else {
124125 return nullptr ;
@@ -151,14 +152,27 @@ static ColumnRef CreateColumnFromAst(const TypeAst& ast) {
151152 }
152153 case TypeAst::LowCardinality: {
153154 const auto nested = ast.elements .front ();
154- switch (nested.code ) {
155- // TODO (nemkov): update this to maximize code reuse.
156- case Type::String:
157- return std::make_shared<ColumnLowCardinalityT<ColumnString>>();
158- case Type::FixedString:
159- return std::make_shared<ColumnLowCardinalityT<ColumnFixedString>>(nested.elements .front ().value );
160- default :
161- throw std::runtime_error (" LowCardinality(" + nested.name + " ) is not supported" );
155+ if (settings.low_cardinality_as_wrapped_column ) {
156+ switch (nested.code ) {
157+ // TODO (nemkov): update this to maximize code reuse.
158+ case Type::String:
159+ return std::make_shared<LowCardinalitySerializationAdaptor<ColumnString>>();
160+ case Type::FixedString:
161+ return std::make_shared<LowCardinalitySerializationAdaptor<ColumnFixedString>>(nested.elements .front ().value );
162+ default :
163+ throw std::runtime_error (" LowCardinality(" + nested.name + " ) is not supported" );
164+ }
165+ }
166+ else {
167+ switch (nested.code ) {
168+ // TODO (nemkov): update this to maximize code reuse.
169+ case Type::String:
170+ return std::make_shared<ColumnLowCardinalityT<ColumnString>>();
171+ case Type::FixedString:
172+ return std::make_shared<ColumnLowCardinalityT<ColumnFixedString>>(nested.elements .front ().value );
173+ default :
174+ throw std::runtime_error (" LowCardinality(" + nested.name + " ) is not supported" );
175+ }
162176 }
163177 }
164178 case TypeAst::SimpleAggregateFunction: {
@@ -178,10 +192,10 @@ static ColumnRef CreateColumnFromAst(const TypeAst& ast) {
178192} // namespace
179193
180194
181- ColumnRef CreateColumnByType (const std::string& type_name) {
195+ ColumnRef CreateColumnByType (const std::string& type_name, CreateColumnByTypeSettings settings ) {
182196 auto ast = ParseTypeName (type_name);
183197 if (ast != nullptr ) {
184- return CreateColumnFromAst (*ast);
198+ return CreateColumnFromAst (*ast, settings );
185199 }
186200
187201 return nullptr ;
0 commit comments