diff --git a/util/src/main/java/org/killbill/billing/util/validation/dao/DatabaseSchemaSqlDao.java b/util/src/main/java/org/killbill/billing/util/validation/dao/DatabaseSchemaSqlDao.java
index 6fe55eb..bcc7095 100644
--- a/util/src/main/java/org/killbill/billing/util/validation/dao/DatabaseSchemaSqlDao.java
+++ b/util/src/main/java/org/killbill/billing/util/validation/dao/DatabaseSchemaSqlDao.java
@@ -22,6 +22,7 @@ import java.util.List;
import javax.annotation.Nullable;
+import org.killbill.billing.util.validation.DefaultColumnInfo;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.sqlobject.Bind;
import org.skife.jdbi.v2.sqlobject.SqlQuery;
@@ -29,8 +30,6 @@ import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
import org.skife.jdbi.v2.sqlobject.stringtemplate.UseStringTemplate3StatementLocator;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
-import org.killbill.billing.util.validation.DefaultColumnInfo;
-
@UseStringTemplate3StatementLocator
@RegisterMapper(DatabaseSchemaSqlDao.ColumnInfoMapper.class)
public interface DatabaseSchemaSqlDao {
@@ -46,7 +45,18 @@ public interface DatabaseSchemaSqlDao {
final String columnName = r.getString("column_name");
final Integer scale = r.getInt("numeric_scale");
final Integer precision = r.getInt("numeric_precision");
- final boolean isNullable = r.getBoolean("is_nullable");
+
+ // Special handling for PostgreSQL - the implementation of AbstractJdbc2ResultSet#getBoolean doesn't support YES/NO
+ final String isNullableString = r.getString("is_nullable");
+ final boolean isNullable;
+ if ("YES".equalsIgnoreCase(isNullableString)) {
+ isNullable = true;
+ } else if ("NO".equalsIgnoreCase(isNullableString)) {
+ isNullable = false;
+ } else {
+ isNullable = r.getBoolean("is_nullable");
+ }
+
final Integer maximumLength = r.getInt("character_maximum_length");
final String dataType = r.getString("data_type");
diff --git a/util/src/main/java/org/killbill/billing/util/validation/ValidationManager.java b/util/src/main/java/org/killbill/billing/util/validation/ValidationManager.java
index 253ed8f..2b4864f 100644
--- a/util/src/main/java/org/killbill/billing/util/validation/ValidationManager.java
+++ b/util/src/main/java/org/killbill/billing/util/validation/ValidationManager.java
@@ -140,8 +140,8 @@ public class ValidationManager {
}
private boolean isValidLengthChar(final DefaultColumnInfo columnInfo, final Object value) {
- // MySQL reports data_type as Strings, H2 as SQLTypes
- if (columnInfo.getDataType().equals("char") || columnInfo.getDataType().equals(String.valueOf(Types.CHAR))) {
+ // MySQL and PostgreSQL report data_type as Strings, H2 as SQLTypes
+ if ("char".equals(columnInfo.getDataType()) || "character".equals(columnInfo.getDataType()) || String.valueOf(Types.CHAR).equals(columnInfo.getDataType())) {
if (value == null) {
return false;
} else {