Reproduction example:

```(sql)
SET join_use_nulls = 0;

create or replace view
  some_test_view
as
select *
from
  (
    select
      arrayJoin([1, 2]) as a,
      arrayJoin([11, 12]) as b
  ) as t1
  full join
  (
    select
      arrayJoin([2, 3]) as a,
      arrayJoin([22, 23]) as c
  ) as t2
  using a
order by a
```

In `describe table some_test_view` the resulting columns are non-nullable, as expected.

However, changing the setting and selecting from the view:

```(sql)
SET join_use_nulls = 1;
select * from some_test_view
```

Results in an error: `Code: 349, e.displayText() = DB::Exception: Cannot convert NULL value to non-Nullable type: while converting source column c to destination column c: while executing 'FUNCTION CAST(c :: 2, UInt8 :: 5) -> CAST(c, UInt8) UInt8 : 4' (version 21.2.3.15 (official build))`

There's no clearly-good solution to this problem;
one of the suggestions is to add the setting to the view schema, e.g.:

```(sql)
SET join_use_nulls = 0;

create or replace view
  some_test_view
as
select *
from
  (
    select
      arrayJoin([1, 2]) as a,
      arrayJoin([11, 12]) as b
  ) as t1
  full join
  (
    select
      arrayJoin([2, 3]) as a,
      arrayJoin([22, 23]) as c
  ) as t2
  using a
order by a
settings join_use_nulls = 0  -- prevent the join behavior inside the view from changing
```

which could be done implicitly by CH to improve the user experience.

Side note: `… settings join_use_nulls = …` seems to be poorly documented, only appearing in a few examples without any explanation.

{
    ASTTableExpression * table_expression = getFirstTableExpression(select_query);
    if (!table_expression->subquery)
        throw Exception("Logical error: incorrect table expression", ErrorCodes::LOGICAL_ERROR);
    ASTPtr subquery = table_expression->subquery;
    table_expression->subquery = {};
    table_expression->database_and_table_name = view_name;
    for (auto & child : table_expression->children)
        if (child.get() == subquery.get())
            child = view_name;
    return subquery->children[0];
}
void registerStorageView(StorageFactory & factory)
{
    factory.registerStorage("View", [](const StorageFactory::Arguments & args)
    {
        if (args.query.storage)
            throw Exception("Specifying ENGINE is not allowed for a View", ErrorCodes::INCORRECT_QUERY);
        return StorageView::create(args.table_id, args.query, args.columns, args.comment);
    });
}
}