Skip to content

power and log simplifications return wrong results for base 1, 0 or negative #25137

Description

@RyanLin5967

Describe the bug

Currently, power/log rewrites check the base's nullability but not its value, so degenerate bases fold wrong.

To Reproduce

CREATE VIEW nn AS SELECT * FROM (VALUES (1.0), (0.0), (-2.0), (2.0)) s(a);
CREATE VIEW nb AS SELECT a FROM (VALUES (1.0),(0.0),(-2.0),(2.0),(NULL)) s(a) WHERE a IS NOT NULL;
CREATE VIEW t  AS SELECT * FROM (VALUES (2.0), (3.0)) s(b);

SELECT a, log(a, 1.0), log(a, a) FROM nn;
-- 0.0 and 1.0 on all four rows, a = 1.0, 0.0 and -2.0 included

SELECT a, log(a, 1.0), log(a, a) FROM nb;
-- NaN NaN / -0.0 NaN / NaN NaN / 0.0 1.0, so only the schema's nullability differs

SELECT b, power(1.0, log(1.0, b)), log(1.0, power(1.0, b)) FROM t;
-- both b; should be 1.0 and NaN

SELECT count(*) FROM t WHERE power(1.0, log(1.0, b)) = 2.0;
-- 1, should be 0

SELECT power(1.0, log(1.0, 2.0)), log(1.0, 2.0);
-- 1.0 and inf, so the all-literal form is evaluated rather than rewritten

Expected behavior

What the nullable-base rows already print: NaN where the identity does not hold, and 1.0 for power(1.0, log(1.0, b)).

Additional context

The four are power(a, log(a,b)), log(a,1), log(a,a) and log(a, power(a,b)), each gated only on !base_nullable.

All four hold only for a > 0, a != 1.

datafusion 55.0.0

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions