未验证 提交 5569e749 编写于 作者: S Serge Rider 提交者: GitHub

Merge pull request #9844 from dbeaver/intevalDataTypePostgres#9013

 #9013 interval data type precision and fields definition changed
......@@ -47,6 +47,8 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.maxLength.name=Leng
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.maxLength.description=If the data type specifies the type of a text or bit string, this field specifies its declared maximum length; NULL for all other data types, or if the maximum length is not declared.
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.precision.name=Precision
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.precision.description=If the data type contains a numeric type, this column contains the accuracy (declared or implicit) of the type for the target column.
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.intervalTypeField.name=Interval type
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.intervalTypeField.description=Interval type fields. If both fields and scale are specified,\n the fields must include SECOND, since the scale applies only to the seconds.
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.required.name=Not Null
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.required.description=Not Null
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.scale.name=Scale
......
......@@ -73,6 +73,7 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.precision.descripti
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.precision.name = Pr\u00E4zision
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.required.description = Nicht Null
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.required.name = Nicht Null
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.intervalTypeField.name=Intervalltyp
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.scale.description = Die Skala bestimmt die Anzahl der signifikanten Stellen rechts vom Dezimalpunkt.
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.scale.name = Skalierung
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.description.description = Kommentar
......
......@@ -66,6 +66,7 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.objectId.descriptio
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.objectId.name = ID de objeto
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.precision.name = Precisi\u00F3n
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.required.name = No Nulo
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.intervalTypeField.name=Tipo de intervalo
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.scale.name = Escala
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.description.description = Comentario
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.description.name = Descripci\u00F3n
......
......@@ -72,6 +72,7 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.required.descriptio
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.required.name = Not Null
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.scale.description = \u041C\u0430\u0441\u0448\u0442\u0430\u0431 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0447\u0438\u0441\u043B\u043E \u0437\u043D\u0430\u0447\u0430\u0449\u0438\u0445 \u0446\u0438\u0444\u0440 \u0441\u043F\u0440\u0430\u0432\u0430 \u043E\u0442 \u0434\u0435\u0441\u044F\u0442\u0438\u0447\u043D\u043E\u0439 \u0442\u043E\u0447\u043A\u0438.
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.scale.name = \u041C\u0430\u0441\u0448\u0442\u0430\u0431
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.intervalTypeField.name=\u041F\u043E\u043B\u044F \u0442\u0438\u043F\u0430 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.description.description = \u041A\u0440\u0430\u0442\u043A\u043E\u0435 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.description.name = \u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.installedVersion.description = \u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F
......
......@@ -62,6 +62,30 @@ public class PostgreUtils {
private static final int UNKNOWN_LENGTH = -1;
private static final Map<Integer, String> INTERVAL_TYPES_WITHOUT_SECOND = new HashMap<>();
private static final Map<Integer, String> INTERVAL_TYPES_WITH_SECOND = new HashMap<>();
static {
INTERVAL_TYPES_WITHOUT_SECOND.put(327679, "year");
INTERVAL_TYPES_WITHOUT_SECOND.put(196607, "month");
INTERVAL_TYPES_WITHOUT_SECOND.put(589823, "day");
INTERVAL_TYPES_WITHOUT_SECOND.put(67174399, "hour");
INTERVAL_TYPES_WITHOUT_SECOND.put(134283263, "minute");
INTERVAL_TYPES_WITHOUT_SECOND.put(268500991, "second");
INTERVAL_TYPES_WITHOUT_SECOND.put(458751, "year to month");
INTERVAL_TYPES_WITHOUT_SECOND.put(67698687, "day to hour");
INTERVAL_TYPES_WITHOUT_SECOND.put(201916415, "day to minute");
INTERVAL_TYPES_WITHOUT_SECOND.put(470351871, "day to second");
INTERVAL_TYPES_WITHOUT_SECOND.put(201392127, "hour to minute");
INTERVAL_TYPES_WITHOUT_SECOND.put(469827583, "hour to second");
INTERVAL_TYPES_WITHOUT_SECOND.put(402718719, "minute to second");
INTERVAL_TYPES_WITH_SECOND.put(268435456, "second");
INTERVAL_TYPES_WITH_SECOND.put(470286336, "day to second");
INTERVAL_TYPES_WITH_SECOND.put(469762048, "hour to second");
INTERVAL_TYPES_WITH_SECOND.put(402653184, "minute to second");
}
public static String getObjectComment(DBRProgressMonitor monitor, GenericStructContainer container, String schema, String object)
throws DBException {
try (JDBCSession session = DBUtils.openMetaSession(monitor, container, "Load PostgreSQL description")) {
......@@ -291,6 +315,18 @@ public class PostgreUtils {
}
}
public static String getIntervalField(int typeMod) {
if (INTERVAL_TYPES_WITHOUT_SECOND.containsKey(typeMod)) {
return INTERVAL_TYPES_WITHOUT_SECOND.get(typeMod);
}
for (Map.Entry<Integer, String> intervalType : INTERVAL_TYPES_WITH_SECOND.entrySet()) {
if (typeMod >= intervalType.getKey() && typeMod <= (intervalType.getKey() + 6)) {
return intervalType.getValue();
}
}
return "";
}
public static int getDisplaySize(long oid, int typmod) {
//oid = convertArrayToBaseOid(oid);
switch ((int) oid) {
......@@ -401,7 +437,9 @@ public class PostgreUtils {
case PostgreOid.INTERVAL:
if (typmod == -1)
return 6;
return typmod & 0xFFFF;
int intervalPrecision = typmod & 0xFFFF;
if (intervalPrecision == 65535) return UNKNOWN_LENGTH;
return intervalPrecision;
default:
return 0;
}
......
......@@ -72,6 +72,12 @@ public class PostgreTableColumnManager extends SQLTableColumnManager<PostgreTabl
} else {
sql.append(dataType.getFullyQualifiedName(DBPEvaluationContext.DDL));
}
getColumnDataTypeModifiers(monitor, column, sql);
};
public static StringBuilder getColumnDataTypeModifiers(DBRProgressMonitor monitor, PostgreTableColumn column, StringBuilder sql) {
final PostgreDataType dataType = column.getDataType();
final PostgreDataType rawType = null;//dataType.getElementType(monitor);
switch (dataType.getDataKind()) {
case STRING:
final long length = column.getMaxLength();
......@@ -106,6 +112,13 @@ public class PostgreTableColumnManager extends SQLTableColumnManager<PostgreTabl
sql.append('(').append(scale).append(')');
}
}
if (typeName.equals(PostgreConstants.TYPE_INTERVAL)) {
final String precision = column.getIntervalTypeField();
sql.append(' ').append(precision);
if (scale >= 0 && scale < 7) {
sql.append('(').append(scale).append(')');
}
}
}
if (PostgreUtils.isGISDataType(column.getTypeName())) {
try {
......@@ -126,7 +139,8 @@ public class PostgreTableColumnManager extends SQLTableColumnManager<PostgreTabl
if (rawType != null) {
sql.append("[]");
}
};
return sql;
}
protected final ColumnModifier<PostgreTableColumn> PostgreDefaultModifier = (monitor, column, sql, command) -> {
String defaultValue = column.getDefaultValue();
......
......@@ -30,6 +30,7 @@ import org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCDataType;
import org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTableColumn;
import org.jkiss.dbeaver.model.meta.IPropertyValueListProvider;
import org.jkiss.dbeaver.model.meta.IPropertyValueTransformer;
import org.jkiss.dbeaver.model.meta.IPropertyValueValidator;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
......@@ -62,6 +63,8 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
private boolean isLocal;
private long collationId;
private Object acl;
private long typeId;
private int typeMod;
protected PostgreAttribute(
OWNER table)
......@@ -97,6 +100,8 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
this.isLocal = source.isLocal;
this.collationId = source.collationId;
this.acl = source.acl;
this.typeId = source.typeId;
this.typeMod = source.typeMod;
}
@NotNull
......@@ -134,7 +139,7 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
setName(JDBCUtils.safeGetString(dbResult, "attname"));
setOrdinalPosition(JDBCUtils.safeGetInt(dbResult, "attnum"));
setRequired(JDBCUtils.safeGetBoolean(dbResult, "attnotnull"));
final long typeId = JDBCUtils.safeGetLong(dbResult, "atttypid");
typeId = JDBCUtils.safeGetLong(dbResult, "atttypid");
dataType = getTable().getDatabase().getDataType(monitor, typeId);
if (dataType == null) {
log.error("Attribute data type '" + typeId + "' not found. Use " + PostgreConstants.TYPE_VARCHAR);
......@@ -153,7 +158,7 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
//setTypeName(dataType.getTypeName());
setValueType(dataType.getTypeID());
setDefaultValue(JDBCUtils.safeGetString(dbResult, "def_value"));
int typeMod = JDBCUtils.safeGetInt(dbResult, "atttypmod");
typeMod = JDBCUtils.safeGetInt(dbResult, "atttypmod");
int maxLength = PostgreUtils.getAttributePrecision(typeId, typeMod);
DBPDataKind dataKind = dataType.getDataKind();
if (dataKind == DBPDataKind.NUMERIC || dataKind == DBPDataKind.DATETIME) {
......@@ -293,6 +298,22 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
return super.getDefaultValue();
}
@Property(viewable = true, order = 31, visibleIf = PostgreTableHasIntervalTypeValidator.class)
public String getIntervalTypeField() {
if (typeId == PostgreOid.INTERVAL) {
return PostgreUtils.getIntervalField(typeMod);
}
return null;
}
public long getTypeId() {
return typeId;
}
public int getTypeMod() {
return typeMod;
}
@Nullable
@Override
@Property(viewable = true, editable = true, updatable = true, multiline = true, order = 100)
......@@ -391,4 +412,12 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
}
}
}
public static class PostgreTableHasIntervalTypeValidator implements IPropertyValueValidator<PostgreAttribute, Object> {
@Override
public boolean isValidValue(PostgreAttribute object, Object value) throws IllegalArgumentException {
return object.getTypeId() == PostgreOid.INTERVAL;
}
}
}
......@@ -19,6 +19,7 @@ package org.jkiss.dbeaver.ext.postgresql.model;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.ext.postgresql.PostgreConstants;
import org.jkiss.dbeaver.ext.postgresql.edit.PostgreTableColumnManager;
import org.jkiss.dbeaver.ext.postgresql.model.data.PostgreBinaryFormatter;
import org.jkiss.dbeaver.ext.postgresql.sql.PostgreDollarQuoteRule;
import org.jkiss.dbeaver.model.DBPDataKind;
......@@ -30,6 +31,7 @@ import org.jkiss.dbeaver.model.exec.jdbc.JDBCDatabaseMetaData;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCSQLDialect;
import org.jkiss.dbeaver.model.impl.sql.BasicSQLDialect;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLDialect;
import org.jkiss.dbeaver.model.struct.DBSAttributeBase;
import org.jkiss.dbeaver.model.struct.DBSTypedObject;
......@@ -845,13 +847,9 @@ public class PostgreDialect extends JDBCSQLDialect implements TPRuleProvider {
@Override
public String getColumnTypeModifiers(@NotNull DBPDataSource dataSource, @NotNull DBSTypedObject column, @NotNull String typeName, @NotNull DBPDataKind dataKind) {
if (dataKind == DBPDataKind.DATETIME) {
{
Integer scale = column.getScale();
if (scale != null) {
return "(" + scale + ')';
}
}
StringBuilder columnModifier = PostgreTableColumnManager.getColumnDataTypeModifiers(new VoidProgressMonitor(), (PostgreTableColumn) column, new StringBuilder());
if (columnModifier.length() != 0) {
return columnModifier.toString();
}
return super.getColumnTypeModifiers(dataSource, column, typeName, dataKind);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册