Merge pull request #19617 from ClickHouse/fix-lc-neighbour

Fix function neighbor for LowCardinality argument.
This commit is contained in:
alexey-milovidov 2021-01-28 03:06:56 +03:00 committed by GitHub
commit fa48545b87
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 62 additions and 0 deletions

View File

@ -50,6 +50,10 @@ public:
bool useDefaultImplementationForConstants() const override { return false; }
/// We do not use default implementation for LowCardinality because this is not a pure function.
/// If used, optimization for LC may execute function only for dictionary, which gives wrong result.
bool useDefaultImplementationForLowCardinalityColumns() const override { return false; }
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
{
size_t number_of_arguments = arguments.size();

View File

@ -0,0 +1,15 @@
0
0
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
0 0 0
1 1 1
2 2 2
┌─rowNr─┬─val_string─┬─str_m1───┬─str_p1───┬─val_low──┬─low_m1───┬─low_p1───┐
│ 1 │ String 1 │ │ String 1 │ String 1 │ │ String 1 │
│ 2 │ String 1 │ String 1 │ String 2 │ String 1 │ String 1 │ String 2 │
│ 3 │ String 2 │ String 1 │ │ String 2 │ String 1 │ │
└───────┴────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘

View File

@ -0,0 +1,43 @@
SELECT
neighbor(n, -2) AS int,
neighbor(s, -2) AS str,
neighbor(lcs, -2) AS lowCstr
FROM
(
SELECT
number % 5 AS n,
toString(n) AS s,
CAST(s, 'LowCardinality(String)') AS lcs
FROM numbers(10)
);
drop table if exists neighbor_test;
CREATE TABLE neighbor_test
(
`rowNr` UInt8,
`val_string` String,
`val_low` LowCardinality(String)
)
ENGINE = MergeTree
PARTITION BY tuple()
ORDER BY rowNr;
INSERT INTO neighbor_test VALUES (1, 'String 1', 'String 1'), (2, 'String 1', 'String 1'), (3, 'String 2', 'String 2');
SELECT
rowNr,
val_string,
neighbor(val_string, -1) AS str_m1,
neighbor(val_string, 1) AS str_p1,
val_low,
neighbor(val_low, -1) AS low_m1,
neighbor(val_low, 1) AS low_p1
FROM
(
SELECT *
FROM neighbor_test
ORDER BY val_string ASC
) format PrettyCompact;
drop table if exists neighbor_test;