Skip to content

expr: Convert map.rs to the sqlfunc macro - #39093

Closed
antiguru wants to merge 1 commit into
sqlfunc-convert-rangefrom
sqlfunc-convert-map
Closed

antiguru wants to merge 1 commit into
sqlfunc-convert-rangefrom
sqlfunc-convert-map

Conversation

@antiguru

@antiguru antiguru commented Sep 23, 2026 •

Copy link
Copy Markdown
Member

Converts CastMapToString and MapBuildFromRecordList to #[sqlfunc]. Both were hand-written LazyUnaryFunc impls because they allocate their result, which the arena passed to EagerUnaryFunc::call now covers. Their NULL checks move into the input types, ExcludeNull<Datum<'a>> and DatumList<'a>.

MapBuildFromRecordList returns DatumMap<'a>. It returns NULL only for a NULL input and cannot fail, but the old impl declared introduces_nulls and could_error true and a nullable output. The registry records the correction: both flags become false and the output type is non-nullable. Otherwise only sqlfunc_signature moves, on both records. The current LIR_VERSION hasn't shipped, so the snapshots are regenerated in place.

Based on #39092.

🤖 Generated with Claude Code

@antiguru
antiguru requested a review from a team as a code owner September 23, 2026 21:10
@antiguru
antiguru added this pull request to stack #38942 September 24, 2026 08:52
@antiguru
antiguru force-pushed the sqlfunc-convert-range branch from c9dca8f to d0f0e6c Compare September 24, 2026 10:14
@antiguru
antiguru requested a review from petrosagg September 24, 2026 11:18
@antiguru
antiguru force-pushed the sqlfunc-convert-range branch from d0f0e6c to 7ed7d33 Compare September 24, 2026 14:29
@antiguru
antiguru force-pushed the sqlfunc-convert-range branch from 7ed7d33 to 92629c6 Compare September 25, 2026 16:00
@antiguru
antiguru removed the request for review from petrosagg October 13, 2026 15:56
@antiguru
antiguru force-pushed the sqlfunc-convert-range branch from 92629c6 to c7e3d11 Compare October 14, 2026 09:11
@antiguru
antiguru force-pushed the sqlfunc-convert-map branch from 923e52e to b1f46ff Compare October 14, 2026 09:11
@antiguru
antiguru requested a review from mgree October 14, 2026 10:22
Both impls were hand-written because they allocate their result, which the
eager trait now covers, and both checked NULL in the body, which under the
macro has to come from the input type.

`CastMapToString` takes `ExcludeNull<Datum<'a>>`, because `stringify_datum`
takes a raw `Datum` and a bare `Datum` accepts NULL. `ExcludeNull` reports
`nullable() == false`, so the derived `propagates_nulls` is true, matching the
declaration, and its `try_from_result` turns `Datum::Null` into
`Err(Ok(Datum::Null))`, which the evaluation layer returns as `Ok(Datum::Null)`.
`introduces_nulls` derives false from the `String` inside the `Result`. Its
`output_sql_type` returned `String.nullable(input_type.nullable)`, which is
what the derived output plus the unary tail gives for a non-nullable input, so
it needs no output modifier. `preserves_uniqueness = true` carries over, and
`could_error` derives true from the fallible output, matching the
`LazyUnaryFunc` default the impl inherited.

`MapBuildFromRecordList` takes `DatumList<'a>`, which the body already required
by unwrapping the input as a list. `DatumList` reports `nullable() == false` on
its own, so no `ExcludeNull` wrapper is needed and the derived
`propagates_nulls` is true. It returns `DatumMap<'a>`, because the body always
builds a map. The impl declared `introduces_nulls` and `could_error` true, but
the body returns NULL for no non-NULL input and cannot fail, so both now derive
false from the `DatumMap` output. Its `output_sql_type` builds the map type from
the payload, so it becomes an `output_type_expr`, which reports
`nullable(false)` in place of the hardcoded `nullable(true)` and leaves
nullability to the unary tail.

Per-override accounting beyond the above, for both: `eval` becomes the function
body minus the NULL check, and `preserves_uniqueness` (on
`MapBuildFromRecordList`), `inverse`, `is_monotone` and `is_eliminable_cast`
returned the trait defaults and are dropped.

Both `Display` impls wrote a fixed string, so `sqlname` reproduces them, and
`map_build` differs from the function name. With no `Display` left the file
drops `std::fmt` along with the now unused `Eval`, `LazyUnaryFunc` and
`SqlColumnType` imports.

The registry reports `sqlfunc_signature` moving on both records.
`map_build_from_record_list` also moves `introduces_nulls` and `could_error` to
false and its output type to non-nullable, the corrections above, and the digest
is regenerated in place.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@antiguru
antiguru force-pushed the sqlfunc-convert-map branch from b1f46ff to e61cc4e Compare October 14, 2026 15:18
@antiguru
antiguru removed this pull request from stack #38942 October 14, 2026 15:45
@antiguru

Copy link
Copy Markdown
Member Author

Folded into #39062, which now carries all twenty file conversions as separate commits, per review feedback to land them as one PR.

Posted by Claude Code.

@antiguru antiguru closed this Oct 14, 2026
@antiguru
antiguru deleted the sqlfunc-convert-map branch October 14, 2026 19:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant