text: drop table if exists t;
  drop table if exists s;
  
  create table t(a Int64, b Int64, c String) engine = Memory;
  create table s(a Int64, b Int64, c String) engine = Memory;
  
  insert into t values(1,1,'a');
  insert into s values(2,2,'a');
  
  select t.*, s.a, s.b, s.c from t left join s on (s.a = t.a and s.b = t.b);
  select t.*, s.a, s.b, s.c from t right join s on (s.a = t.a and s.b = t.b);
  select t.*, s.a, s.b, s.c from t left join s on (s.a = t.a and s.b = t.b) SETTINGS join_use_nulls = 1;
  select t.*, s.a, s.b, s.c from t right join s on (s.a = t.a and s.b = t.b) SETTINGS join_use_nulls = 1;
  
  drop table t;
  drop table s;
  
  create table t(a Int64, b Int64, c Nullable(String)) engine = Memory;
  create table s(a Int64, b Int64, c Nullable(String)) engine = Memory;
  
  insert into t values(1,1,'a');
  insert into s values(2,2,'a');
  
  select * from t left join s on (s.a = t.a and s.b = t.b);
  select * from t right join s on (s.a = t.a and s.b = t.b);
  select t.*, s.* from t left join s on (s.a = t.a and s.b = t.b) SETTINGS join_use_nulls = 1;
  select t.*, s.* from t right join s on (s.a = t.a and s.b = t.b) SETTINGS join_use_nulls = 1;
  
  drop table t;
  drop table s;
  
  create table t(a Int64, b Nullable(Int64), c String) engine = Memory;
  create table s(a Int64, b Nullable(Int64), c String) engine = Memory;
  
  insert into t values(1,1,'a');
  insert into s values(2,2,'a');
  
  select t.*, s.* from t left join s on (s.a = t.a and s.b = t.b);
  select t.*, s.* from t right join s on (s.a = t.a and s.b = t.b);
  select * from t left join s on (s.a = t.a and s.b = t.b) SETTINGS join_use_nulls = 1;
  select * from t right join s on (s.a = t.a and s.b = t.b) SETTINGS join_use_nulls = 1;
  
  drop table t;
  drop table s;
  
  create table t(a Int64, b Nullable(Int64), c Nullable(String)) engine = Memory;
  create table s(a Int64, b Nullable(Int64), c Nullable(String)) engine = Memory;
  
  insert into t values(1,1,'a');
  insert into s values(2,2,'a');
  
  select t.*, s.a, s.b, s.c from t left join s on (s.a = t.a and s.b = t.b);
  select t.*, s.a, s.b, s.c from t right join s on (s.a = t.a and s.b = t.b);
  select * from t left join s on (s.a = t.a and s.b = t.b) SETTINGS join_use_nulls = 1;
  select * from t right join s on (s.a = t.a and s.b = t.b) SETTINGS join_use_nulls = 1;
  
  drop table t;
  drop table s;
  
  create table t(a Nullable(Int64), b Nullable(Int64), c Nullable(String)) engine = Memory;
  create table s(a Nullable(Int64), b Nullable(Int64), c Nullable(String)) engine = Memory;
  
  insert into t values(1,1,'a');
  insert into s values(2,2,'a');
  
  select * from t left join s on (s.a = t.a and s.b = t.b);
  select * from t right join s on (s.a = t.a and s.b = t.b);
  select t.*, s.a, s.b, s.c from t left join s on (s.a = t.a and s.b = t.b) SETTINGS join_use_nulls = 1;
  select t.*, s.a, s.b, s.c from t right join s on (s.a = t.a and s.b = t.b) SETTINGS join_use_nulls = 1;
  
  drop table t;
  drop table s;
  