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); }
void FunctionIsNull::executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) { const ColumnWithTypeAndName & elem = block.getByPosition(arguments[0]); if (elem.column->isColumnNullable()) { /// Merely return the embedded null map. block.getByPosition(result).column = static_cast<const ColumnNullable &>(*elem.column).getNullMapColumnPtr(); } else { /// Since no element is nullable, return a zero-constant column representing /// a zero-filled null map. block.getByPosition(result).column = DataTypeUInt8().createColumnConst(elem.column->size(), UInt64(0)); } }
void DataTypeNullable::deserializeBinaryBulkWithMultipleStreams( IColumn & column, size_t limit, DeserializeBinaryBulkSettings & settings, DeserializeBinaryBulkStatePtr & state) const { ColumnNullable & col = static_cast<ColumnNullable &>(column); settings.path.push_back(Substream::NullMap); if (auto stream = settings.getter(settings.path)) DataTypeUInt8().deserializeBinaryBulk(col.getNullMapColumn(), *stream, limit, 0); settings.path.back() = Substream::NullableElements; nested_data_type->deserializeBinaryBulkWithMultipleStreams(col.getNestedColumn(), limit, settings, state); settings.path.pop_back(); }
void DataTypeNullable::serializeBinaryBulkWithMultipleStreams( const IColumn & column, size_t offset, size_t limit, SerializeBinaryBulkSettings & settings, SerializeBinaryBulkStatePtr & state) const { const ColumnNullable & col = static_cast<const ColumnNullable &>(column); col.checkConsistency(); /// First serialize null map. settings.path.push_back(Substream::NullMap); if (auto stream = settings.getter(settings.path)) DataTypeUInt8().serializeBinaryBulk(col.getNullMapColumn(), *stream, offset, limit); /// Then serialize contents of arrays. settings.path.back() = Substream::NullableElements; nested_data_type->serializeBinaryBulkWithMultipleStreams(col.getNestedColumn(), offset, limit, settings, state); settings.path.pop_back(); }