diff --git a/src/flex-table-column.cpp b/src/flex-table-column.cpp index 90911eaf6..b1be115e4 100644 --- a/src/flex-table-column.cpp +++ b/src/flex-table-column.cpp @@ -45,6 +45,7 @@ std::vector const COLUMN_TYPES = { {"int8", table_column_type::int8}, {"bigint", table_column_type::int8}, {"real", table_column_type::real}, + {"double", table_column_type::double_precision}, {"timestamp", table_column_type::timestamp}, {"timestamptz", table_column_type::timestamptz}, {"hstore", table_column_type::hstore}, @@ -146,6 +147,8 @@ std::string flex_table_column_t::sql_type_name() const return "int8"; case table_column_type::real: return "real"; + case table_column_type::double_precision: + return "double precision"; case table_column_type::timestamp: return "timestamp"; case table_column_type::timestamptz: diff --git a/src/flex-table-column.hpp b/src/flex-table-column.hpp index cb9d367ad..861ec7218 100644 --- a/src/flex-table-column.hpp +++ b/src/flex-table-column.hpp @@ -32,6 +32,7 @@ enum class table_column_type : uint8_t int8, real, + double_precision, timestamp, timestamptz, diff --git a/src/flex-write.cpp b/src/flex-write.cpp index 3e0883859..8de4f47fe 100644 --- a/src/flex-write.cpp +++ b/src/flex-write.cpp @@ -349,14 +349,14 @@ void flex_write_column(lua_State *lua_state, geometry_cache_t *geom_cache, throw fmt_error("Invalid type '{}' for int8 column.", lua_typename(lua_state, ltype)); } - } else if (column.type() == table_column_type::real) { + } else if (column.type() == table_column_type::real || column.type() == table_column_type::double_precision) { if (ltype == LUA_TNUMBER) { copy_mgr->add_column(lua_tonumber(lua_state, -1)); } else if (ltype == LUA_TSTRING) { write_double(copy_mgr, column, lua_tolstring(lua_state, -1, nullptr)); } else { - throw fmt_error("Invalid type '{}' for real column.", + throw fmt_error("Invalid type '{}' for real/double precision column.", lua_typename(lua_state, ltype)); } } else if (column.type() == table_column_type::timestamp) { diff --git a/tests/data/test_output_flex_types.lua b/tests/data/test_output_flex_types.lua index e6817429d..53a092258 100644 --- a/tests/data/test_output_flex_types.lua +++ b/tests/data/test_output_flex_types.lua @@ -6,6 +6,7 @@ local test_table = osm2pgsql.define_node_table("nodes", { { column = 'tint4', type = 'int4' }, { column = 'tint8', type = 'int8' }, { column = 'treal', type = 'real' }, + { column = 'tdubl', type = 'double' }, { column = 'thstr', type = 'hstore' }, { column = 'tjson', type = 'jsonb' }, { column = 'tdirn', type = 'direction' }, @@ -47,6 +48,7 @@ function osm2pgsql.process_node(object) tint4 = n, tint8 = n, treal = n, + tdubl = n, tjson = n, tdirn = n, tsqlt = n, @@ -100,6 +102,7 @@ function osm2pgsql.process_node(object) tint4 = string.format('%d', n), tint8 = string.format('%d', n), treal = string.format('%d', n), + tdubl = string.format('%d', n), tsqlt = string.format('%d', n), } end @@ -109,6 +112,7 @@ function osm2pgsql.process_node(object) tint4 = ' 42', tint8 = ' 42', treal = ' 42', + tdubl = ' 42', tsqlt = ' 42', } return @@ -122,6 +126,7 @@ function osm2pgsql.process_node(object) tint4 = n, tint8 = n, treal = n, + tdubl = n, } end return diff --git a/tests/test-output-flex-types.cpp b/tests/test-output-flex-types.cpp index d3e351611..4cb14ec48 100644 --- a/tests/test-output-flex-types.cpp +++ b/tests/test-output-flex-types.cpp @@ -91,19 +91,19 @@ TEST_CASE("type number") CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '-2147483649' AND ttext = tsqlt AND tbool = true AND tint2 IS NULL AND tint4 IS NULL AND tint8 = -2147483649 AND tjson = '-2147483649'::jsonb AND tdirn = -1")); CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '-2147483648' AND ttext = tsqlt AND tbool = true AND tint2 IS NULL AND tint4 = -2147483648 AND tint8 = -2147483648 AND tjson = '-2147483648'::jsonb AND tdirn = -1")); CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '-2147483647' AND ttext = tsqlt AND tbool = true AND tint2 IS NULL AND tint4 = -2147483647 AND tint8 = -2147483647 AND tjson = '-2147483647'::jsonb AND tdirn = -1")); - CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '-32769' AND ttext = tsqlt AND tbool = true AND tint2 IS NULL AND tint4 = -32769 AND tint8 = -32769 AND treal = -32769 AND tjson = '-32769'::jsonb AND tdirn = -1")); - CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '-32768' AND ttext = tsqlt AND tbool = true AND tint2 = -32768 AND tint4 = -32768 AND tint8 = -32768 AND treal = -32768 AND tjson = '-32768'::jsonb AND tdirn = -1")); - CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '-32767' AND ttext = tsqlt AND tbool = true AND tint2 = -32767 AND tint4 = -32767 AND tint8 = -32767 AND treal = -32767 AND tjson = '-32767'::jsonb AND tdirn = -1")); - CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '-2' AND ttext = tsqlt AND tbool = true AND tint2 = -2 AND tint4 = -2 AND tint8 = -2 AND treal = -2 AND tjson = '-2'::jsonb AND tdirn = -1")); - CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '-1' AND ttext = tsqlt AND tbool = true AND tint2 = -1 AND tint4 = -1 AND tint8 = -1 AND treal = -1 AND tjson = '-1'::jsonb AND tdirn = -1")); - CHECK(1 == conn.get_count("nodes", " tsqlt = '-0.5' AND ttext = tsqlt AND tbool = true AND tint2 = 0 AND tint4 = 0 AND tint8 = 0 AND treal = -0.5 AND tjson = '-0.5'::jsonb AND tdirn = -1")); - CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '0' AND ttext = tsqlt AND tbool = false AND tint2 = 0 AND tint4 = 0 AND tint8 = 0 AND treal = 0 AND tjson = '0'::jsonb AND tdirn = 0")); - CHECK(1 == conn.get_count("nodes", " tsqlt = '0.5' AND ttext = tsqlt AND tbool = true AND tint2 = 0 AND tint4 = 0 AND tint8 = 0 AND treal = 0.5 AND tjson = '0.5'::jsonb AND tdirn = 1")); - CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '1' AND ttext = tsqlt AND tbool = true AND tint2 = 1 AND tint4 = 1 AND tint8 = 1 AND treal = 1 AND tjson = '1'::jsonb AND tdirn = 1")); - CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '2' AND ttext = tsqlt AND tbool = true AND tint2 = 2 AND tint4 = 2 AND tint8 = 2 AND treal = 2 AND tjson = '2'::jsonb AND tdirn = 1")); - CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '32767' AND ttext = tsqlt AND tbool = true AND tint2 = 32767 AND tint4 = 32767 AND tint8 = 32767 AND treal = 32767 AND tjson = '32767'::jsonb AND tdirn = 1")); - CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '32768' AND ttext = tsqlt AND tbool = true AND tint2 IS NULL AND tint4 = 32768 AND tint8 = 32768 AND treal = 32768 AND tjson = '32768'::jsonb AND tdirn = 1")); - CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '32769' AND ttext = tsqlt AND tbool = true AND tint2 IS NULL AND tint4 = 32769 AND tint8 = 32769 AND treal = 32769 AND tjson = '32769'::jsonb AND tdirn = 1")); + CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '-32769' AND ttext = tsqlt AND tbool = true AND tint2 IS NULL AND tint4 = -32769 AND tint8 = -32769 AND treal = -32769 AND tdubl = -32769 AND tdubl = -32769 AND tdubl = -32769 AND tjson = '-32769'::jsonb AND tdirn = -1")); + CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '-32768' AND ttext = tsqlt AND tbool = true AND tint2 = -32768 AND tint4 = -32768 AND tint8 = -32768 AND treal = -32768 AND tdubl = -32768 AND tdubl = -32768 AND tjson = '-32768'::jsonb AND tdirn = -1")); + CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '-32767' AND ttext = tsqlt AND tbool = true AND tint2 = -32767 AND tint4 = -32767 AND tint8 = -32767 AND treal = -32767 AND tdubl = -32767 AND tdubl = -32767 AND tjson = '-32767'::jsonb AND tdirn = -1")); + CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '-2' AND ttext = tsqlt AND tbool = true AND tint2 = -2 AND tint4 = -2 AND tint8 = -2 AND treal = -2 AND tdubl = -2 AND tjson = '-2'::jsonb AND tdirn = -1")); + CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '-1' AND ttext = tsqlt AND tbool = true AND tint2 = -1 AND tint4 = -1 AND tint8 = -1 AND treal = -1 AND tdubl = -1 AND tjson = '-1'::jsonb AND tdirn = -1")); + CHECK(1 == conn.get_count("nodes", " tsqlt = '-0.5' AND ttext = tsqlt AND tbool = true AND tint2 = 0 AND tint4 = 0 AND tint8 = 0 AND treal = -0.5 AND tdubl = -0.5 AND tjson = '-0.5'::jsonb AND tdirn = -1")); + CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '0' AND ttext = tsqlt AND tbool = false AND tint2 = 0 AND tint4 = 0 AND tint8 = 0 AND treal = 0 AND tdubl = 0 AND tjson = '0'::jsonb AND tdirn = 0")); + CHECK(1 == conn.get_count("nodes", " tsqlt = '0.5' AND ttext = tsqlt AND tbool = true AND tint2 = 0 AND tint4 = 0 AND tint8 = 0 AND treal = 0.5 AND tdubl = 0.5 AND tjson = '0.5'::jsonb AND tdirn = 1")); + CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '1' AND ttext = tsqlt AND tbool = true AND tint2 = 1 AND tint4 = 1 AND tint8 = 1 AND treal = 1 AND tdubl = 1 AND tjson = '1'::jsonb AND tdirn = 1")); + CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '2' AND ttext = tsqlt AND tbool = true AND tint2 = 2 AND tint4 = 2 AND tint8 = 2 AND treal = 2 AND tdubl = 2 AND tjson = '2'::jsonb AND tdirn = 1")); + CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '32767' AND ttext = tsqlt AND tbool = true AND tint2 = 32767 AND tint4 = 32767 AND tint8 = 32767 AND treal = 32767 AND tdubl = 32767 AND tjson = '32767'::jsonb AND tdirn = 1")); + CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '32768' AND ttext = tsqlt AND tbool = true AND tint2 IS NULL AND tint4 = 32768 AND tint8 = 32768 AND treal = 32768 AND tdubl = 32768 AND tjson = '32768'::jsonb AND tdirn = 1")); + CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '32769' AND ttext = tsqlt AND tbool = true AND tint2 IS NULL AND tint4 = 32769 AND tint8 = 32769 AND treal = 32769 AND tdubl = 32769 AND tjson = '32769'::jsonb AND tdirn = 1")); CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '2147483647' AND ttext = tsqlt AND tbool = true AND tint2 IS NULL AND tint4 = 2147483647 AND tint8 = 2147483647 AND tjson = '2147483647'::jsonb AND tdirn = 1")); CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '2147483648' AND ttext = tsqlt AND tbool = true AND tint2 IS NULL AND tint4 IS NULL AND tint8 = 2147483648 AND tjson = '2147483648'::jsonb AND tdirn = 1")); CHECK(1 == conn.get_count("nodes", "split_part(tsqlt, '.', 1) = '2147483649' AND ttext = tsqlt AND tbool = true AND tint2 IS NULL AND tint4 IS NULL AND tint8 = 2147483649 AND tjson = '2147483649'::jsonb AND tdirn = 1")); @@ -154,21 +154,21 @@ TEST_CASE("type string (with number)") CHECK(1 == conn.get_count("nodes", "tsqlt = '-2147483649' AND ttext = tsqlt AND tint2 IS NULL AND tint4 IS NULL AND tint8 = -2147483649 ")); CHECK(1 == conn.get_count("nodes", "tsqlt = '-2147483648' AND ttext = tsqlt AND tint2 IS NULL AND tint4 = -2147483648 AND tint8 = -2147483648 ")); CHECK(1 == conn.get_count("nodes", "tsqlt = '-2147483647' AND ttext = tsqlt AND tint2 IS NULL AND tint4 = -2147483647 AND tint8 = -2147483647 ")); - CHECK(1 == conn.get_count("nodes", "tsqlt = '-32769' AND ttext = tsqlt AND tint2 IS NULL AND tint4 = -32769 AND tint8 = -32769 AND treal = -32769")); - CHECK(1 == conn.get_count("nodes", "tsqlt = '-32768' AND ttext = tsqlt AND tint2 = -32768 AND tint4 = -32768 AND tint8 = -32768 AND treal = -32768")); - CHECK(1 == conn.get_count("nodes", "tsqlt = '-32767' AND ttext = tsqlt AND tint2 = -32767 AND tint4 = -32767 AND tint8 = -32767 AND treal = -32767")); - CHECK(1 == conn.get_count("nodes", "tsqlt = '-2' AND ttext = tsqlt AND tint2 = -2 AND tint4 = -2 AND tint8 = -2 AND treal = -2 ")); - CHECK(1 == conn.get_count("nodes", "tsqlt = '-1' AND ttext = tsqlt AND tint2 = -1 AND tint4 = -1 AND tint8 = -1 AND treal = -1 ")); - CHECK(1 == conn.get_count("nodes", "tsqlt = '0' AND ttext = tsqlt AND tint2 = 0 AND tint4 = 0 AND tint8 = 0 AND treal = 0 ")); - CHECK(1 == conn.get_count("nodes", "tsqlt = '1' AND ttext = tsqlt AND tint2 = 1 AND tint4 = 1 AND tint8 = 1 AND treal = 1 ")); - CHECK(1 == conn.get_count("nodes", "tsqlt = '2' AND ttext = tsqlt AND tint2 = 2 AND tint4 = 2 AND tint8 = 2 AND treal = 2 ")); - CHECK(1 == conn.get_count("nodes", "tsqlt = '32767' AND ttext = tsqlt AND tint2 = 32767 AND tint4 = 32767 AND tint8 = 32767 AND treal = 32767 ")); - CHECK(1 == conn.get_count("nodes", "tsqlt = '32768' AND ttext = tsqlt AND tint2 IS NULL AND tint4 = 32768 AND tint8 = 32768 AND treal = 32768 ")); - CHECK(1 == conn.get_count("nodes", "tsqlt = '32769' AND ttext = tsqlt AND tint2 IS NULL AND tint4 = 32769 AND tint8 = 32769 AND treal = 32769 ")); + CHECK(1 == conn.get_count("nodes", "tsqlt = '-32769' AND ttext = tsqlt AND tint2 IS NULL AND tint4 = -32769 AND tint8 = -32769 AND treal = -32769 AND tdubl = -32769")); + CHECK(1 == conn.get_count("nodes", "tsqlt = '-32768' AND ttext = tsqlt AND tint2 = -32768 AND tint4 = -32768 AND tint8 = -32768 AND treal = -32768 AND tdubl = -32768")); + CHECK(1 == conn.get_count("nodes", "tsqlt = '-32767' AND ttext = tsqlt AND tint2 = -32767 AND tint4 = -32767 AND tint8 = -32767 AND treal = -32767 AND tdubl = -32767")); + CHECK(1 == conn.get_count("nodes", "tsqlt = '-2' AND ttext = tsqlt AND tint2 = -2 AND tint4 = -2 AND tint8 = -2 AND treal = -2 AND tdubl = -2 ")); + CHECK(1 == conn.get_count("nodes", "tsqlt = '-1' AND ttext = tsqlt AND tint2 = -1 AND tint4 = -1 AND tint8 = -1 AND treal = -1 AND tdubl = -1 ")); + CHECK(1 == conn.get_count("nodes", "tsqlt = '0' AND ttext = tsqlt AND tint2 = 0 AND tint4 = 0 AND tint8 = 0 AND treal = 0 AND tdubl = 0 ")); + CHECK(1 == conn.get_count("nodes", "tsqlt = '1' AND ttext = tsqlt AND tint2 = 1 AND tint4 = 1 AND tint8 = 1 AND treal = 1 AND tdubl = 1 ")); + CHECK(1 == conn.get_count("nodes", "tsqlt = '2' AND ttext = tsqlt AND tint2 = 2 AND tint4 = 2 AND tint8 = 2 AND treal = 2 AND tdubl = 2 ")); + CHECK(1 == conn.get_count("nodes", "tsqlt = '32767' AND ttext = tsqlt AND tint2 = 32767 AND tint4 = 32767 AND tint8 = 32767 AND treal = 32767 AND tdubl = 32767 ")); + CHECK(1 == conn.get_count("nodes", "tsqlt = '32768' AND ttext = tsqlt AND tint2 IS NULL AND tint4 = 32768 AND tint8 = 32768 AND treal = 32768 AND tdubl = 32768 ")); + CHECK(1 == conn.get_count("nodes", "tsqlt = '32769' AND ttext = tsqlt AND tint2 IS NULL AND tint4 = 32769 AND tint8 = 32769 AND treal = 32769 AND tdubl = 32769 ")); CHECK(1 == conn.get_count("nodes", "tsqlt = '2147483647' AND ttext = tsqlt AND tint2 IS NULL AND tint4 = 2147483647 AND tint8 = 2147483647 ")); CHECK(1 == conn.get_count("nodes", "tsqlt = '2147483648' AND ttext = tsqlt AND tint2 IS NULL AND tint4 IS NULL AND tint8 = 2147483648 ")); CHECK(1 == conn.get_count("nodes", "tsqlt = '2147483649' AND ttext = tsqlt AND tint2 IS NULL AND tint4 IS NULL AND tint8 = 2147483649 ")); - CHECK(1 == conn.get_count("nodes", "tsqlt = ' 42' AND ttext = tsqlt AND tint2 = 42 AND tint4 = 42 AND tint8 = 42 AND treal = 42 ")); + CHECK(1 == conn.get_count("nodes", "tsqlt = ' 42' AND ttext = tsqlt AND tint2 = 42 AND tint4 = 42 AND tint8 = 42 AND treal = 42 AND tdubl = 42 ")); // clang-format on }