RosettaCodeData/Task/Variable-size-Set/DuckDB/variable-size-set.duckdb

35 lines
769 B
Plaintext

# DECIMAL(p, s):
CREATE OR REPLACE FUNCTION d2w(p) AS (
if( p <= 4, 16,
if( p <= 9, 32,
if( p <= 18, 64,
128) ))
);
CREATE OR REPLACE FUNCTION nominal_size_in_bits(val) AS (
CASE typeof(val)
WHEN 'TINYINT' THEN 8
WHEN 'SMALLINT' THEN 16
WHEN 'INTEGER' THEN 32
WHEN 'BIGINT' THEN 64
WHEN 'HUGEINT' THEN 128
WHEN 'UTINYINT' THEN 8
WHEN 'USMALLINT' THEN 16
WHEN 'UINTEGER' THEN 32
WHEN 'UBIGINT' THEN 64
WHEN 'UHUGEINT' THEN 128
WHEN 'BOOLEAN' THEN 8
WHEN 'UUID' THEN 128
WHEN 'FLOAT' THEN 32
WHEN 'DOUBLE' THEN 64
ELSE CASE
WHEN typeof(val) LIKE 'DECIMAL%'
THEN d2w( regexp_extract(typeof(val), '[0-9]+')::INTEGER )
ELSE NULL
END
END
);