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