diff --git a/extensions/select_optimization.cc b/extensions/select_optimization.cc index 0f09773ae..ec99d1917 100644 --- a/extensions/select_optimization.cc +++ b/extensions/select_optimization.cc @@ -233,9 +233,15 @@ absl::StatusOr SelectQualifierFromConstant( absl::StatusOr ListIndexFromQualifier(const AttributeQualifier& qual) { int64_t value = -1; switch (qual.kind()) { - case Kind::kInt: - value = *qual.GetInt64Key(); + case Kind::kInt: { + absl::optional key = qual.GetInt64Key(); + if (!key.has_value()) { + return runtime_internal::CreateNoMatchingOverloadError( + cel::builtin::kIndex); + } + value = *key; break; + } default: // TODO(uncreated-issue/51): type-checker will reject an unsigned literal, but // should be supported as a dyn / variable. @@ -253,14 +259,38 @@ absl::StatusOr ListIndexFromQualifier(const AttributeQualifier& qual) { absl::StatusOr MapKeyFromQualifier(const AttributeQualifier& qual, google::protobuf::Arena* absl_nonnull arena) { switch (qual.kind()) { - case Kind::kInt: - return cel::IntValue(*qual.GetInt64Key()); - case Kind::kUint: - return cel::UintValue(*qual.GetUint64Key()); - case Kind::kBool: - return cel::BoolValue(*qual.GetBoolKey()); - case Kind::kString: - return StringValue::From(*qual.GetStringKey(), arena); + case Kind::kInt: { + absl::optional key = qual.GetInt64Key(); + if (!key.has_value()) { + return runtime_internal::CreateNoMatchingOverloadError( + cel::builtin::kIndex); + } + return cel::IntValue(*key); + } + case Kind::kUint: { + absl::optional key = qual.GetUint64Key(); + if (!key.has_value()) { + return runtime_internal::CreateNoMatchingOverloadError( + cel::builtin::kIndex); + } + return cel::UintValue(*key); + } + case Kind::kBool: { + absl::optional key = qual.GetBoolKey(); + if (!key.has_value()) { + return runtime_internal::CreateNoMatchingOverloadError( + cel::builtin::kIndex); + } + return cel::BoolValue(*key); + } + case Kind::kString: { + absl::optional key = qual.GetStringKey(); + if (!key.has_value()) { + return runtime_internal::CreateNoMatchingOverloadError( + cel::builtin::kIndex); + } + return StringValue::From(*key, arena); + } default: return runtime_internal::CreateNoMatchingOverloadError( cel::builtin::kIndex);