in frontend/converters/types.cc [181:310]
absl::Status TypeToProto(const zetasql::Type* type,
google::spanner::v1::Type* type_pb) {
switch (type->kind()) {
case zetasql::TYPE_BOOL: {
type_pb->set_code(google::spanner::v1::TypeCode::BOOL);
return absl::OkStatus();
}
case zetasql::TYPE_INT64: {
type_pb->set_code(google::spanner::v1::TypeCode::INT64);
return absl::OkStatus();
}
case zetasql::TYPE_FLOAT: {
type_pb->set_code(google::spanner::v1::TypeCode::FLOAT32);
return absl::OkStatus();
}
case zetasql::TYPE_DOUBLE: {
type_pb->set_code(google::spanner::v1::TypeCode::FLOAT64);
return absl::OkStatus();
}
case zetasql::TYPE_EXTENDED: {
auto type_code = static_cast<const postgres_translator::spangres::
datatypes::SpannerExtendedType*>(type)
->code();
switch (type_code) {
case v1::TypeAnnotationCode::PG_JSONB:
type_pb->set_code(google::spanner::v1::TypeCode::JSON);
type_pb->set_type_annotation(v1::TypeAnnotationCode::PG_JSONB);
return absl::OkStatus();
case v1::TypeAnnotationCode::PG_NUMERIC:
type_pb->set_code(google::spanner::v1::TypeCode::NUMERIC);
type_pb->set_type_annotation(v1::TypeAnnotationCode::PG_NUMERIC);
return absl::OkStatus();
case v1::TypeAnnotationCode::PG_OID:
type_pb->set_code(google::spanner::v1::TypeCode::INT64);
type_pb->set_type_annotation(v1::TypeAnnotationCode::PG_OID);
return absl::OkStatus();
default:
return error::Internal(
absl::StrCat("Unsupported ZetaSQL Extended type ",
type->DebugString(), " passed to TypeToProto"));
}
}
case zetasql::TYPE_TIMESTAMP: {
type_pb->set_code(google::spanner::v1::TypeCode::TIMESTAMP);
return absl::OkStatus();
}
case zetasql::TYPE_DATE: {
type_pb->set_code(google::spanner::v1::TypeCode::DATE);
return absl::OkStatus();
}
case zetasql::TYPE_STRING: {
type_pb->set_code(google::spanner::v1::TypeCode::STRING);
return absl::OkStatus();
}
case zetasql::TYPE_BYTES: {
type_pb->set_code(google::spanner::v1::TypeCode::BYTES);
return absl::OkStatus();
}
case zetasql::TYPE_NUMERIC: {
type_pb->set_code(google::spanner::v1::TypeCode::NUMERIC);
return absl::OkStatus();
}
case zetasql::TYPE_JSON: {
type_pb->set_code(google::spanner::v1::TypeCode::JSON);
return absl::OkStatus();
}
case zetasql::TYPE_INTERVAL: {
type_pb->set_code(google::spanner::v1::TypeCode::INTERVAL);
return absl::OkStatus();
}
case zetasql::TYPE_TOKENLIST: {
return error::ProjectTokenlistNotAllowed();
}
case zetasql::TYPE_ARRAY: {
type_pb->set_code(google::spanner::v1::TypeCode::ARRAY);
ZETASQL_RETURN_IF_ERROR(TypeToProto(type->AsArray()->element_type(),
type_pb->mutable_array_element_type()))
<< "\nWhen converting array element type of " << type->DebugString()
<< " to proto";
return absl::OkStatus();
}
case zetasql::TYPE_STRUCT: {
type_pb->set_code(google::spanner::v1::TypeCode::STRUCT);
const zetasql::StructType* struct_type = type->AsStruct();
auto struct_pb_type = type_pb->mutable_struct_type();
for (int i = 0; i < struct_type->num_fields(); ++i) {
auto field = struct_pb_type->add_fields();
field->set_name(struct_type->field(i).name);
ZETASQL_RETURN_IF_ERROR(
TypeToProto(struct_type->field(i).type, field->mutable_type()))
<< "\nWhen converting field #" << i << " of " << type->DebugString()
<< " to proto";
}
return absl::OkStatus();
}
case zetasql::TYPE_PROTO: {
const zetasql::ProtoType* proto_type = type->AsProto();
type_pb->set_code(google::spanner::v1::TypeCode::PROTO);
type_pb->set_proto_type_fqn(proto_type->descriptor()->full_name());
return absl::OkStatus();
}
case zetasql::TYPE_ENUM: {
const zetasql::EnumType* enum_type = type->AsEnum();
type_pb->set_code(google::spanner::v1::TypeCode::ENUM);
type_pb->set_proto_type_fqn(enum_type->enum_descriptor()->full_name());
return absl::OkStatus();
}
default:
return error::Internal(absl::StrCat("Unsupported ZetaSQL type ",
type->DebugString(),
" passed to TypeToProto"));
}
}