)]}'
{
  "commit": "af388667f8d8583abdd634fa343252ddb4a0da16",
  "tree": "769758bc6940a3e523c79057b4b1fc1f5c67f1ad",
  "parents": [
    "3d4c56c0757ddc0372ced03ffa97a13ea50d1bd8"
  ],
  "author": {
    "name": "Tim Saucer",
    "email": "timsaucer@gmail.com",
    "time": "Fri May 29 18:04:24 2026 -0400"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri May 29 18:04:24 2026 -0400"
  },
  "message": "feat: expose lambda and higher-order array functions (#1561)\n\n* feat: expose lambda and higher-order array functions\n\nAdd a Pythonic API for DataFusion\u0027s higher-order array functions and the\nlambda expressions they consume.\n\n- Rust: lambda_, lambda_var, array_transform, and array_any_match pyfunctions,\n  plus a ResolveLambdaVariables analyzer rule so expression-builder plans\n  (which emit unresolved lambda variables) resolve before optimization.\n- Python: array_transform / array_any_match (with list_transform, any_match,\n  list_any_match aliases) accept either a Python callable or an explicit\n  lambda built with lambda_ / lambda_var. Callables are introspected so their\n  parameter names become the lambda parameters.\n- Tests and docs (expressions guide + agent skill), noting v1 limits: lambda\n  expressions are not serializable, and SQL arrow syntax needs the DuckDB\n  dialect.\n\n* test: fold lambda tests into pytest parameterization\n\nCombine the eight higher-order function result tests into a single\nparametrized test_higher_order_function_results, and the two to_lambda\nrejection tests into test_to_lambda_rejects_invalid_arg. Each case keeps\na readable id via pytest.param.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n* feat: expose array_filter higher-order function\n\nAdd array_filter, the remaining lambda-based higher-order array function\nin DataFusion (alongside the already-exposed array_transform and\narray_any_match). Includes the list_filter alias matching upstream, tests,\nand documentation in the expressions guide and skill.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: emphasize lambda terminology, trim skill lambda section\n\nLead user-facing array-lambda docs with \"lambda function\" instead of\n\"higher-order function,\" which is less recognizable to users. Drop the\nalias list, serialization caveat, and DuckDB-dialect note from the skill\nto keep it lean; those details already live in the docstrings.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: broaden SQL lambda dialect coverage\n\nOther dialects (ClickHouse, Snowflake, Databricks) also enable lambda\nparsing via sqlparser-rs. Document the full set and recommend the\n``lambda x: x`` keyword form, since DuckDB will drop the ``x -\u003e x``\narrow form in v2.1. Parametrize the SQL test over the four dialects\nusing the keyword syntax.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3a77e08a31f0d5dfb0c2de54c80ccdbc623c6858",
      "new_mode": 33188,
      "new_path": "crates/core/src/analyzer.rs"
    },
    {
      "type": "modify",
      "old_id": "4606246cf009f676b1848c36f5ab459e31503f3f",
      "old_mode": 33188,
      "old_path": "crates/core/src/context.rs",
      "new_id": "d714861a63d848e1a84fd4c7b2b371a9dc50c5a1",
      "new_mode": 33188,
      "new_path": "crates/core/src/context.rs"
    },
    {
      "type": "modify",
      "old_id": "5f47d123b05fd33db343f28c62bfe34055e88deb",
      "old_mode": 33188,
      "old_path": "crates/core/src/functions.rs",
      "new_id": "395d5ebfd20d4fca1efd9935c40212624857437d",
      "new_mode": 33188,
      "new_path": "crates/core/src/functions.rs"
    },
    {
      "type": "modify",
      "old_id": "79bf77717eb0a5789d5f85fd6a09740a092e3e23",
      "old_mode": 33188,
      "old_path": "crates/core/src/lib.rs",
      "new_id": "48abcedc94a49a5500dae49a0092d1cb19fd8d41",
      "new_mode": 33188,
      "new_path": "crates/core/src/lib.rs"
    },
    {
      "type": "modify",
      "old_id": "ae1ccc0dce87e1d5ebe9a8d8d0becdcccc6cc0ba",
      "old_mode": 33188,
      "old_path": "docs/source/user-guide/common-operations/expressions.rst",
      "new_id": "f52c79ddbc37a06cb3f7bebbfb2af8ba860ac818",
      "new_mode": 33188,
      "new_path": "docs/source/user-guide/common-operations/expressions.rst"
    },
    {
      "type": "modify",
      "old_id": "c11a5c6cdac8c8064c64113b981a568769f26f5e",
      "old_mode": 33188,
      "old_path": "python/datafusion/functions.py",
      "new_id": "c8f07497d73d659bcb1d4dae50d3dbd5a1db8c01",
      "new_mode": 33188,
      "new_path": "python/datafusion/functions.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "68be22a04fcd8135ea83fcf97269fb6d39d9569b",
      "new_mode": 33188,
      "new_path": "python/tests/test_lambda.py"
    },
    {
      "type": "modify",
      "old_id": "98fa2c7aab4ae55665ba4f9743df19781eab9252",
      "old_mode": 33188,
      "old_path": "skills/datafusion_python/SKILL.md",
      "new_id": "1aeb78777fecc4b10de269a4a079f54b3f79868c",
      "new_mode": 33188,
      "new_path": "skills/datafusion_python/SKILL.md"
    }
  ]
}
