join_use_nulls: development; added test [#CLICKHOUSE-4].

This commit is contained in:
Alexey Milovidov 2017-04-07 00:09:39 +03:00
parent 928b8d7653
commit ab215c0fcd
3 changed files with 172 additions and 3 deletions

View File

@ -252,8 +252,9 @@ static void convertColumnToNullable(ColumnWithTypeAndName & column)
column.type = std::make_shared<DataTypeNullable>(column.type); column.type = std::make_shared<DataTypeNullable>(column.type);
column.column = std::make_shared<ColumnNullable>(column.column, if (column.column)
std::make_shared<ColumnConstUInt8>(column.column->size(), 0)->convertToFullColumn()); column.column = std::make_shared<ColumnNullable>(column.column,
std::make_shared<ColumnConstUInt8>(column.column->size(), 0)->convertToFullColumn());
} }
@ -301,7 +302,7 @@ void Join::setSampleBlock(const Block & block)
/// In case of LEFT and FULL joins, if use_nulls, convert joined columns to Nullable. /// In case of LEFT and FULL joins, if use_nulls, convert joined columns to Nullable.
if (use_nulls && (kind == ASTTableJoin::Kind::Left || kind == ASTTableJoin::Kind::Full)) if (use_nulls && (kind == ASTTableJoin::Kind::Left || kind == ASTTableJoin::Kind::Full))
for (size_t i = 0; i < num_columns_to_add; ++i) for (size_t i = 0; i < num_columns_to_add; ++i)
convertColumnToNullable(sample_block_with_keys.getByPosition(i)); convertColumnToNullable(sample_block_with_columns_to_add.getByPosition(i));
} }
@ -983,8 +984,12 @@ public:
/// If use_nulls, convert left columns to Nullable. /// If use_nulls, convert left columns to Nullable.
if (parent.use_nulls) if (parent.use_nulls)
{
for (size_t i = 0; i < num_columns_left; ++i) for (size_t i = 0; i < num_columns_left; ++i)
{
convertColumnToNullable(result_sample_block.getByPosition(column_numbers_left[i])); convertColumnToNullable(result_sample_block.getByPosition(column_numbers_left[i]));
}
}
columns_left.resize(num_columns_left); columns_left.resize(num_columns_left);
columns_keys_and_right.resize(num_keys + num_columns_right); columns_keys_and_right.resize(num_keys + num_columns_right);

View File

@ -0,0 +1,80 @@
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
0 0
1 1
2 2
3 3
4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
14 14
12 12
11 11
10 10
13 13
0 0
1 1
2 2
3 3
4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
14 14
12 12
11 11
10 10
13 13
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
0 0 \N
1 1 \N
2 2 \N
3 3 \N
4 4 \N
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
14 \N 14
12 \N 12
11 \N 11
10 \N 10
13 \N 13
0 0 \N
1 1 \N
2 2 \N
3 3 \N
4 4 \N
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
14 \N 14
12 \N 12
11 \N 11
10 \N 10
13 \N 13

View File

@ -0,0 +1,84 @@
SET join_use_nulls = 0;
SELECT k, a, b
FROM
(
SELECT number AS k, toString(number) AS a FROM system.numbers LIMIT 10
)
ANY INNER JOIN
(
SELECT number AS k, toString(number) AS b FROM system.numbers LIMIT 5, 10
) USING (k);
SELECT k, a, b
FROM
(
SELECT number AS k, toString(number) AS a FROM system.numbers LIMIT 10
)
ANY LEFT JOIN
(
SELECT number AS k, toString(number) AS b FROM system.numbers LIMIT 5, 10
) USING (k);
SELECT k, a, b
FROM
(
SELECT number AS k, toString(number) AS a FROM system.numbers LIMIT 10
)
ANY RIGHT JOIN
(
SELECT number AS k, toString(number) AS b FROM system.numbers LIMIT 5, 10
) USING (k);
SELECT k, a, b
FROM
(
SELECT number AS k, toString(number) AS a FROM system.numbers LIMIT 10
)
ANY FULL JOIN
(
SELECT number AS k, toString(number) AS b FROM system.numbers LIMIT 5, 10
) USING (k);
SET join_use_nulls = 1;
SELECT k, a, b
FROM
(
SELECT number AS k, toString(number) AS a FROM system.numbers LIMIT 10
)
ANY INNER JOIN
(
SELECT number AS k, toString(number) AS b FROM system.numbers LIMIT 5, 10
) USING (k);
SELECT k, a, b
FROM
(
SELECT number AS k, toString(number) AS a FROM system.numbers LIMIT 10
)
ANY LEFT JOIN
(
SELECT number AS k, toString(number) AS b FROM system.numbers LIMIT 5, 10
) USING (k);
SELECT k, a, b
FROM
(
SELECT number AS k, toString(number) AS a FROM system.numbers LIMIT 10
)
ANY RIGHT JOIN
(
SELECT number AS k, toString(number) AS b FROM system.numbers LIMIT 5, 10
) USING (k);
SELECT k, a, b
FROM
(
SELECT number AS k, toString(number) AS a FROM system.numbers LIMIT 10
)
ANY FULL JOIN
(
SELECT number AS k, toString(number) AS b FROM system.numbers LIMIT 5, 10
) USING (k);