enable nullable for Decimal [CLICKHOUSE-3765]

This commit is contained in:
chertus 2018-09-04 21:51:44 +03:00
parent 1ea6bc9691
commit e11f3ea5bc
5 changed files with 106 additions and 10 deletions

View File

@ -77,7 +77,7 @@ public:
const char * getFamilyName() const override { return TypeName<T>::get(); } const char * getFamilyName() const override { return TypeName<T>::get(); }
bool isNumeric() const override { return false; } bool isNumeric() const override { return false; }
bool canBeInsideNullable() const override { return false; } bool canBeInsideNullable() const override { return true; }
bool isFixedAndContiguous() const override { return true; } bool isFixedAndContiguous() const override { return true; }
size_t sizeOfValueIfFixed() const override { return sizeof(T); } size_t sizeOfValueIfFixed() const override { return sizeof(T); }

View File

@ -148,7 +148,7 @@ public:
bool canBeUsedInBooleanContext() const override { return true; } bool canBeUsedInBooleanContext() const override { return true; }
bool isNumber() const override { return true; } bool isNumber() const override { return true; }
bool isInteger() const override { return false; } bool isInteger() const override { return false; }
bool canBeInsideNullable() const override { return false; } bool canBeInsideNullable() const override { return true; }
/// Decimal specific /// Decimal specific

View File

@ -1,14 +1,6 @@
SET allow_experimental_decimal_type = 1; SET allow_experimental_decimal_type = 1;
SET send_logs_level = 'none'; SET send_logs_level = 'none';
CREATE TABLE IF NOT EXISTS test.x (a Nullable(Decimal(9, 2))) ENGINE = Memory; -- { serverError 43 }
CREATE TABLE IF NOT EXISTS test.x (a Nullable(Decimal(18, 2))) ENGINE = Memory; -- { serverError 43 }
CREATE TABLE IF NOT EXISTS test.x (a Nullable(Decimal(38, 2))) ENGINE = Memory; -- { serverError 43 }
SELECT toNullable(toDecimal32(0, 0)); -- { serverError 43 }
SELECT toNullable(toDecimal64(0, 0)); -- { serverError 43 }
SELECT toNullable(toDecimal128(0, 0)); -- { serverError 43 }
SELECT toDecimal32('1.1', 1), toDecimal32('1.1', 2), toDecimal32('1.1', 8); SELECT toDecimal32('1.1', 1), toDecimal32('1.1', 2), toDecimal32('1.1', 8);
SELECT toDecimal32('1.1', 0); -- { serverError 69 } SELECT toDecimal32('1.1', 0); -- { serverError 69 }
SELECT toDecimal32(1.1, 0), toDecimal32(1.1, 1), toDecimal32(1.1, 2), toDecimal32(1.1, 8); SELECT toDecimal32(1.1, 0), toDecimal32(1.1, 1), toDecimal32(1.1, 2), toDecimal32(1.1, 8);

View File

@ -0,0 +1,39 @@
32 32
64 64
128 128
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
\N \N
\N \N
1 1
1 1
\N
\N
1
1
1.10 1.10000 1.10000 1.1000 1.10000000 1.10000000
2.20 2.20000 2.20000 2.2000 \N \N
3.30 3.30000 3.30000 \N 3.30000000 \N
4.40 4.40000 4.40000 \N \N 4.40000000
5.50 5.50000 5.50000 \N \N \N
0 1
0 1
0 1
1 0
1 0
1 0
5
5
5
3
3
3
2
2
2

View File

@ -0,0 +1,65 @@
SET send_logs_level = 'none';
SET allow_experimental_decimal_type = 1;
CREATE DATABASE IF NOT EXISTS test;
DROP TABLE IF EXISTS test.decimal;
CREATE TABLE IF NOT EXISTS test.decimal
(
a DEC(9, 2),
b DEC(18, 5),
c DEC(38, 5),
d Nullable(DEC(9, 4)),
e Nullable(DEC(18, 8)),
f Nullable(DEC(38, 8))
) ENGINE = Memory;
SELECT toNullable(toDecimal32(32, 0)) AS x, assumeNotNull(x);
SELECT toNullable(toDecimal64(64, 0)) AS x, assumeNotNull(x);
SELECT toNullable(toDecimal128(128, 0)) AS x, assumeNotNull(x);
SELECT NULL AS x, assumeNotNull(x); -- { serverError 48 }
SELECT ifNull(toDecimal32(1, 0), NULL), ifNull(toDecimal64(1, 0), NULL), ifNull(toDecimal128(1, 0), NULL);
SELECT ifNull(toNullable(toDecimal32(2, 0)), NULL), ifNull(toNullable(toDecimal64(2, 0)), NULL), ifNull(toNullable(toDecimal128(2, 0)), NULL);
SELECT ifNull(NULL, toDecimal32(3, 0)), ifNull(NULL, toDecimal64(3, 0)), ifNull(NULL, toDecimal128(3, 0));
SELECT ifNull(NULL, toNullable(toDecimal32(4, 0))), ifNull(NULL, toNullable(toDecimal64(4, 0))), ifNull(NULL, toNullable(toDecimal128(4, 0)));
SELECT coalesce(toDecimal32(5, 0), NULL), coalesce(toDecimal64(5, 0), NULL), coalesce(toDecimal128(5, 0), NULL);
SELECT coalesce(NULL, toDecimal32(6, 0)), coalesce(NULL, toDecimal64(6, 0)), coalesce(NULL, toDecimal128(6, 0));
SELECT coalesce(toNullable(toDecimal32(7, 0)), NULL), coalesce(toNullable(toDecimal64(7, 0)), NULL), coalesce(toNullable(toDecimal128(7, 0)), NULL);
SELECT coalesce(NULL, toNullable(toDecimal32(8, 0))), coalesce(NULL, toNullable(toDecimal64(8, 0))), coalesce(NULL, toNullable(toDecimal128(8, 0)));
SELECT nullIf(toNullable(toDecimal32(1, 0)), toDecimal32(1, 0)), nullIf(toNullable(toDecimal64(1, 0)), toDecimal64(1, 0));
SELECT nullIf(toDecimal32(1, 0), toNullable(toDecimal32(1, 0))), nullIf(toDecimal64(1, 0), toNullable(toDecimal64(1, 0)));
SELECT nullIf(toNullable(toDecimal32(1, 0)), toDecimal32(2, 0)), nullIf(toNullable(toDecimal64(1, 0)), toDecimal64(2, 0));
SELECT nullIf(toDecimal32(1, 0), toNullable(toDecimal32(2, 0))), nullIf(toDecimal64(1, 0), toNullable(toDecimal64(2, 0)));
SELECT nullIf(toNullable(toDecimal128(1, 0)), toDecimal128(1, 0));
SELECT nullIf(toDecimal128(1, 0), toNullable(toDecimal128(1, 0)));
SELECT nullIf(toNullable(toDecimal128(1, 0)), toDecimal128(2, 0));
SELECT nullIf(toDecimal128(1, 0), toNullable(toDecimal128(2, 0)));
INSERT INTO test.decimal (a, b, c, d, e, f) VALUES (1.1, 1.1, 1.1, 1.1, 1.1, 1.1);
INSERT INTO test.decimal (a, b, c, d) VALUES (2.2, 2.2, 2.2, 2.2);
INSERT INTO test.decimal (a, b, c, e) VALUES (3.3, 3.3, 3.3, 3.3);
INSERT INTO test.decimal (a, b, c, f) VALUES (4.4, 4.4, 4.4, 4.4);
INSERT INTO test.decimal (a, b, c) VALUES (5.5, 5.5, 5.5);
SELECT * FROM test.decimal ORDER BY d, e, f;
SELECT isNull(a), isNotNull(a) FROM test.decimal WHERE a = toDecimal32(5.5, 1);
SELECT isNull(b), isNotNull(b) FROM test.decimal WHERE a = toDecimal32(5.5, 1);
SELECT isNull(c), isNotNull(c) FROM test.decimal WHERE a = toDecimal32(5.5, 1);
SELECT isNull(d), isNotNull(d) FROM test.decimal WHERE a = toDecimal32(5.5, 1);
SELECT isNull(e), isNotNull(e) FROM test.decimal WHERE a = toDecimal32(5.5, 1);
SELECT isNull(f), isNotNull(f) FROM test.decimal WHERE a = toDecimal32(5.5, 1);
SELECT count() FROM test.decimal WHERE a IS NOT NULL;
SELECT count() FROM test.decimal WHERE b IS NOT NULL;
SELECT count() FROM test.decimal WHERE c IS NOT NULL;
SELECT count() FROM test.decimal WHERE d IS NULL;
SELECT count() FROM test.decimal WHERE e IS NULL;
SELECT count() FROM test.decimal WHERE f IS NULL;
SELECT count() FROM test.decimal WHERE d IS NULL AND e IS NULL;
SELECT count() FROM test.decimal WHERE d IS NULL AND f IS NULL;
SELECT count() FROM test.decimal WHERE e IS NULL AND f IS NULL;
DROP TABLE IF EXISTS test.decimal;