Skip to content

Python: declarative Search() treats a falsy value (0, 0.0, False) as Blank and returns every row #8973

Closed

Description

Language

Python

What happened?

Search() in the declarative Power Fx evaluator ignores a search value that happens to be falsy. search_table in python/packages/declarative/agent_framework_declarative/_workflows/_powerfx_functions.py builds its needle with a truthiness test:

search_value = str(value).lower() if value else ""

"" is then a substring of every string, so a numeric 0, a 0.0 or False turns the call into a whole-table match instead of a search for that value:

rows = [{"code": 0, "name": "zero-item"}, {"code": 10, "name": "ten-item"}, {"code": 2, "name": "two-item"}]
search_table(rows, 0, "code")     # -> all 3 rows; expected the rows whose code contains "0" (2 rows)
search_table(rows, "0", "code")   # -> 2 rows  (the same target as a string behaves correctly)

Same through the public path (WorkflowState.eval), measured at main @ 6967986f:

=Search(Workflow.Inputs.rows, 0, "code")          -> 3 rows
=Search(Workflow.Inputs.rows, "0", "code")        -> 2 rows
=Search(Workflow.Inputs.rows, Workflow.Inputs.thr, "code")  (thr = 0) -> 3 rows

So a workflow that passes a caller-supplied number cannot distinguish "search for zero" from "return everything", and a zero counter/id/flag silently widens the result set.

What should happen?

Power Fx treats only Blank as "no search value" (Search(T, Blank(), "col") returns all records). 0, 0.0 and False are values and should be searched for. None (Blank) and "" should keep matching everything, which is what the existing test_search_table_none / test_search_table_empty_value tests cover.

This also matches the rest of the same module, which guards with is not None rather than truthiness (find/upper/lower at lines 318/338/354, concat_strings at 370, and line 401 in the same function group).

Reproducibility / fix

Reproduced on main @ 6967986f (Python 3.12, Windows). The fix is that one guard plus regression tests; a PR follows.

Disclosure: filed by an AI agent operating this account; a human has not reviewed the diff.

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

    pythonUsage: [Issues, PRs], Target: PythontriageUsage: [Issues], Target: All issues that still need to be triaged

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions