diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties index 52227c680db05b2efc7ea2260c63ae01f7a6e856..34ef0769f22c02ca1565df9a2e6f7774cf50a0c1 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties @@ -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 diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_de.properties b/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_de.properties index 5f93d4138bf31b024bda49098480c95269907631..758552183ae826ecb337f83f31aa88c502205c8d 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_de.properties +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_de.properties @@ -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 diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_es.properties b/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_es.properties index cce9f47b8c2626a7821bdcd618ec448c106a57e8..0f9c528a6ca45eecd66e98c56002f32fc4459306 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_es.properties +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_es.properties @@ -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 diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_ru.properties b/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_ru.properties index b38710d5e23fa8aa250ed84ecd53f2e3af89a28d..464cc7239f523c35ffcea086f3d97d2d77e79a8f 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_ru.properties +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_ru.properties @@ -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 diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java index bc0292ee4a10ba75988d3f6bb22977085737b1bd..2c5cde80d5aa20f954c50702c3868ece0a081403 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java @@ -62,6 +62,30 @@ public class PostgreUtils { private static final int UNKNOWN_LENGTH = -1; + private static final Map INTERVAL_TYPES_WITHOUT_SECOND = new HashMap<>(); + private static final Map 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 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; } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java index 18b140ab674adcaf624d0ac033f541328c72ddec..2515b833c95271b17594d8115157681f176786fc 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java @@ -72,6 +72,12 @@ public class PostgreTableColumnManager extends SQLTableColumnManager= 0 && scale < 7) { + sql.append('(').append(scale).append(')'); + } + } } if (PostgreUtils.isGISDataType(column.getTypeName())) { try { @@ -126,7 +139,8 @@ public class PostgreTableColumnManager extends SQLTableColumnManager PostgreDefaultModifier = (monitor, column, sql, command) -> { String defaultValue = column.getDefaultValue(); diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreAttribute.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreAttribute.java index 5b80837f284ba36779f6dfc65874081f8112030a..b8d0b6c593f4dd743a6ffed479e1ad9d77cb7d34 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreAttribute.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreAttribute.java @@ -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 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 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 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 //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 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 } } } + + public static class PostgreTableHasIntervalTypeValidator implements IPropertyValueValidator { + + @Override + public boolean isValidValue(PostgreAttribute object, Object value) throws IllegalArgumentException { + return object.getTypeId() == PostgreOid.INTERVAL; + } + } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDialect.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDialect.java index 78731a4812f4527d97d9ca130922e005b2e217a6..c4c635ef1fca21b509a14e473053608fa7b8eb9d 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDialect.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDialect.java @@ -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); }