From 18863d7d9ae40f89046c102a501b5e32fd9c230e Mon Sep 17 00:00:00 2001 From: Gilbert Date: Sat, 13 Jun 2026 14:15:23 +0800 Subject: [PATCH 1/2] Fix compilation warnings in myxql lib The Elixir compiler warns when a variable used in a bitstring size specifier is defined outside the match. The compiler instructs the author to pin the variable with the ^ operator so it is clear that the existing binding is being matched against, not a new one being bound. Apply the pin operator to the 6 affected bitstring segments: * lib/myxql/protocol.ex - encode_packet/4: pin max_packet_size in size(^max_packet_size) - decode_initial_handshake/1: pin take in binary-size(^take) * lib/myxql/protocol/types.ex - take_string_lenenc/1: pin size in string(^size) * lib/myxql/protocol/values.ex - decode_binary_row/2: pin size in uint(^size) - decode_bit/2: pin both pad and size in size(^pad), size(^size) Also drop the unused 'require Bitwise' from MyXQL.Protocol.Auth. All call sites in the codebase use the fully-qualified Bitwise.bxor/band/bor form, so the require is dead. The original TODO comment said to remove it once Elixir 1.10+ is required; mix.exs declares 'elixir: ~> 1.13', so that bar is cleared. Behaviour is unchanged: the pin operator in a bitstring size position is purely a syntactic clarification. mix compile --warnings-as-errors passes cleanly. --- lib/myxql/protocol.ex | 4 ++-- lib/myxql/protocol/auth.ex | 3 --- lib/myxql/protocol/types.ex | 2 +- lib/myxql/protocol/values.ex | 4 ++-- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/myxql/protocol.ex b/lib/myxql/protocol.ex index 74dd083c..f14db13a 100644 --- a/lib/myxql/protocol.ex +++ b/lib/myxql/protocol.ex @@ -28,7 +28,7 @@ defmodule MyXQL.Protocol do defp encode_packet(payload, payload_size, sequence_id, max_packet_size) do if payload_size > max_packet_size do - <> = IO.iodata_to_binary(payload) + <> = IO.iodata_to_binary(payload) rest_size = payload_size - max_packet_size next_sequence_id = if sequence_id < 255, do: sequence_id + 1, else: 0 @@ -121,7 +121,7 @@ defmodule MyXQL.Protocol do >> = rest take = max(13, auth_plugin_data_length - 8) - <> = rest + <> = rest auth_plugin_data2 = decode_string_nul(auth_plugin_data2) auth_plugin_name = decode_string_nul(auth_plugin_name) auth_plugin_data = auth_plugin_data1 <> auth_plugin_data2 diff --git a/lib/myxql/protocol/auth.ex b/lib/myxql/protocol/auth.ex index 9cffb4f6..94efff9f 100644 --- a/lib/myxql/protocol/auth.ex +++ b/lib/myxql/protocol/auth.ex @@ -1,9 +1,6 @@ defmodule MyXQL.Protocol.Auth do @moduledoc false - # TODO: remove when we require Elixir v1.10+ - require Bitwise - # https://dev.mysql.com/doc/internals/en/secure-password-authentication.html @spec mysql_native_password(binary(), binary()) :: binary() def mysql_native_password(password, auth_plugin_data) do diff --git a/lib/myxql/protocol/types.ex b/lib/myxql/protocol/types.ex index 572331d9..03792ce9 100644 --- a/lib/myxql/protocol/types.ex +++ b/lib/myxql/protocol/types.ex @@ -56,7 +56,7 @@ defmodule MyXQL.Protocol.Types do def take_string_lenenc(binary) do {size, rest} = take_int_lenenc(binary) - <> = rest + <> = rest {string, rest} end diff --git a/lib/myxql/protocol/values.ex b/lib/myxql/protocol/values.ex index 29369bfc..2bbfa47d 100644 --- a/lib/myxql/protocol/values.ex +++ b/lib/myxql/protocol/values.ex @@ -345,7 +345,7 @@ defmodule MyXQL.Protocol.Values do def decode_binary_row(<>, column_defs) do size = div(length(column_defs) + 7 + 2, 8) - <<0x00, null_bitmap::uint(size), values::bits>> = payload + <<0x00, null_bitmap::uint(^size), values::bits>> = payload null_bitmap = null_bitmap >>> 2 types = Enum.map(column_defs, &column_def_to_type/1) decode_binary_row(values, null_bitmap, types, []) @@ -661,7 +661,7 @@ defmodule MyXQL.Protocol.Values do defp decode_bit(binary, size) do pad = 8 - rem(size, 8) - <<0::size(pad), bitstring::size(size)-bits>> = binary + <<0::size(^pad), bitstring::size(^size)-bits>> = binary bitstring end end From 27f39a31506d0460ab4e5a20f4959e31b589b50e Mon Sep 17 00:00:00 2001 From: Gilbert Date: Sat, 13 Jun 2026 14:15:30 +0800 Subject: [PATCH 2/2] Update dev/test dependencies Auto-resolved by mix deps.get to the latest versions allowed by the ranges declared in mix.exs. Notable updates: * geo 3.4.0 -> 4.1.0 (already supported: '~> 3.4 or ~> 4.0') * db_connection 2.4.1 -> 2.10.1 * decimal 3.0.0 -> 3.1.1 * dialyxir 1.0.0 -> 1.4.7 * benchee 1.0.1 -> 1.5.1 (pulls in new dev dep statistex 1.1.1) * telemetry 1.0.0 -> 1.4.2 * ex_doc 0.40.1 -> 0.40.3 * erlex 0.2.6 -> 0.2.9 * deep_merge 1.0.0 -> 1.0.2 * table 0.1.0 -> 0.1.2 * makeup_erlang 1.0.3 -> 1.1.0 No code changes required for any of these. mix compile passes with no warnings after the previous commit's warning fixes. --- mix.lock | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/mix.lock b/mix.lock index 57b4bd72..4d11b223 100644 --- a/mix.lock +++ b/mix.lock @@ -1,20 +1,21 @@ %{ - "benchee": {:hex, :benchee, "1.0.1", "66b211f9bfd84bd97e6d1beaddf8fc2312aaabe192f776e8931cb0c16f53a521", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}], "hexpm", "3ad58ae787e9c7c94dd7ceda3b587ec2c64604563e049b2a0e8baafae832addb"}, + "benchee": {:hex, :benchee, "1.5.1", "b95cbc36c4b98969a5c592a246e171041eb683c56bad1cb4f49a3b081ba66087", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}, {:statistex, "~> 1.1", [hex: :statistex, repo: "hexpm", optional: false]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "a539301f8dfd4efc5c5123bfb9d47ebde20092a863a5b5b16c2a60d2243dfce7"}, "binpp": {:hex, :binpp, "1.1.1", "a01060124841ed3a22ed98ddeafc10d14166d2991683d5ce907a3a410559c9ee", [:rebar3], [], "hexpm", "2ef9fb04a1c7a79644c84e8402e1dc5a7f2bf2b182c211329465f3f188e923fa"}, "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, - "db_connection": {:hex, :db_connection, "2.4.1", "6411f6e23f1a8b68a82fa3a36366d4881f21f47fc79a9efb8c615e62050219da", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ea36d226ec5999781a9a8ad64e5d8c4454ecedc7a4d643e4832bf08efca01f00"}, - "decimal": {:hex, :decimal, "3.0.0", "ce2befbd7218427e4a57d1c6efa6bf50cfc7d0c480c422e70f4fb533074a5f33", [:mix], [], "hexpm", "7a6ab3f806f09738991fc951b2fd2390b3377113feec605a540121aaf772a87b"}, - "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"}, - "dialyxir": {:hex, :dialyxir, "1.0.0", "6a1fa629f7881a9f5aaf3a78f094b2a51a0357c843871b8bc98824e7342d00a5", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "aeb06588145fac14ca08d8061a142d52753dbc2cf7f0d00fc1013f53f8654654"}, + "db_connection": {:hex, :db_connection, "2.10.1", "d5465f6bcc125c1b8981c1dbf23c193ca16f446ec0b25832dc174f74f18be510", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "18ed94c6e627b4bf452dbd4df61b69a35a1e768525140bc1917b7a685026a6a3"}, + "decimal": {:hex, :decimal, "3.1.1", "430d87b04011ce6cbd4fd205be758311a81f87d552d40904abd00f015935b1d0", [:mix], [], "hexpm", "c5f25f2ced74a0587d03e6023f595db8e924c9d3922c8c8ffd9edfc4498cf1f6"}, + "deep_merge": {:hex, :deep_merge, "1.0.2", "476aa7ea61c54de96220051b998d893869069094da65b96101aebf79416f8a1e", [:mix], [], "hexpm", "737a53cdc9758fedbb608bdc213969e65729466c4ef3cd8e8726d0335dff116c"}, + "dialyxir": {:hex, :dialyxir, "1.4.7", "dda948fcee52962e4b6c5b4b16b2d8fa7d50d8645bbae8b8685c3f9ecb7f5f4d", [:mix], [{:erlex, ">= 0.2.8", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b34527202e6eb8cee198efec110996c25c5898f43a4094df157f8d28f27d9efe"}, "earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"}, - "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, - "ex_doc": {:hex, :ex_doc, "0.40.1", "67542e4b6dde74811cfd580e2c0149b78010fd13001fda7cfeb2b2c2ffb1344d", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "bcef0e2d360d93ac19f01a85d58f91752d930c0a30e2681145feea6bd3516e00"}, - "geo": {:hex, :geo, "3.4.0", "d592cf647fc9651ff32ca3467f385d88700d504de0ca6ee196a64f1a5200cba3", [:mix], [{:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "6dd5fd42e5a51f270f209c8634eb63b3390bf9d03641442d61b38c41317eb1dc"}, + "erlex": {:hex, :erlex, "0.2.9", "7debbbaa9f4f368b8cd648983e0f1d7963028508e9c59e9d4ed504e94ef52a55", [:mix], [], "hexpm", "8cfffc0ec7159e6d73de2ab28a588064de80f88b2798d5cbe4482cbbc200178b"}, + "ex_doc": {:hex, :ex_doc, "0.40.3", "4a972ffe64bc07dc605af487e98fc19b72a4185f55ca031b94c0552d6071c1d9", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "2756e357742fecd9749b489b85d67c9ce99c465f2e75728d9e6dc8d704b973de"}, + "geo": {:hex, :geo, "4.1.0", "64ba89a64cc400b5b16dd2f5bd644cb141776eb8c2ac5a983332c8d944936c12", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "19edb2b3398ca9f701b573b1fb11bc90951ebd64f18b06bd1bf35abe509a2934"}, "jason": {:hex, :jason, "1.4.5", "2e3a008590b0b8d7388c20293e9dcc9cf3e5d642fd2a114e4cbbb52e595d940a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b0c823996102bcd0239b3c2444eb00409b72f6a140c1950bc8b457d836b30684"}, "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, - "makeup_erlang": {:hex, :makeup_erlang, "1.0.3", "4252d5d4098da7415c390e847c814bad3764c94a814a0b4245176215615e1035", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "953297c02582a33411ac6208f2c6e55f0e870df7f80da724ed613f10e6706afd"}, + "makeup_erlang": {:hex, :makeup_erlang, "1.1.0", "835f7e60792e08824cda445639555d7bf1bbbddb1b60b306e33cb6f6db24dc74", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "1cd6780fb1dd1a03979abaed0fe82712b0625118fd5257d3ebbf73f960c73c3c"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, - "table": {:hex, :table, "0.1.0", "f16104d717f960a623afb134a91339d40d8e11e0c96cfce54fee086b333e43f0", [:mix], [], "hexpm", "bf533d3606823ad8a7ee16f41941e5e6e0e42a20c4504cdf4cfabaaed1c8acb9"}, - "telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"}, + "statistex": {:hex, :statistex, "1.1.1", "73612aa7f79e53c30569be065fd121e380f1cf57bc4c2da5b41be9246da18df9", [:mix], [], "hexpm", "310c4b49b34adf683de3103639006bed233ab54c08a4add65a531448e653857c"}, + "table": {:hex, :table, "0.1.2", "87ad1125f5b70c5dea0307aa633194083eb5182ec537efc94e96af08937e14a8", [:mix], [], "hexpm", "7e99bc7efef806315c7e65640724bf165c3061cdc5d854060f74468367065029"}, + "telemetry": {:hex, :telemetry, "1.4.2", "a0cb522801dffb1c49fe6e30561badffc7b6d0e180db1300df759faa22062855", [:rebar3], [], "hexpm", "928f6495066506077862c0d1646609eed891a4326bee3126ba54b60af61febb1"}, }