in baremaps-calcite/src/main/java/org/apache/baremaps/calcite/postgres/PostgresTypeConversion.java [106:164]
public static String toPostgresTypeString(RelDataType type) {
// Handle record types (structs)
if (type.isStruct()) {
// For struct types, use JSONB in PostgreSQL
return "JSONB";
}
SqlTypeName typeName = type.getSqlTypeName();
switch (typeName) {
case INTEGER:
return "INTEGER";
case BIGINT:
return "BIGINT";
case SMALLINT:
return "SMALLINT";
case TINYINT:
return "SMALLINT";
case FLOAT:
return "REAL";
case DOUBLE:
case DECIMAL:
return "DOUBLE PRECISION";
case BOOLEAN:
return "BOOLEAN";
case VARCHAR:
case CHAR:
int precision = type.getPrecision();
if (precision == RelDataType.PRECISION_NOT_SPECIFIED) {
return "TEXT";
} else {
return typeName == SqlTypeName.VARCHAR
? "VARCHAR(" + precision + ")"
: "CHAR(" + precision + ")";
}
case DATE:
return "DATE";
case TIMESTAMP:
return "TIMESTAMP";
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
return "TIMESTAMP WITH TIME ZONE";
case TIME:
return "TIME";
case TIME_WITH_LOCAL_TIME_ZONE:
return "TIME WITH LOCAL TIME ZONE";
case BINARY:
case VARBINARY:
return "BYTEA";
case GEOMETRY:
return "GEOMETRY";
case ARRAY:
return toPostgresTypeString(type.getComponentType()) + "[]";
case OTHER:
// For JSON/JSONB and other types
return "JSONB";
default:
// Default to TEXT for unknown types
return "TEXT";
}
}