{
  "duckdb": "1.4.3",
  "datafusion": "54.0.0",
  "partitions": 2,
  "recordedAt": "2026-09-10T19:19:04.604814+00:00",
  "fileSha256": "12e54f3643325c44da99b5508fc79bc83e92ee2a0da78ddf603d6d090064a4b5",
  "normalization": "Only the absolute fixture file path is replaced by <fixture>/weather.parquet. No operators or estimates are removed.",
  "queries": [
    {
      "id": "preview",
      "label": "Read observations",
      "sql": "SELECT * FROM data ORDER BY observation_id",
      "columns": [
        {
          "name": "observation_id",
          "type": "BIGINT"
        },
        {
          "name": "station",
          "type": "VARCHAR"
        },
        {
          "name": "observed_at",
          "type": "TIMESTAMP"
        },
        {
          "name": "temperature_c",
          "type": "DOUBLE"
        }
      ],
      "rows": [
        [
          "1",
          "North",
          "2026-01-01 00:00:00",
          "5.0"
        ],
        [
          "2",
          "South",
          "2026-01-01 03:00:00",
          "6.0"
        ],
        [
          "3",
          "North",
          "2026-01-01 06:00:00",
          "7.0"
        ],
        [
          "4",
          "South",
          "2026-01-01 09:00:00",
          "8.0"
        ],
        [
          "5",
          "North",
          "2026-01-01 12:00:00",
          "9.0"
        ],
        [
          "6",
          "South",
          "2026-01-01 15:00:00",
          "10.0"
        ],
        [
          "7",
          "North",
          "2026-01-02 00:00:00",
          "11.0"
        ],
        [
          "8",
          "South",
          "2026-01-02 03:00:00",
          "12.0"
        ],
        [
          "9",
          "North",
          "2026-01-02 06:00:00",
          "13.0"
        ],
        [
          "10",
          "South",
          "2026-01-02 09:00:00",
          "14.0"
        ],
        [
          "11",
          "North",
          "2026-01-02 12:00:00",
          "15.0"
        ],
        [
          "12",
          "South",
          "2026-01-02 15:00:00",
          "16.0"
        ],
        [
          "13",
          "North",
          "2026-01-01 21:00:00",
          "17.0"
        ],
        [
          "14",
          "South",
          "2026-01-03 03:00:00",
          "18.0"
        ],
        [
          "15",
          "North",
          "2026-01-03 06:00:00",
          "19.0"
        ],
        [
          "16",
          "South",
          "2026-01-03 09:00:00",
          "20.0"
        ],
        [
          "17",
          "North",
          "2026-01-03 12:00:00",
          "21.0"
        ],
        [
          "18",
          "South",
          "2026-01-03 15:00:00",
          "22.0"
        ]
      ],
      "duckdb": "\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         PROJECTION        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502__internal_decompress_integ\u2502\n\u2502     ral_bigint(#0, 1)     \u2502\n\u2502             #1            \u2502\n\u2502             #2            \u2502\n\u2502             #3            \u2502\n\u2502                           \u2502\n\u2502          ~0 rows          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502          ORDER_BY         \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502     memory.main.\"data\"    \u2502\n\u2502    .observation_id ASC    \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         PROJECTION        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502__internal_compress_integra\u2502\n\u2502     l_utinyint(#0, 1)     \u2502\n\u2502             #1            \u2502\n\u2502             #2            \u2502\n\u2502             #3            \u2502\n\u2502                           \u2502\n\u2502          ~18 rows         \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502       PARQUET_SCAN        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502         Function:         \u2502\n\u2502        PARQUET_SCAN       \u2502\n\u2502                           \u2502\n\u2502        Projections:       \u2502\n\u2502       observation_id      \u2502\n\u2502          station          \u2502\n\u2502        observed_at        \u2502\n\u2502       temperature_c       \u2502\n\u2502                           \u2502\n\u2502          ~18 rows         \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n",
      "datafusion": {
        "logical": "Sort: data.observation_id ASC NULLS LAST\n  Projection: data.observation_id, data.station, data.observed_at, data.temperature_c\n    TableScan: data",
        "optimized": "Sort: data.observation_id ASC NULLS LAST\n  TableScan: data projection=[observation_id, station, observed_at, temperature_c]",
        "physical": "SortExec: expr=[observation_id@0 ASC NULLS LAST], preserve_partitioning=[false]\n  DataSourceExec: file_groups={1 group: [[<fixture>/weather.parquet]]}, projection=[observation_id, station, observed_at, temperature_c], file_type=parquet, sort_order_for_reorder=[observation_id@0 ASC NULLS LAST]\n"
      }
    },
    {
      "id": "filter",
      "label": "Select warm observations",
      "sql": "SELECT observation_id, station, temperature_c FROM data WHERE temperature_c >= 18 ORDER BY observation_id",
      "columns": [
        {
          "name": "observation_id",
          "type": "BIGINT"
        },
        {
          "name": "station",
          "type": "VARCHAR"
        },
        {
          "name": "temperature_c",
          "type": "DOUBLE"
        }
      ],
      "rows": [
        [
          "14",
          "South",
          "18.0"
        ],
        [
          "15",
          "North",
          "19.0"
        ],
        [
          "16",
          "South",
          "20.0"
        ],
        [
          "17",
          "North",
          "21.0"
        ],
        [
          "18",
          "South",
          "22.0"
        ]
      ],
      "duckdb": "\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         PROJECTION        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502__internal_decompress_integ\u2502\n\u2502     ral_bigint(#0, 1)     \u2502\n\u2502             #1            \u2502\n\u2502             #2            \u2502\n\u2502                           \u2502\n\u2502          ~0 rows          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502          ORDER_BY         \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502     memory.main.\"data\"    \u2502\n\u2502    .observation_id ASC    \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         PROJECTION        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502__internal_compress_integra\u2502\n\u2502     l_utinyint(#0, 1)     \u2502\n\u2502             #1            \u2502\n\u2502             #2            \u2502\n\u2502                           \u2502\n\u2502          ~3 rows          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502       PARQUET_SCAN        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502         Function:         \u2502\n\u2502        PARQUET_SCAN       \u2502\n\u2502                           \u2502\n\u2502        Projections:       \u2502\n\u2502       observation_id      \u2502\n\u2502          station          \u2502\n\u2502       temperature_c       \u2502\n\u2502                           \u2502\n\u2502          Filters:         \u2502\n\u2502    temperature_c>=18.0    \u2502\n\u2502                           \u2502\n\u2502          ~3 rows          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n",
      "datafusion": {
        "logical": "Sort: data.observation_id ASC NULLS LAST\n  Projection: data.observation_id, data.station, data.temperature_c\n    Filter: data.temperature_c >= Int64(18)\n      TableScan: data",
        "optimized": "Sort: data.observation_id ASC NULLS LAST\n  Filter: data.temperature_c >= Float64(18)\n    TableScan: data projection=[observation_id, station, temperature_c], partial_filters=[data.temperature_c >= Float64(18)]",
        "physical": "SortPreservingMergeExec: [observation_id@0 ASC NULLS LAST]\n  SortExec: expr=[observation_id@0 ASC NULLS LAST], preserve_partitioning=[true]\n    FilterExec: temperature_c@2 >= 18\n      RepartitionExec: partitioning=RoundRobinBatch(2), input_partitions=1\n        DataSourceExec: file_groups={1 group: [[<fixture>/weather.parquet]]}, projection=[observation_id, station, temperature_c], file_type=parquet, predicate=temperature_c@3 >= 18, pruning_predicate=temperature_c_null_count@1 != row_count@2 AND temperature_c_max@0 >= 18, required_guarantees=[]\n"
      }
    },
    {
      "id": "aggregate",
      "label": "Group by station",
      "sql": "SELECT station, count(*) AS observations, avg(temperature_c) AS average_c FROM data GROUP BY station ORDER BY station",
      "columns": [
        {
          "name": "station",
          "type": "VARCHAR"
        },
        {
          "name": "observations",
          "type": "BIGINT"
        },
        {
          "name": "average_c",
          "type": "DOUBLE"
        }
      ],
      "rows": [
        [
          "North",
          "9",
          "13.0"
        ],
        [
          "South",
          "9",
          "14.0"
        ]
      ],
      "duckdb": "\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502          ORDER_BY         \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502 memory.main.\"data\".station\u2502\n\u2502             ASC           \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502       HASH_GROUP_BY       \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502         Groups: #0        \u2502\n\u2502                           \u2502\n\u2502        Aggregates:        \u2502\n\u2502        count_star()       \u2502\n\u2502          avg(#1)          \u2502\n\u2502                           \u2502\n\u2502          ~11 rows         \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         PROJECTION        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502          station          \u2502\n\u2502       temperature_c       \u2502\n\u2502                           \u2502\n\u2502          ~18 rows         \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502       PARQUET_SCAN        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502         Function:         \u2502\n\u2502        PARQUET_SCAN       \u2502\n\u2502                           \u2502\n\u2502        Projections:       \u2502\n\u2502          station          \u2502\n\u2502       temperature_c       \u2502\n\u2502                           \u2502\n\u2502          ~18 rows         \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n",
      "datafusion": {
        "logical": "Sort: data.station ASC NULLS LAST\n  Projection: data.station, count(Int64(1)) AS count(*) AS observations, avg(data.temperature_c) AS average_c\n    Aggregate: groupBy=[[data.station]], aggr=[[count(Int64(1)), avg(data.temperature_c)]]\n      TableScan: data",
        "optimized": "Sort: data.station ASC NULLS LAST\n  Projection: data.station, count(Int64(1)) AS count(*) AS observations, avg(data.temperature_c) AS average_c\n    Aggregate: groupBy=[[data.station]], aggr=[[count(Int64(1)), avg(data.temperature_c)]]\n      TableScan: data projection=[station, temperature_c]",
        "physical": "SortPreservingMergeExec: [station@0 ASC NULLS LAST]\n  SortExec: expr=[station@0 ASC NULLS LAST], preserve_partitioning=[true]\n    ProjectionExec: expr=[station@0 as station, count(Int64(1))@1 as observations, avg(data.temperature_c)@2 as average_c]\n      AggregateExec: mode=FinalPartitioned, gby=[station@0 as station], aggr=[count(Int64(1)), avg(data.temperature_c)]\n        RepartitionExec: partitioning=Hash([station@0], 2), input_partitions=1\n          AggregateExec: mode=Partial, gby=[station@0 as station], aggr=[count(Int64(1)), avg(data.temperature_c)]\n            DataSourceExec: file_groups={1 group: [[<fixture>/weather.parquet]]}, projection=[station, temperature_c], file_type=parquet\n"
      }
    },
    {
      "id": "join",
      "label": "Join station descriptions",
      "sql": "SELECT d.observation_id, s.description, d.temperature_c FROM data d JOIN stations s USING (station) WHERE d.temperature_c >= 18 ORDER BY d.observation_id",
      "columns": [
        {
          "name": "observation_id",
          "type": "BIGINT"
        },
        {
          "name": "description",
          "type": "VARCHAR"
        },
        {
          "name": "temperature_c",
          "type": "DOUBLE"
        }
      ],
      "rows": [
        [
          "14",
          "Southern site",
          "18.0"
        ],
        [
          "15",
          "Northern site",
          "19.0"
        ],
        [
          "16",
          "Southern site",
          "20.0"
        ],
        [
          "17",
          "Northern site",
          "21.0"
        ],
        [
          "18",
          "Southern site",
          "22.0"
        ]
      ],
      "duckdb": "\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         PROJECTION        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502__internal_decompress_integ\u2502\n\u2502     ral_bigint(#0, 1)     \u2502\n\u2502             #1            \u2502\n\u2502             #2            \u2502\n\u2502                           \u2502\n\u2502          ~0 rows          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502          ORDER_BY         \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502    d.observation_id ASC   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         PROJECTION        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502__internal_compress_integra\u2502\n\u2502     l_utinyint(#0, 1)     \u2502\n\u2502             #1            \u2502\n\u2502             #2            \u2502\n\u2502                           \u2502\n\u2502          ~3 rows          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         PROJECTION        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502       observation_id      \u2502\n\u2502        description        \u2502\n\u2502       temperature_c       \u2502\n\u2502                           \u2502\n\u2502          ~3 rows          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         HASH_JOIN         \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502      Join Type: INNER     \u2502\n\u2502                           \u2502\n\u2502        Conditions:        \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502     station = station     \u2502              \u2502\n\u2502                           \u2502              \u2502\n\u2502          ~3 rows          \u2502              \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518              \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502       PARQUET_SCAN        \u2502\u2502      COLUMN_DATA_SCAN     \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502         Function:         \u2502\u2502                           \u2502\n\u2502        PARQUET_SCAN       \u2502\u2502                           \u2502\n\u2502                           \u2502\u2502                           \u2502\n\u2502        Projections:       \u2502\u2502                           \u2502\n\u2502       observation_id      \u2502\u2502                           \u2502\n\u2502          station          \u2502\u2502                           \u2502\n\u2502       temperature_c       \u2502\u2502                           \u2502\n\u2502                           \u2502\u2502                           \u2502\n\u2502          Filters:         \u2502\u2502                           \u2502\n\u2502    temperature_c>=18.0    \u2502\u2502                           \u2502\n\u2502                           \u2502\u2502                           \u2502\n\u2502          ~3 rows          \u2502\u2502          ~2 rows          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n",
      "datafusion": {
        "logical": "Sort: d.observation_id ASC NULLS LAST\n  Projection: d.observation_id, s.description, d.temperature_c\n    Filter: d.temperature_c >= Int64(18)\n      Inner Join: Using d.station = s.station\n        SubqueryAlias: d\n          TableScan: data\n        SubqueryAlias: s\n          TableScan: stations",
        "optimized": "Sort: d.observation_id ASC NULLS LAST\n  Projection: d.observation_id, s.description, d.temperature_c\n    Inner Join: d.station = CAST(s.station AS Utf8View)\n      SubqueryAlias: d\n        Filter: data.temperature_c >= Float64(18)\n          TableScan: data projection=[observation_id, station, temperature_c], partial_filters=[data.temperature_c >= Float64(18)]\n      SubqueryAlias: s\n        TableScan: stations projection=[station, description]",
        "physical": "SortPreservingMergeExec: [observation_id@0 ASC NULLS LAST]\n  SortExec: expr=[observation_id@0 ASC NULLS LAST], preserve_partitioning=[true]\n    HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(CAST(s.station AS Utf8View)@2, station@1)], projection=[observation_id@3, description@1, temperature_c@5]\n      ProjectionExec: expr=[station@0 as station, description@1 as description, CAST(station@0 AS Utf8View) as CAST(s.station AS Utf8View)]\n        DataSourceExec: partitions=1, partition_sizes=[1]\n      FilterExec: temperature_c@2 >= 18\n        RepartitionExec: partitioning=RoundRobinBatch(2), input_partitions=1\n          DataSourceExec: file_groups={1 group: [[<fixture>/weather.parquet]]}, projection=[observation_id, station, temperature_c], file_type=parquet, predicate=temperature_c@3 >= 18 AND DynamicFilter [ empty ], pruning_predicate=temperature_c_null_count@1 != row_count@2 AND temperature_c_max@0 >= 18, required_guarantees=[]\n"
      }
    }
  ],
  "arrow": {
    "type": "int64",
    "values": [
      5,
      null,
      7
    ],
    "validityHex": "05",
    "valuesHex": "050000000000000000000000000000000700000000000000"
  }
}
