in frontend/converters/types.cc [50:179]
absl::Status TypeFromProto(
const google::spanner::v1::Type& type_pb, zetasql::TypeFactory* factory,
const zetasql::Type** type
,
std::shared_ptr<const backend::ProtoBundle> proto_bundle
) {
switch (type_pb.code()) {
case google::spanner::v1::TypeCode::BOOL: {
*type = factory->get_bool();
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::INT64: {
if (type_pb.type_annotation() == v1::TypeAnnotationCode::PG_OID) {
*type = GetPgOidType();
} else {
*type = factory->get_int64();
}
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::TIMESTAMP: {
*type = factory->get_timestamp();
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::FLOAT32: {
*type = factory->get_float();
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::FLOAT64: {
*type = factory->get_double();
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::DATE: {
*type = factory->get_date();
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::STRING: {
*type = factory->get_string();
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::BYTES: {
*type = factory->get_bytes();
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::NUMERIC: {
if (type_pb.type_annotation() == v1::TypeAnnotationCode::PG_NUMERIC) {
*type = GetPgNumericType();
} else {
*type = factory->get_numeric();
}
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::JSON: {
if (type_pb.type_annotation() == v1::TypeAnnotationCode::PG_JSONB) {
*type = GetPgJsonbType();
} else {
*type = factory->get_json();
}
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::INTERVAL: {
*type = factory->get_interval();
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::ARRAY: {
const zetasql::Type* element_type;
if (!type_pb.has_array_element_type()) {
return error::ArrayTypeMustSpecifyElementType(type_pb.DebugString());
}
ZETASQL_RETURN_IF_ERROR(TypeFromProto(type_pb.array_element_type(), factory,
&element_type
,
proto_bundle
))
<< "\nWhen parsing array element type of " << type_pb.DebugString();
ZETASQL_RETURN_IF_ERROR(factory->MakeArrayType(element_type, type))
<< "\nWhen parsing " << type_pb.DebugString();
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::STRUCT: {
std::vector<zetasql::StructField> fields;
for (int i = 0; i < type_pb.struct_type().fields_size(); ++i) {
const zetasql::Type* type;
ZETASQL_RETURN_IF_ERROR(TypeFromProto(type_pb.struct_type().fields(i).type(),
factory,
&type
,
proto_bundle
))
<< "\nWhen parsing field #" << i << " of " << type_pb.DebugString();
zetasql::StructField field(type_pb.struct_type().fields(i).name(),
type);
fields.push_back(field);
}
ZETASQL_RETURN_IF_ERROR(factory->MakeStructTypeFromVector(fields, type))
<< "\nWhen parsing " << type_pb.DebugString();
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::PROTO: {
ZETASQL_RET_CHECK_NE(proto_bundle, nullptr);
std::string proto_type_fqn = type_pb.proto_type_fqn();
ZETASQL_ASSIGN_OR_RETURN(auto descriptor,
proto_bundle->GetTypeDescriptor(proto_type_fqn));
ZETASQL_RETURN_IF_ERROR(factory->MakeProtoType(descriptor, type));
return absl::OkStatus();
}
case google::spanner::v1::TypeCode::ENUM: {
ZETASQL_RET_CHECK_NE(proto_bundle, nullptr);
std::string proto_type_fqn = type_pb.proto_type_fqn();
ZETASQL_ASSIGN_OR_RETURN(auto descriptor,
proto_bundle->GetEnumTypeDescriptor(proto_type_fqn));
ZETASQL_RETURN_IF_ERROR(factory->MakeEnumType(descriptor, type));
return absl::OkStatus();
}
default:
return error::UnspecifiedType(type_pb.DebugString());
}
}