void FunctionHasColumnInTable::executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t input_rows_count) { auto get_string_from_block = [&](size_t column_pos) -> String { ColumnPtr column = block.getByPosition(column_pos).column; const ColumnConst * const_column = checkAndGetColumnConst<ColumnString>(column.get()); return const_column->getValue<String>(); }; size_t arg = 0; String host_name; String user_name; String password; if (arguments.size() > 3) host_name = get_string_from_block(arguments[arg++]); if (arguments.size() > 4) user_name = get_string_from_block(arguments[arg++]); if (arguments.size() > 5) password = get_string_from_block(arguments[arg++]); String database_name = get_string_from_block(arguments[arg++]); String table_name = get_string_from_block(arguments[arg++]); String column_name = get_string_from_block(arguments[arg++]); bool has_column; if (host_name.empty()) { const StoragePtr & table = global_context.getTable(database_name, table_name); has_column = table->hasColumn(column_name); } else { std::vector<std::vector<String>> host_names = {{ host_name }}; auto cluster = std::make_shared<Cluster>( global_context.getSettings(), host_names, !user_name.empty() ? user_name : "default", password, global_context.getTCPPort(), false); auto remote_columns = getStructureOfRemoteTable(*cluster, database_name, table_name, global_context); has_column = remote_columns.hasPhysical(column_name); } block.getByPosition(result).column = DataTypeUInt8().createColumnConst(input_rows_count, has_column); }
ColumnPtr recursiveRemoveLowCardinality(const ColumnPtr & column) { if (!column) return column; if (const auto * column_array = typeid_cast<const ColumnArray *>(column.get())) return ColumnArray::create(recursiveRemoveLowCardinality(column_array->getDataPtr()), column_array->getOffsetsPtr()); if (const auto * column_const = typeid_cast<const ColumnConst *>(column.get())) return ColumnConst::create(recursiveRemoveLowCardinality(column_const->getDataColumnPtr()), column_const->size()); if (const auto * column_tuple = typeid_cast<const ColumnTuple *>(column.get())) { Columns columns = column_tuple->getColumns(); for (auto & element : columns) element = recursiveRemoveLowCardinality(element); return ColumnTuple::create(columns); } if (const auto * column_low_cardinality = typeid_cast<const ColumnLowCardinality *>(column.get())) return column_low_cardinality->convertToFullColumn(); return column; }
void FunctionHasColumnInTable::executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) { auto get_string_from_block = [&](size_t column_pos) -> const String & { ColumnPtr column = block.safeGetByPosition(column_pos).column; const ColumnConstString * const_column = typeid_cast<const ColumnConstString *>(column.get()); return const_column->getData(); }; const String & database_name = get_string_from_block(arguments[0]); const String & table_name = get_string_from_block(arguments[1]); const String & column_name = get_string_from_block(arguments[2]); const StoragePtr & table = global_context.getTable(database_name, table_name); const bool has_column = table->hasColumn(column_name); block.safeGetByPosition(result).column = std::make_shared<ColumnConstUInt8>( block.rows(), has_column); }
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t) override { const ColumnPtr column = block.getByPosition(arguments[0]).column; if (const ColumnString * col = checkAndGetColumn<ColumnString>(column.get())) { auto col_res = ColumnString::create(); ReverseImpl::vector(col->getChars(), col->getOffsets(), col_res->getChars(), col_res->getOffsets()); block.getByPosition(result).column = std::move(col_res); } else if (const ColumnFixedString * col = checkAndGetColumn<ColumnFixedString>(column.get())) { auto col_res = ColumnFixedString::create(col->getN()); ReverseImpl::vector_fixed(col->getChars(), col->getN(), col_res->getChars()); block.getByPosition(result).column = std::move(col_res); } else throw Exception( "Illegal column " + block.getByPosition(arguments[0]).column->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_COLUMN); }
int main(int, char **) { ColumnPtr x = ConcreteColumn::create(1); ColumnPtr y = x;//x->test(); std::cerr << "values: " << x->get() << ", " << y->get() << "\n"; std::cerr << "refcounts: " << x->use_count() << ", " << y->use_count() << "\n"; std::cerr << "addresses: " << x.get() << ", " << y.get() << "\n"; { MutableColumnPtr mut = y->mutate(); mut->set(2); std::cerr << "refcounts: " << x->use_count() << ", " << y->use_count() << ", " << mut->use_count() << "\n"; std::cerr << "addresses: " << x.get() << ", " << y.get() << ", " << mut.get() << "\n"; y = std::move(mut); } std::cerr << "values: " << x->get() << ", " << y->get() << "\n"; std::cerr << "refcounts: " << x->use_count() << ", " << y->use_count() << "\n"; std::cerr << "addresses: " << x.get() << ", " << y.get() << "\n"; x = ConcreteColumn::create(0); std::cerr << "values: " << x->get() << ", " << y->get() << "\n"; std::cerr << "refcounts: " << x->use_count() << ", " << y->use_count() << "\n"; std::cerr << "addresses: " << x.get() << ", " << y.get() << "\n"; { MutableColumnPtr mut = y->mutate(); mut->set(3); std::cerr << "refcounts: " << x->use_count() << ", " << y->use_count() << ", " << mut->use_count() << "\n"; std::cerr << "addresses: " << x.get() << ", " << y.get() << ", " << mut.get() << "\n"; y = std::move(mut); } std::cerr << "values: " << x->get() << ", " << y->get() << "\n"; std::cerr << "refcounts: " << x->use_count() << ", " << y->use_count() << "\n"; return 0; }
ColumnPtr recursiveLowCardinalityConversion(const ColumnPtr & column, const DataTypePtr & from_type, const DataTypePtr & to_type) { if (!column) return column; if (from_type->equals(*to_type)) return column; if (const auto * column_const = typeid_cast<const ColumnConst *>(column.get())) return ColumnConst::create(recursiveLowCardinalityConversion(column_const->getDataColumnPtr(), from_type, to_type), column_const->size()); if (const auto * low_cardinality_type = typeid_cast<const DataTypeLowCardinality *>(from_type.get())) { if (to_type->equals(*low_cardinality_type->getDictionaryType())) return column->convertToFullColumnIfLowCardinality(); } if (const auto * low_cardinality_type = typeid_cast<const DataTypeLowCardinality *>(to_type.get())) { if (from_type->equals(*low_cardinality_type->getDictionaryType())) { auto col = low_cardinality_type->createColumn(); static_cast<ColumnLowCardinality &>(*col).insertRangeFromFullColumn(*column, 0, column->size()); return std::move(col); } } if (const auto * from_array_type = typeid_cast<const DataTypeArray *>(from_type.get())) { if (const auto * to_array_type = typeid_cast<const DataTypeArray *>(to_type.get())) { const auto * column_array = typeid_cast<const ColumnArray *>(column.get()); if (!column_array) throw Exception("Unexpected column " + column->getName() + " for type " + from_type->getName(), ErrorCodes::ILLEGAL_COLUMN); auto & nested_from = from_array_type->getNestedType(); auto & nested_to = to_array_type->getNestedType(); return ColumnArray::create( recursiveLowCardinalityConversion(column_array->getDataPtr(), nested_from, nested_to), column_array->getOffsetsPtr()); } } if (const auto * from_tuple_type = typeid_cast<const DataTypeTuple *>(from_type.get())) { if (const auto * to_tuple_type = typeid_cast<const DataTypeTuple *>(to_type.get())) { const auto * column_tuple = typeid_cast<const ColumnTuple *>(column.get()); if (!column_tuple) throw Exception("Unexpected column " + column->getName() + " for type " + from_type->getName(), ErrorCodes::ILLEGAL_COLUMN); Columns columns = column_tuple->getColumns(); auto & from_elements = from_tuple_type->getElements(); auto & to_elements = to_tuple_type->getElements(); for (size_t i = 0; i < columns.size(); ++i) { auto & element = columns[i]; element = recursiveLowCardinalityConversion(element, from_elements.at(i), to_elements.at(i)); } return ColumnTuple::create(columns); } } throw Exception("Cannot convert: " + from_type->getName() + " to " + to_type->getName(), ErrorCodes::TYPE_MISMATCH); }