PL/pgSQL中的IP递增函数

chr*_*oes 2 postgresql plpgsql

我需要一个 PL/pgSQL 函数,它将 IP 地址作为文本,并向其中添加给定的整数值,并根据需要传递八位字节。

我已经有一个用 JavaScript 编写的工作版本:

export const incrementIpAddress = (ipAddress: string, amount: number) => {
    const octets = ipAddress.split('.');
    const numbers = octets.map(octet => parseInt(octet));

    let carry = amount;
    for(let i = numbers.length - 1; i >= 0 && carry > 0; i--) {
        const sum = numbers[i] + carry;
        numbers[i] = sum % 256;
        carry = Math.floor(sum / 256);
    }

    return numbers.join('.');
}
Run Code Online (Sandbox Code Playgroud)

我尝试让 ChatGPT 将其转换为 PL/pgSQL(我知道,我很抱歉),这就是它的结果:

CREATE OR REPLACE FUNCTION increment_ip_address(ip_address text, amount integer) RETURNS text AS $$
DECLARE
    octets text[];
    numbers integer[];
    carry integer;
    i integer;
BEGIN
    octets := string_to_array(ip_address, '.');
    FOREACH i IN ARRAY octets LOOP
        numbers := numbers || i::integer;
    END LOOP;

    carry := amount;
    FOR i IN REVERSE 1 .. array_upper(numbers, 1) LOOP
        numbers[i] := numbers[i] + carry;
        carry := FLOOR(numbers[i] / 256);
        numbers[i] := numbers[i] % 256;
    END LOOP;

    RETURN array_to_string(numbers, '.')::text;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用,并且始终输出与给定的 IP 相同的 IP,而不是递增的。我可以获得一些帮助来使这个功能发挥作用吗?

Zeg*_*rek 5

PostgreSQL 有一个内置inet类型,您可以将其用于确切的目的。它可以按照您的预期与+操作员一起使用,并添加适当的结转行为:演示

select '127.0.0.255'::inet+23;
--127.0.1.22
Run Code Online (Sandbox Code Playgroud)