Skip to content

Commit

Permalink
0004345: Postgres array types improperly cast into non-array types (#122
Browse files Browse the repository at this point in the history
)

* 0004345: add json and jsonb column type support for PostgreSqlDmlStatement

* refactor methods for parameters appending from PostgreSqlDmlStatement

* 0004345: add array column type support for PostgreSqlDmlStatement
  • Loading branch information
boggard committed May 11, 2021
1 parent 76796b7 commit b17543d
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 28 deletions.
Expand Up @@ -118,7 +118,9 @@ public abstract class TypeMap
public static final String IMAGE = "IMAGE";
public static final String DATETIME2 = "DATETIME2";
public static final String TSVECTOR = "TSVECTOR";

public static final String JSONB = "JSONB";
public static final String JSON = "JSON";

/** Maps type names to the corresponding {@link java.sql.Types} constants. */
private static HashMap<String, Integer> _typeNameToTypeCode = new HashMap<String, Integer>();

Expand Down
Expand Up @@ -124,50 +124,61 @@ protected int[] buildTypes(Column[] keys, Column[] columns, boolean isDateOverri

@Override
protected void appendColumnParameter(StringBuilder sql, Column column) {
if (column.isTimestampWithTimezone()) {
sql.append("cast(? as timestamp with time zone)").append(",");
} else if (column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase().contains(TypeMap.UUID)) {
sql.append("cast(? as uuid)").append(",");
} else if (column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase().contains(TypeMap.VARBIT)) {
sql.append("cast(? as bit varying)").append(",");
} else if (column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase().contains(TypeMap.INTERVAL)) {
sql.append("cast(? as interval)").append(",");
String typeToCast = getTypeToCast(column);

if (typeToCast != null) {
sql.append("cast(? as ").append(typeToCast).append(")").append(",");
} else if (column.getJdbcTypeName() != null && (
column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY) ||
column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOGRAPHY))) {
sql.append("ST_GEOMFROMTEXT(?)").append(",");
} else if (column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase().contains(TypeMap.TSVECTOR)) {
sql.append("cast(? as tsvector)").append(",");
} else {
super.appendColumnParameter(sql, column);
}
}

@Override
protected void appendColumnEquals(StringBuilder sql, Column column) {
if (column.isTimestampWithTimezone()) {
sql.append(quote).append(column.getName()).append(quote)
.append(" = cast(? as timestamp with time zone)");
} else if (column.getJdbcTypeName().toUpperCase().contains(TypeMap.UUID)) {
sql.append(quote).append(column.getName()).append(quote)
.append(" = cast(? as uuid)");
} else if (column.getJdbcTypeName().toUpperCase().contains(TypeMap.VARBIT)) {
sql.append(quote).append(column.getName()).append(quote)
.append(" = cast(? as bit varying)");
} else if (column.getJdbcTypeName().toUpperCase().contains(TypeMap.INTERVAL)) {
sql.append(quote).append(column.getName()).append(quote)
.append(" = cast(? as interval)");
} else if (column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY) ||
column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOGRAPHY)) {
String typeToCast = getTypeToCast(column);

if (typeToCast != null) {
sql.append(quote).append(column.getName()).append(quote)
.append(" = ST_GEOMFROMTEXT(?)");
} else if (column.getJdbcTypeName().toUpperCase().contains(TypeMap.TSVECTOR)) {
sql.append(quote).append(column.getName()).append(quote).append(" = cast(? as tsvector)");
.append(" = cast(? as ").append(typeToCast).append(")").append(",");
} else if (column.getJdbcTypeName() != null && (
column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOMETRY) ||
column.getJdbcTypeName().toUpperCase().contains(TypeMap.GEOGRAPHY))) {
sql.append(" = ST_GEOMFROMTEXT(?)");
} else {
super.appendColumnEquals(sql, column);
}
}

private String getTypeToCast(Column column) {
String typeToCast = null;

if (column.isTimestampWithTimezone()) {
typeToCast = "timestamp with time zone";
} else if (column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase().contains(TypeMap.UUID)) {
typeToCast = "uuid";
} else if (column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase().contains(TypeMap.VARBIT)) {
typeToCast = "bit varying";
} else if (column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase().contains(TypeMap.INTERVAL)) {
typeToCast = "interval";
} else if (column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase().contains(TypeMap.TSVECTOR)) {
typeToCast = "tsvector";
} else if (column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase().contains(TypeMap.JSONB)) {
typeToCast = "json";
} else if (column.getJdbcTypeName() != null && column.getJdbcTypeName().toUpperCase().contains(TypeMap.JSON)) {
typeToCast = "json";
}

if (typeToCast != null && column.getMappedType() != null && column.getMappedType().equals(TypeMap.ARRAY)) {
typeToCast = typeToCast + "[]";
}

return typeToCast;
}

@Override
protected void appendColumnNameForSql(StringBuilder sql, Column column, boolean select) {
String columnName = column.getName();
Expand Down

0 comments on commit b17543d

Please sign in to comment.