package liquibase.datatype.core;
import java.math.BigInteger;
import java.util.Arrays;
import liquibase.database.Database;
import liquibase.database.core.*;
import liquibase.datatype.DataTypeInfo;
import liquibase.datatype.DatabaseDataType;
import liquibase.datatype.LiquibaseDataType;
import liquibase.exception.DatabaseException;
@DataTypeInfo(name="varchar", aliases = {"java.sql.Types.VARCHAR", "java.lang.String", "varchar2", "character varying"}, minParameters = 0, maxParameters = 1, priority = LiquibaseDataType.PRIORITY_DEFAULT)
public class VarcharType extends CharType {
@Override
public DatabaseDataType toDatabaseDataType(Database database) {
if (database instanceof OracleDatabase
|| (database instanceof HsqlDatabase && ((HsqlDatabase) database).isUsingOracleSyntax())) {
return new DatabaseDataType("VARCHAR2", getParameters());
}
if (database instanceof InformixDatabase && getSize() > 255) {
return new DatabaseDataType("LVARCHAR", getParameters());
}
if (database instanceof MSSQLDatabase) {
Object[] parameters = getParameters();
if (parameters.length > 0) {
String param1 = parameters[0].toString();
if (!param1.matches("\\d+")
|| new BigInteger(param1).compareTo(BigInteger.valueOf(8000L)) > 0) {
try {
if (database.getDatabaseMajorVersion() <= 8) { //2000 or earlier
return new DatabaseDataType(database.escapeDataTypeName("varchar"), "8000");
}
} catch (DatabaseException ignore) { } //assuming it is a newer version
DatabaseDataType type = new DatabaseDataType(database.escapeDataTypeName("varchar"), "MAX");
type.addAdditionalInformation(getAdditionalInformation());
return type;
}
}
if (parameters.length == 0) {
parameters = new Object[] { 1 };
} else if (parameters.length > 1) {
parameters = Arrays.copyOfRange(parameters, 0, 1);
}
DatabaseDataType type = new DatabaseDataType(database.escapeDataTypeName("varchar"), parameters);
type.addAdditionalInformation(getAdditionalInformation());
return type;
} else if (database instanceof PostgresDatabase) {
if (getParameters() != null && getParameters().length == 1 && getParameters()[0].toString().equals("2147483647")) {
DatabaseDataType type = new DatabaseDataType("CHARACTER");
type.addAdditionalInformation("VARYING");
return type;
}
}
return super.toDatabaseDataType(database);
}
//oracle
// if (columnTypeString.toUpperCase().startsWith("VARCHAR2")) {
// // Varchar2 type pattern: VARCHAR2(50 BYTE) | VARCHAR2(50 CHAR)
// returnTypeName = getVarcharType();
// if (precision != null) {
// String[] typeParams = precision.split(" ");
// returnTypeName.setFirstParameter(typeParams[0].trim());
// if (typeParams.length > 1) {
// returnTypeName.setUnit(typeParams[1]);
// }
// }
// } else if (columnTypeString.toUpperCase().startsWith("NVARCHAR2")) {
// // NVarchar2 type pattern: VARCHAR2(50 BYTE) | VARCHAR2(50 CHAR)
// returnTypeName = getNVarcharType();
// if (precision != null) {
// String[] typeParams = precision.split(" ");
// returnTypeName.setFirstParameter(typeParams[0].trim());
// if (typeParams.length > 1) {
// returnTypeName.setUnit(typeParams[1]);
// }
// }
// }
}