From 040a71ea9b0372e8651f13918601668780ec082a Mon Sep 17 00:00:00 2001 From: ruslandoga Date: Thu, 15 Jan 2026 16:44:28 +0300 Subject: [PATCH 1/2] fix negative integer parsing in Enum8 and Enum16 types --- CHANGELOG.md | 4 ++++ lib/ch/types.ex | 13 +++++++------ test/ch/types_test.exs | 6 ++++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 918a688..1763e89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + +- fix negative integer parsing in Enum8 and Enum16 types + ## 0.7.0 (2026-01-13) - use `disconnect_and_retry` (added in DBConnection v2.9.0) instead of `disconnect` for connection errors https://github.com/plausible/ch/pull/292 diff --git a/lib/ch/types.ex b/lib/ch/types.ex index c321c23..0c0c250 100644 --- a/lib/ch/types.ex +++ b/lib/ch/types.ex @@ -546,19 +546,20 @@ defmodule Ch.Types do end defp decode_int(<>, stack, outer_acc) when is_numeric(i) do - decode_int_cont(rest, -(i - ?0), stack, outer_acc) + decode_int_cont(rest, i - ?0, -1, stack, outer_acc) end defp decode_int(<>, stack, outer_acc) when is_numeric(i) do - decode_int_cont(rest, i - ?0, stack, outer_acc) + decode_int_cont(rest, i - ?0, 1, stack, outer_acc) end - defp decode_int_cont(<>, acc, stack, outer_acc) when is_numeric(i) do - decode_int_cont(rest, acc * 10 + i - ?0, stack, outer_acc) + defp decode_int_cont(<>, acc, multiplier, stack, outer_acc) + when is_numeric(i) do + decode_int_cont(rest, acc * 10 + i - ?0, multiplier, stack, outer_acc) end - defp decode_int_cont(<>, int, stack, acc) do - decode(stack, rest, [int | acc]) + defp decode_int_cont(<>, int, multiplier, stack, acc) do + decode(stack, rest, [int * multiplier | acc]) end @doc """ diff --git a/test/ch/types_test.exs b/test/ch/types_test.exs index d8e5ea7..5aa4a5b 100644 --- a/test/ch/types_test.exs +++ b/test/ch/types_test.exs @@ -158,6 +158,12 @@ defmodule Ch.TypesTest do assert decode(" Enum8 ( 'hello' = 1 , 'world' = 2 ) ") == {:enum8, [{"hello", 1}, {"world", 2}]} + + assert decode("Enum8('enum8_min' = -128, 'enum8_zero' = 0, 'enum8_max' = 127)") == + {:enum8, [{"enum8_min", -128}, {"enum8_zero", 0}, {"enum8_max", 127}]} + + assert decode("Enum16('enum16_min' = -32768, 'enum16_zero' = 0, 'enum16_max' = 32767)") == + {:enum16, [{"enum16_min", -32768}, {"enum16_zero", 0}, {"enum16_max", 32767}]} end test "simple aggregate function" do From 130ce12d0c175b88ac5bd42a43ca83c12cf4255c Mon Sep 17 00:00:00 2001 From: ruslandoga Date: Thu, 15 Jan 2026 16:45:01 +0300 Subject: [PATCH 2/2] add pr to changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1763e89..f27e2d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## Unreleased -- fix negative integer parsing in Enum8 and Enum16 types +- fix negative integer parsing in Enum8 and Enum16 types https://github.com/plausible/ch/pull/295 ## 0.7.0 (2026-01-13)