absl::Status TypeToProto()

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"));
  }
}