Skip to content

Commit dc7f7de

Browse files
frankmcsherryclaude
andcommitted
repr: unify fixed-width integer types into Int/UInt at the repr layer
Extends the "repr types" approach (where TEXT/VARCHAR/CHAR collapse to a single ReprScalarType::String once we reach MIR) to the fixed-width integers. At the repr/MIR layer there are now only two integer types: Datum::Int16/Int32/Int64 -> Datum::Int(i64) Datum::UInt8/UInt16/UInt32/UInt64 -> Datum::UInt(u64) ReprScalarType::{Int16,Int32,Int64} -> ReprScalarType::Int ReprScalarType::{UInt8,UInt16,UInt32,UInt64} -> ReprScalarType::UInt SqlScalarType keeps all widths, so OIDs, type names, pg compatibility, the catalog proto, and the on-disk (Arrow/Parquet) layout are unchanged; the declared width lives on the column type, not the value. How it stays low-blast-radius: - The #[sqlfunc] marshalling (Input/OutputDatumType) narrows on input and widens on output, and AsColumnType still reports the width-specific SQL type, so the ~100+ integer arithmetic/cast function bodies are unchanged. - unwrap_int32 etc. keep their names (narrow with an invariant assert). - Egress guardrails narrow the unified value back to the declared width at the Arrow encoder, arrow-util builder, and pgwire (Value::from_datum). - Row byte-tag encode/decode reads all legacy integer tags (backward compatible) and writes via the 64-bit variable-length tag families. Widening cast elision: same-sign widening casts (int2->int4, int2->int8, int4->int8, and the unsigned analogs) are now is_eliminable_cast, since on the unified Datum they are the identity; lowering drops them like the unbounded-VarChar cast. Narrowing and cross-sign casts remain real checked functions, preserving overflow semantics. Adds src/sql/tests/int_cast_elimination.rs, an in-process test that lowers a widening and a narrowing cast and asserts the widening one is eliminated while the narrowing one is preserved. KNOWN INCOMPLETE (intentionally pushed for CI): - Range canonicalization (adt/range.rs) is stubbed to i64: the unified Datum::Int no longer distinguishes int4range from int8range, which is wrong at the i32 boundary. This is a pre-existing piece of slop (the only place an integer Datum tag was semantically load-bearing); the real fix threads the element SqlScalarType into canonicalize and will land against main independently. - Inline #[cfg(test)] modules are not yet migrated off the old Datum variants, so `cargo test`/`clippy --all-targets` do not build yet; the workspace library builds clean. - ~40 SLT EXPLAIN expected outputs (dominated by integer_to_bigint) need regeneration via --rewrite-results now that widening casts are elided. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent bf03574 commit dc7f7de

63 files changed

Lines changed: 797 additions & 736 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/adapter/src/active_compute_sink.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ impl ActiveSubscribe {
208208
SubscribeOutput::EnvelopeUpsert { .. }
209209
| SubscribeOutput::EnvelopeDebezium { .. } => {}
210210
SubscribeOutput::Diffs | SubscribeOutput::WithinTimestampOrderBy { .. } => {
211-
packer.push(Datum::Int64(diff.into_inner()));
211+
packer.push(Datum::Int(diff.into_inner()));
212212
}
213213
}
214214

