[
  {
    "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: [[var/folders/sh/6ynfpx_s4j1cd_s7rrtdx2040000gn/T/columnar-engines-ts_c6fjj/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: [[var/folders/sh/6ynfpx_s4j1cd_s7rrtdx2040000gn/T/columnar-engines-ts_c6fjj/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: [[var/folders/sh/6ynfpx_s4j1cd_s7rrtdx2040000gn/T/columnar-engines-ts_c6fjj/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: [[var/folders/sh/6ynfpx_s4j1cd_s7rrtdx2040000gn/T/columnar-engines-ts_c6fjj/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"
    }
  }
]
