public static PGException toPGException()

in src/main/java/com/google/cloud/spanner/pgadapter/error/PGExceptionFactory.java [96:150]


  public static PGException toPGException(SpannerException spannerException) {
    if (spannerException.getErrorCode() == ErrorCode.ABORTED) {
      return PGException.newBuilder(extractMessage(spannerException))
          // This is the equivalent of an Aborted transaction error in Cloud Spanner.
          // A client should be prepared to retry this.
          .setSQLState(SQLState.SerializationFailure)
          .build();
    }
    if ((spannerException.getErrorCode() == ErrorCode.NOT_FOUND
            || spannerException.getErrorCode() == ErrorCode.INVALID_ARGUMENT)
        && COLUMN_NOT_FOUND_PATTERN.matcher(spannerException.getMessage()).find()) {
      return PGException.newBuilder(extractMessage(spannerException))
          .setSQLState(SQLState.UndefinedColumn)
          .build();
    } else if ((spannerException.getErrorCode() == ErrorCode.NOT_FOUND
            || spannerException.getErrorCode() == ErrorCode.INVALID_ARGUMENT)
        && RELATION_NOT_FOUND_PATTERN.matcher(spannerException.getMessage()).find()) {
      return PGException.newBuilder(extractMessage(spannerException))
          .setSQLState(SQLState.UndefinedTable)
          .build();
    } else if (spannerException.getErrorCode() == ErrorCode.ALREADY_EXISTS
        && (PK_VIOLATION_PATTERN.matcher(spannerException.getMessage()).find()
            || PK_VIOLATION_PATTERN_EMULATOR.matcher(spannerException.getMessage()).find()
            || UNIQUE_INDEX_VIOLATION_PATTERN.matcher(spannerException.getMessage()).find()
            || UNIQUE_INDEX_VIOLATION_PATTERN_EMULATOR
                .matcher(spannerException.getMessage())
                .find())) {
      return PGException.newBuilder(extractMessage(spannerException))
          .setSQLState(SQLState.UniqueViolation)
          .build();
    } else if (spannerException.getErrorCode() == ErrorCode.FAILED_PRECONDITION
        && (FOREIGN_KEY_VIOLATION_PATTERN_EMULATOR.matcher(spannerException.getMessage()).find()
            || FOREIGN_KEY_VIOLATION_PATTERN.matcher(spannerException.getMessage()).find())) {
      return PGException.newBuilder(extractMessage(spannerException))
          .setSQLState(SQLState.ForeignKeyViolation)
          .build();
    } else if ((spannerException.getErrorCode() == ErrorCode.FAILED_PRECONDITION
            || spannerException.getErrorCode() == ErrorCode.INVALID_ARGUMENT)
        && CANNOT_DROP_TABLE_WITH_INDICES_PATTERN.matcher(spannerException.getMessage()).find()) {
      return PGException.newBuilder(extractMessage(spannerException))
          .setSQLState(SQLState.FeatureNotSupported)
          .setHints(
              "Execute 'set spanner.support_drop_cascade=true' to enable dropping tables with indices")
          .build();
    } else if ((spannerException.getErrorCode() == ErrorCode.FAILED_PRECONDITION
            || spannerException.getErrorCode() == ErrorCode.INVALID_ARGUMENT)
        && ONLY_RESTRICT_BEHAVIOR.matcher(spannerException.getMessage()).find()) {
      return PGException.newBuilder(extractMessage(spannerException))
          .setSQLState(SQLState.FeatureNotSupported)
          .setHints(
              "Execute 'set spanner.support_drop_cascade=true' to enable 'drop {table|schema} cascade' statements.")
          .build();
    }
    return newPGException(extractMessage(spannerException));
  }