@@ -226,10 +226,10 @@ impl ActiveSubscribe {
226226
|(left_row, left_time, left_diff), (right_row, right_time, right_diff)| {
227227
left_time.cmp(right_time).then_with(|| {
228228
let mut left_datums = left_datum_vec.borrow();
229-
left_datums.extend(&[Datum::Int64(left_diff.into_inner())]);
229+
left_datums.extend(&[Datum::Int(left_diff.into_inner())]);
230230
left_datums.extend(left_row.iter());
231231
let mut right_datums = right_datum_vec.borrow();
232-
right_datums.extend(&[Datum::Int64(right_diff.into_inner())]);
232+
right_datums.extend(&[Datum::Int(right_diff.into_inner())]);
233233
right_datums.extend(right_row.iter());
234234
compare_columns(order_by, &left_datums, &right_datums, || {
235235
left_row.cmp(right_row).then(left_diff.cmp(right_diff))

src/adapter/src/catalog/builtin_table_updates.rs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ impl CatalogState {
140140
&*MZ_ROLE_AUTH,
141141
Row::pack_slice(&[
142142
Datum::String(&role_auth.role_id.to_string()),
143-
Datum::UInt32(role.oid),
143+
Datum::from(role.oid),
144144
match &role_auth.password_hash {
145145
Some(hash) => Datum::String(hash),
146146
None => Datum::Null,
@@ -444,12 +444,12 @@ impl CatalogState {
444444
Row::pack_slice(&[
445445
Datum::String(&id.to_string()),
446446
Datum::String(column_name),
447-
Datum::UInt64(u64::cast_from(i + 1)),
447+
Datum::UInt(u64::cast_from(i + 1)),
448448
Datum::from(column_type.nullable),
449449
Datum::String(type_name),
450450
default,
451-
Datum::UInt32(type_oid),
452-
Datum::Int32(pgtype.typmod()),
451+
Datum::from(type_oid),
452+
Datum::from(pgtype.typmod()),
453453
]),
454454
diff,
455455
));
@@ -534,7 +534,7 @@ impl CatalogState {
534534
&*MZ_TABLES,
535535
Row::pack_slice(&[
536536
Datum::String(&id.to_string()),
537-
Datum::UInt32(oid),
537+
Datum::from(oid),
538538
Datum::String(&schema_id.to_string()),
539539
Datum::String(name),
540540
Datum::String(&owner_id.to_string()),
@@ -889,7 +889,7 @@ impl CatalogState {
889889
&*MZ_VIEWS,
890890
Row::pack_slice(&[
891891
Datum::String(&id.to_string()),
892-
Datum::UInt32(oid),
892+
Datum::from(oid),
893893
Datum::String(&schema_id.to_string()),
894894
Datum::String(name),
895895
Datum::String(&query_string),
@@ -1039,7 +1039,7 @@ impl CatalogState {
10391039
&*MZ_SINKS,
10401040
Row::pack_slice(&[
10411041
Datum::String(&id.to_string()),
1042-
Datum::UInt32(oid),
1042+
Datum::from(oid),
10431043
Datum::String(&schema_id.to_string()),
10441044
Datum::String(name),
10451045
Datum::String(sink.connection.name()),
@@ -1107,15 +1107,15 @@ impl CatalogState {
11071107
.to_ast_string_simple();
11081108
let (field_number, expression) = match key {
11091109
MirScalarExpr::Column(col, _) => {
1110-
(Datum::UInt64(u64::cast_from(*col + 1)), Datum::Null)
1110+
(Datum::UInt(u64::cast_from(*col + 1)), Datum::Null)
11111111
}
11121112
_ => (Datum::Null, Datum::String(&key_sql)),
11131113
};
11141114
updates.push(BuiltinTableUpdate::row(
11151115
&*MZ_INDEX_COLUMNS,
11161116
Row::pack_slice(&[
11171117
Datum::String(&id.to_string()),
1118-
Datum::UInt64(seq_in_index),
1118+
Datum::UInt(seq_in_index),
11191119
field_number,
11201120
expression,
11211121
Datum::from(nullable),
@@ -1152,7 +1152,7 @@ impl CatalogState {
11521152
&*MZ_TYPES,
11531153
Row::pack_slice(&[
11541154
Datum::String(&id.to_string()),
1155-
Datum::UInt32(oid),
1155+
Datum::from(oid),
11561156
Datum::String(&schema_id.to_string()),
11571157
Datum::String(name),
11581158
Datum::String(&TypeCategory::from_catalog_type(&typ.details.typ).to_string()),
@@ -1179,7 +1179,7 @@ impl CatalogState {
11791179
if mods.is_empty() {
11801180
packer.push(Datum::Null);
11811181
} else {
1182-
packer.push_list(mods.iter().map(|m| Datum::Int64(*m)));
1182+
packer.push_list(mods.iter().map(|m| Datum::Int(*m)));
11831183
}
11841184
}
11851185

@@ -1229,8 +1229,8 @@ impl CatalogState {
12291229
&*MZ_TYPE_PG_METADATA,
12301230
Row::pack_slice(&[
12311231
Datum::String(&id.to_string()),
1232-
Datum::UInt32(pg_metadata.typinput_oid),
1233-
Datum::UInt32(pg_metadata.typreceive_oid),
1232+
Datum::from(pg_metadata.typinput_oid),
1233+
Datum::from(pg_metadata.typreceive_oid),
12341234
]),
12351235
diff,
12361236
));
@@ -1274,7 +1274,7 @@ impl CatalogState {
12741274
&*MZ_FUNCTIONS,
12751275
Row::pack_slice(&[
12761276
Datum::String(&id.to_string()),
1277-
Datum::UInt32(func_impl_details.oid),
1277+
Datum::from(func_impl_details.oid),
12781278
Datum::String(&schema_id.to_string()),
12791279
Datum::String(name),
12801280
arg_type_ids,
@@ -1300,10 +1300,10 @@ impl CatalogState {
13001300
updates.push(BuiltinTableUpdate::row(
13011301
&*MZ_AGGREGATES,
13021302
Row::pack_slice(&[
1303-
Datum::UInt32(func_impl_details.oid),
1303+
Datum::from(func_impl_details.oid),
13041304
// TODO(database-issues#1064): Support ordered-set aggregate functions.
13051305
Datum::String("n"),
1306-
Datum::Int16(0),
1306+
Datum::Int(0),
13071307
]),
13081308
diff,
13091309
));
@@ -1339,7 +1339,7 @@ impl CatalogState {
13391339
BuiltinTableUpdate::row(
13401340
&*MZ_OPERATORS,
13411341
Row::pack_slice(&[
1342-
Datum::UInt32(func_impl_details.oid),
1342+
Datum::from(func_impl_details.oid),
13431343
Datum::String(operator),
13441344
arg_type_ids,
13451345
Datum::from(
@@ -1390,7 +1390,7 @@ impl CatalogState {
13901390
Ok(BuiltinTableUpdate::row(
13911391
&*MZ_AUDIT_EVENTS,
13921392
Row::pack_slice(&[
1393-
Datum::UInt64(id),
1393+
Datum::UInt(id),
13941394
Datum::String(&format!("{}", event_type)),
13951395
Datum::String(&format!("{}", object_type)),
13961396
details,
@@ -1411,9 +1411,9 @@ impl CatalogState {
14111411
) -> BuiltinTableUpdate<&'static BuiltinTable> {
14121412
let id = &MZ_STORAGE_USAGE_BY_SHARD;
14131413
let row = Row::pack_slice(&[
1414-
Datum::UInt64(event.id),
1414+
Datum::UInt(event.id),
14151415
Datum::from(event.shard_id.as_deref()),
1416-
Datum::UInt64(event.size_bytes),
1416+
Datum::UInt(event.size_bytes),
14171417
Datum::TimestampTz(
14181418
mz_ore::now::to_datetime(event.collection_timestamp)
14191419
.try_into()
@@ -1431,7 +1431,7 @@ impl CatalogState {
14311431
let addr = ip.network();
14321432
let row = Row::pack_slice(&[
14331433
Datum::String(&addr.to_string()),
1434-
Datum::Int32(ip.prefix_len().into()),
1434+
Datum::Int(ip.prefix_len().into()),
14351435
Datum::String(&format!("{}/{}", addr, ip.prefix_len())),
14361436
]);
14371437
Ok(BuiltinTableUpdate::row(id, row, Diff::ONE))
@@ -1550,7 +1550,7 @@ impl CatalogState {
15501550
&*MZ_SESSIONS,
15511551
Row::pack_slice(&[
15521552
Datum::Uuid(conn.uuid()),
1553-
Datum::UInt32(conn.conn_id().unhandled()),
1553+
Datum::from(conn.conn_id().unhandled()),
15541554
Datum::String(&conn.authenticated_role_id().to_string()),
15551555
Datum::from(conn.client_ip().map(|ip| ip.to_string()).as_deref()),
15561556
Datum::TimestampTz(connect_dt.try_into().expect("must fit")),
@@ -1611,7 +1611,7 @@ impl CatalogState {
16111611
// TODO(parkmycar): https://github.com/MaterializeInc/database-issues/issues/6711.
16121612
let pos =
16131613
i32::try_from(pos).expect("we constrain this value in the planning layer");
1614-
Datum::Int32(pos)
1614+
Datum::from(pos)
16151615
}
16161616
None => Datum::Null,
16171617
};

src/adapter/src/coord/message_handler.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,7 @@ impl Coordinator {
597597
let new_row = Row::pack_slice(&[
598598
Datum::String(replica_id),
599599
Datum::String(object_id),
600-
Datum::Int64(size),
600+
Datum::Int(size),
601601
collection_datum,
602602
Datum::from(hydration_complete),
603603
]);
@@ -986,7 +986,7 @@ impl Coordinator {
986986
};
987987
let row = Row::pack_slice(&[
988988
Datum::String(&event.replica_id.to_string()),
989-
Datum::UInt64(event.process_id),
989+
Datum::UInt(event.process_id),
990990
Datum::String(event.status.as_kebab_case_str()),
991991
Datum::from(offline_reason.as_deref()),
992992
Datum::TimestampTz(event.time.try_into().expect("must fit")),

src/adapter/src/coord/statement_logging.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ impl Coordinator {
361361
.statement_logging
362362
.throttling_state
363363
.get_throttled_count();
364-
mpsh_packer.push(Datum::UInt64(CastFrom::cast_from(throttled_count)));
364+
mpsh_packer.push(Datum::UInt(CastFrom::cast_from(throttled_count)));
365365

366366
let sql_row = Row::pack([
367367
Datum::TimestampTz(

src/adapter/src/optimize/dataflows.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -729,9 +729,9 @@ fn eval_unmaterializable_func(
729729
.human_version(state.config().helm_chart_version.clone()),
730730
)),
731731
UnmaterializableFunc::MzVersionNum => {
732-
pack(Datum::Int32(state.config().build_info.version_num()))
732+
pack(Datum::from(state.config().build_info.version_num()))
733733
}
734-
UnmaterializableFunc::PgBackendPid => pack(Datum::Int32(i32::reinterpret_cast(
734+
UnmaterializableFunc::PgBackendPid => pack(Datum::from(i32::reinterpret_cast(
735735
session.conn_id().unhandled(),
736736
))),
737737
UnmaterializableFunc::PgPostmasterStartTime => {

src/adapter/src/statement_logging.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ impl StatementLoggingFrontend {
542542
// Read throttled_count from shared state
543543
let throttled_count = self.throttling_state.get_throttled_count();
544544

545-
mpsh_packer.push(Datum::UInt64(CastFrom::cast_from(throttled_count)));
545+
mpsh_packer.push(Datum::UInt(CastFrom::cast_from(throttled_count)));
546546

547547
prepared_statement_event = Some(PreparedStatementEvent {
548548
prepared_statement: mpsh_row,
@@ -895,7 +895,7 @@ pub(crate) fn pack_statement_execution_inner(
895895
packer.extend([
896896
Datum::String(&*transaction_isolation),
897897
(*execution_timestamp).into(),
898-
Datum::UInt64(*transaction_id),
898+
Datum::UInt(*transaction_id),
899899
match &transient_index_id {
900900
None => Datum::Null,
901901
Some(transient_index_id) => Datum::String(transient_index_id),

src/arrow-util/src/builder.rs

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -908,13 +908,22 @@ impl ArrowColumn {
908908
(s, Datum::Null) => s.append_null(),
909909
(ColBuilder::BooleanBuilder(builder), Datum::False) => builder.append_value(false),
910910
(ColBuilder::BooleanBuilder(builder), Datum::True) => builder.append_value(true),
911-
(ColBuilder::Int16Builder(builder), Datum::Int16(i)) => builder.append_value(i),
912-
(ColBuilder::Int32Builder(builder), Datum::Int32(i)) => builder.append_value(i),
913-
(ColBuilder::Int64Builder(builder), Datum::Int64(i)) => builder.append_value(i),
914-
(ColBuilder::UInt8Builder(builder), Datum::UInt8(i)) => builder.append_value(i),
915-
(ColBuilder::UInt16Builder(builder), Datum::UInt16(i)) => builder.append_value(i),
916-
(ColBuilder::UInt32Builder(builder), Datum::UInt32(i)) => builder.append_value(i),
917-
(ColBuilder::UInt64Builder(builder), Datum::UInt64(i)) => builder.append_value(i),
911+
// Egress guardrail: the builder variant was chosen upstream from the
912+
// source column's `SqlScalarType`, so the unified `Datum::Int`/`UInt`
913+
// is narrowed to it here.
914+
(ColBuilder::Int16Builder(builder), Datum::Int(i)) => {
915+
builder.append_value(i16::try_from(i).expect("int16 out of range"))
916+
}
917+
(ColBuilder::UInt8Builder(builder), Datum::UInt(i)) => {
918+
builder.append_value(u8::try_from(i).expect("uint8 out of range"))
919+
}
920+
(ColBuilder::UInt16Builder(builder), Datum::UInt(i)) => {
921+
builder.append_value(u16::try_from(i).expect("uint16 out of range"))
922+
}
923+
(ColBuilder::UInt32Builder(builder), Datum::UInt(i)) => {
924+
builder.append_value(u32::try_from(i).expect("uint32 out of range"))
925+
}
926+
(ColBuilder::UInt64Builder(builder), Datum::UInt(i)) => builder.append_value(i),
918927
(ColBuilder::Float32Builder(builder), Datum::Float32(f)) => builder.append_value(*f),
919928
(ColBuilder::Float64Builder(builder), Datum::Float64(f)) => builder.append_value(*f),
920929
(ColBuilder::Date32Builder(builder), Datum::Date(d)) => {
@@ -947,20 +956,23 @@ impl ArrowColumn {
947956
(ColBuilder::UInt64Builder(builder), Datum::MzTimestamp(ts)) => {
948957
builder.append_value(ts.into())
949958
}
950-
// Lossless unsigned-to-signed promotions for destinations that don't
951-
// support unsigned types (e.g., Iceberg).
952-
(ColBuilder::Int32Builder(builder), Datum::UInt16(i)) => {
953-
builder.append_value(i32::from(i))
959+
// Int32/Int64 destinations accept signed values directly and also
960+
// serve as lossless promotion targets for unsigned source columns
961+
// (e.g. Iceberg, which has no unsigned or narrow integer types). The
962+
// routing decision (which source width lands in which builder) was
963+
// made upstream when the `ColBuilder` was constructed, so the lost
964+
// source-width distinction is immaterial here.
965+
(ColBuilder::Int32Builder(builder), Datum::Int(i)) => {
966+
builder.append_value(i32::try_from(i).expect("int32 out of range"))
954967
}
955-
// Lossless signed-to-signed widening for destinations that don't
956-
// support narrow integers (e.g., Iceberg has no smallint).
957-
(ColBuilder::Int32Builder(builder), Datum::Int16(i)) => {
958-
builder.append_value(i32::from(i))
968+
(ColBuilder::Int32Builder(builder), Datum::UInt(i)) => {
969+
builder.append_value(i32::try_from(i).expect("int32 out of range"))
959970
}
960-
(ColBuilder::Int64Builder(builder), Datum::UInt32(i)) => {
961-
builder.append_value(i64::from(i))
971+
(ColBuilder::Int64Builder(builder), Datum::Int(i)) => builder.append_value(i),
972+
(ColBuilder::Int64Builder(builder), Datum::UInt(i)) => {
973+
builder.append_value(i64::try_from(i).expect("int64 out of range"))
962974
}
963-
(ColBuilder::Decimal128Builder(builder), Datum::UInt64(i)) => {
975+
(ColBuilder::Decimal128Builder(builder), Datum::UInt(i)) => {
964976
builder.append_value(i128::from(i))
965977
}
966978
(ColBuilder::Decimal128Builder(builder), Datum::MzTimestamp(ts)) => {

src/arrow-util/src/reader.rs

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,8 @@ fn scalar_type_and_array_to_reader(
134134
}
135135
(SqlScalarType::Int16 | SqlScalarType::Int32 | SqlScalarType::Int64, DataType::Int8) => {
136136
let array = downcast_array::<Int8Array>(array);
137-
let cast: fn(i8) -> Datum<'static> = match scalar_type {
138-
SqlScalarType::Int16 => |x| Datum::Int16(i16::cast_from(x)),
139-
SqlScalarType::Int32 => |x| Datum::Int32(i32::cast_from(x)),
140-
SqlScalarType::Int64 => |x| Datum::Int64(i64::cast_from(x)),
141-
_ => unreachable!("checked above"),
142-
};
137+
// All signed widths unify to `Datum::Int`.
138+
let cast: fn(i8) -> Datum<'static> = |x| Datum::Int(i64::cast_from(x));
143139
Ok(ColReader::Int8 { array, cast })
144140
}
145141
(SqlScalarType::Int16, DataType::Int16) => {
@@ -156,12 +152,8 @@ fn scalar_type_and_array_to_reader(
156152
DataType::UInt8,
157153
) => {
158154
let array = downcast_array::<UInt8Array>(array);
159-
let cast: fn(u8) -> Datum<'static> = match scalar_type {
160-
SqlScalarType::UInt16 => |x| Datum::UInt16(u16::cast_from(x)),
161-
SqlScalarType::UInt32 => |x| Datum::UInt32(u32::cast_from(x)),
162-
SqlScalarType::UInt64 => |x| Datum::UInt64(u64::cast_from(x)),
163-
_ => unreachable!("checked above"),
164-
};
155+
// All unsigned widths unify to `Datum::UInt`.
156+
let cast: fn(u8) -> Datum<'static> = |x| Datum::UInt(u64::cast_from(x));
165157
Ok(ColReader::UInt8 { array, cast })
166158
}
167159
(SqlScalarType::UInt16, DataType::UInt16) => {
@@ -570,30 +562,30 @@ impl ColReader {
570562
ColReader::Int16(array) => array
571563
.is_valid(idx)
572564
.then(|| array.value(idx))
573-
.map(Datum::Int16),
565+
.map(|v| Datum::Int(v.into())),
574566
ColReader::Int32(array) => array
575567
.is_valid(idx)
576568
.then(|| array.value(idx))
577-
.map(Datum::Int32),
569+
.map(|v| Datum::Int(v.into())),
578570
ColReader::Int64(array) => array
579571
.is_valid(idx)
580572
.then(|| array.value(idx))
581-
.map(Datum::Int64),
573+
.map(Datum::Int),
582574
ColReader::UInt8 { array, cast } => {
583575
array.is_valid(idx).then(|| array.value(idx)).map(cast)
584576
}
585577
ColReader::UInt16(array) => array
586578
.is_valid(idx)
587579
.then(|| array.value(idx))
588-
.map(Datum::UInt16),
580+
.map(|v| Datum::UInt(v.into())),
589581
ColReader::UInt32(array) => array
590582
.is_valid(idx)
591583
.then(|| array.value(idx))
592-
.map(Datum::UInt32),
584+
.map(|v| Datum::UInt(v.into())),
593585
ColReader::UInt64(array) => array
594586
.is_valid(idx)
595587
.then(|| array.value(idx))
596-
.map(Datum::UInt64),
588+
.map(Datum::UInt),
597589
ColReader::Float16 { array, cast } => {
598590
array.is_valid(idx).then(|| array.value(idx)).map(cast)
599591
}

src/catalog/src/expr_cache.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -781,7 +781,7 @@ mod tests {
781781
LocalExpressions {
782782
local_mir: OptimizedMirRelationExpr(MirRelationExpr::constant(
783783
vec![vec![datum]],
784-
ReprRelationType::new(vec![ReprScalarType::UInt64.nullable(false)]),
784+
ReprRelationType::new(vec![ReprScalarType::UInt.nullable(false)]),
785785
)),
786786
optimizer_features: Default::default(),
787787
}

0 commit comments

Comments
 (0)