From 5db8188cf3b20c9dbbaece696dd7c28aa0b6e4a1 Mon Sep 17 00:00:00 2001 From: Tishj Date: Wed, 29 May 2024 12:38:23 +0200 Subject: [PATCH] make the integer OID mapping more generic so it can be used for other integer types --- expected/array_type_support.out | 1 - sql/array_type_support.sql | 2 +- src/quack_types.cpp | 52 +++++++++++++++++++++++++++------ 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/expected/array_type_support.out b/expected/array_type_support.out index 9f21d3b5..911f5d4e 100644 --- a/expected/array_type_support.out +++ b/expected/array_type_support.out @@ -43,7 +43,6 @@ INSERT INTO char_array_1d SELECT CAST(a as CHAR[]) FROM (VALUES ('{}') ) t(a); SELECT * FROM char_array_1d; -ERROR: (DuckDB/ConvertPostgresToDuckColumnType) Unsupported quack type: 1014 DROP TABLE int_array_1d; DROP TABLE bool_array_1d; DROP TABLE char_array_1d; diff --git a/sql/array_type_support.sql b/sql/array_type_support.sql index 955ad15e..34e6715c 100644 --- a/sql/array_type_support.sql +++ b/sql/array_type_support.sql @@ -24,7 +24,7 @@ SELECT * FROM bool_array_1d; -- CHAR (single dimension) CREATE TABLE char_array_1d(a CHAR[]); INSERT INTO char_array_1d SELECT CAST(a as CHAR[]) FROM (VALUES - ('{b, b, c}'), + ('{a, b, c}'), (NULL), ('{t, f, Z, A}'), ('{}') diff --git a/src/quack_types.cpp b/src/quack_types.cpp index 6d2737c9..fcb283ad 100644 --- a/src/quack_types.cpp +++ b/src/quack_types.cpp @@ -27,13 +27,13 @@ namespace quack { struct CharArray { public: static ArrayType *ConstructArray(Datum *datums, bool *nulls, int *count, int *lower_bound) { - return construct_md_array(datums, nulls, 1, count, lower_bound, CHAROID, 1, true, 'c'); + return construct_md_array(datums, nulls, 1, count, lower_bound, CHAROID, 1, true, 'c'); } static duckdb::LogicalTypeId ExpectedType() { - return duckdb::LogicalTypeId::TINYINT; + return duckdb::LogicalTypeId::TINYINT; } static Datum ConvertToPostgres(const duckdb::Value &val) { - return Datum(val.GetValue()); + return Datum(val.GetValue()); } }; @@ -46,20 +46,54 @@ struct BoolArray { return duckdb::LogicalTypeId::BOOLEAN; } static Datum ConvertToPostgres(const duckdb::Value &val) { - return Int32GetDatum(val.GetValue()); + return Datum(val.GetValue()); } }; -struct Int4Array { +template +struct PostgresIntegerOIDMapping { +}; + +template <> +struct PostgresIntegerOIDMapping { + static constexpr int32_t postgres_oid = CHAROID; + using physical_type = int8_t; + static constexpr duckdb::LogicalTypeId duck_type_id = duckdb::LogicalTypeId::TINYINT; +}; + +template <> +struct PostgresIntegerOIDMapping { + static constexpr int32_t postgres_oid = INT2OID; + using physical_type = int16_t; + static constexpr duckdb::LogicalTypeId duck_type_id = duckdb::LogicalTypeId::SMALLINT; +}; + +template <> +struct PostgresIntegerOIDMapping { + static constexpr int32_t postgres_oid = INT4OID; + using physical_type = int32_t; + static constexpr duckdb::LogicalTypeId duck_type_id = duckdb::LogicalTypeId::INTEGER; +}; + +template <> +struct PostgresIntegerOIDMapping { + static constexpr int32_t postgres_oid = INT8OID; + using physical_type = int64_t; + static constexpr duckdb::LogicalTypeId duck_type_id = duckdb::LogicalTypeId::BIGINT; +}; + +template +struct PODArray { + using physical_type = typename MAPPING::physical_type; public: static ArrayType *ConstructArray(Datum *datums, bool *nulls, int *count, int *lower_bound) { - return construct_md_array(datums, nulls, 1, count, lower_bound, INT4OID, sizeof(int32_t), true, 'i'); + return construct_md_array(datums, nulls, 1, count, lower_bound, MAPPING::postgres_oid, sizeof(physical_type), true, 'i'); } static duckdb::LogicalTypeId ExpectedType() { - return duckdb::LogicalTypeId::INTEGER; + return MAPPING::duck_type_id; } static Datum ConvertToPostgres(const duckdb::Value &val) { - return Int32GetDatum(val.GetValue()); + return Int32GetDatum(val.GetValue()); } }; @@ -299,7 +333,7 @@ ConvertDuckToPostgresValue(TupleTableSlot *slot, duckdb::Value &value, idx_t col break; } case INT4ARRAYOID: { - ConvertDuckToPostgresArray(slot, value, col); + ConvertDuckToPostgresArray>>(slot, value, col); break; } default: