diff --git a/chat2db-server/chat2db-plugins/chat2db-oracle/src/main/java/ai/chat2db/plugin/oracle/OracleMetaData.java b/chat2db-server/chat2db-plugins/chat2db-oracle/src/main/java/ai/chat2db/plugin/oracle/OracleMetaData.java index ef09ce70..41012b12 100644 --- a/chat2db-server/chat2db-plugins/chat2db-oracle/src/main/java/ai/chat2db/plugin/oracle/OracleMetaData.java +++ b/chat2db-server/chat2db-plugins/chat2db-oracle/src/main/java/ai/chat2db/plugin/oracle/OracleMetaData.java @@ -106,12 +106,19 @@ public class OracleMetaData extends DefaultMetaService implements MetaData { if (CollectionUtils.isNotEmpty(tableColumns)) { Map tableColumnMap = getTableColumns(connection, databaseName, schemaName, tableName); for (TableColumn tableColumn : tableColumns) { +// String columnType = SqlUtils.removeDigits(tableColumn.getColumnType()); +// if (columnType.startsWith("TIMESTAMP")) { +// tableColumn.setColumnSize(0); +// } + TableColumn column = tableColumnMap.get(tableColumn.getName()); - tableColumn.setUnit(column.getUnit()); - tableColumn.setComment(column.getComment()); - tableColumn.setDefaultValue(column.getDefaultValue()); - tableColumn.setOrdinalPosition(column.getOrdinalPosition()); - tableColumn.setNullable(column.getNullable()); + if (column != null) { + tableColumn.setUnit(column.getUnit()); + tableColumn.setComment(column.getComment()); + tableColumn.setDefaultValue(column.getDefaultValue()); + tableColumn.setOrdinalPosition(column.getOrdinalPosition()); + tableColumn.setNullable(column.getNullable()); + } } } return tableColumns; diff --git a/chat2db-server/chat2db-plugins/chat2db-oracle/src/main/java/ai/chat2db/plugin/oracle/type/OracleColumnTypeEnum.java b/chat2db-server/chat2db-plugins/chat2db-oracle/src/main/java/ai/chat2db/plugin/oracle/type/OracleColumnTypeEnum.java index 6dcbd760..b9b19f0a 100644 --- a/chat2db-server/chat2db-plugins/chat2db-oracle/src/main/java/ai/chat2db/plugin/oracle/type/OracleColumnTypeEnum.java +++ b/chat2db-server/chat2db-plugins/chat2db-oracle/src/main/java/ai/chat2db/plugin/oracle/type/OracleColumnTypeEnum.java @@ -4,6 +4,7 @@ import ai.chat2db.spi.ColumnBuilder; import ai.chat2db.spi.enums.EditStatus; import ai.chat2db.spi.model.ColumnType; import ai.chat2db.spi.model.TableColumn; +import ai.chat2db.spi.util.SqlUtils; import com.google.common.collect.Maps; import org.apache.commons.lang3.StringUtils; @@ -61,7 +62,6 @@ public enum OracleColumnTypeEnum implements ColumnBuilder { NATIONAL_CHAR_VARYING("NATIONAL CHAR VARYING", true, false, true, false, false, false, true, true, false, true), - NATIONAL_CHARACTER("NATIONAL CHARACTER", true, false, true, false, false, false, true, true, false, true), @@ -87,12 +87,17 @@ public enum OracleColumnTypeEnum implements ColumnBuilder { SMALLINT("SMALLINT", false, false, true, false, false, false, true, true, false, false), - TIMESTAMP("TIMESTAMP", true, false, true, false, false, false, true, true, false, false), + TIMESTAMP("TIMESTAMP", false, true, true, false, false, false, true, true, false, false), - TIMESTAMP_WITH_LOCAL_TIME_ZONE("TIMESTAMP WITH LOCAL TIME ZONE", true, false, true, false, false, false, true, true, false, false), + TIMESTAMP_WITH_LOCAL_TIME_ZONE("TIMESTAMP WITH LOCAL TIME ZONE", false, true, true, false, false, false, true, true, false, false), - TIMESTAMP_WITH_TIME_ZONE("TIMESTAMP WITH TIME ZONE", true, false, true, false, false, false, true, true, false, false), + TIMESTAMP_WITH_TIME_ZONE("TIMESTAMP WITH TIME ZONE", false, true, true, false, false, false, true, true, false, false), + + + INTERVAL_YEAR_TO_MONTH("INTERVAL YEAR TO MONTH", true, false, true, false, false, false, true, true, false, false), + + INTERVAL_DAY_TO_SECOND("INTERVAL DAY TO SECOND", true, true, true, false, false, false, true, true, false, false), UROWID("UROWID", true, false, true, false, false, false, true, true, false, false), @@ -104,7 +109,7 @@ public enum OracleColumnTypeEnum implements ColumnBuilder { private ColumnType columnType; public static OracleColumnTypeEnum getByType(String dataType) { - return COLUMN_TYPE_MAP.get(dataType.toUpperCase()); + return COLUMN_TYPE_MAP.get(SqlUtils.removeDigits(dataType.toUpperCase())); } private static Map COLUMN_TYPE_MAP = Maps.newHashMap(); @@ -136,7 +141,7 @@ public enum OracleColumnTypeEnum implements ColumnBuilder { script.append(buildDataType(column, type)).append(" "); - script.append(buildDefaultValue(column,type)).append(" "); + script.append(buildDefaultValue(column, type)).append(" "); script.append(buildNullable(column, type)).append(" "); @@ -144,11 +149,11 @@ public enum OracleColumnTypeEnum implements ColumnBuilder { } - private String buildNullable(TableColumn column,OracleColumnTypeEnum type) { - if(!type.getColumnType().isSupportNullable()){ + private String buildNullable(TableColumn column, OracleColumnTypeEnum type) { + if (!type.getColumnType().isSupportNullable()) { return ""; } - if (column.getNullable()!=null && 1==column.getNullable()) { + if (column.getNullable() != null && 1 == column.getNullable()) { return "NULL"; } else { return "NOT NULL"; @@ -156,27 +161,27 @@ public enum OracleColumnTypeEnum implements ColumnBuilder { } private String buildDefaultValue(TableColumn column, OracleColumnTypeEnum type) { - if(!type.getColumnType().isSupportDefaultValue() || StringUtils.isEmpty(column.getDefaultValue())){ + if (!type.getColumnType().isSupportDefaultValue() || StringUtils.isEmpty(column.getDefaultValue())) { return ""; } - if("EMPTY_STRING".equalsIgnoreCase(column.getDefaultValue().trim())){ + if ("EMPTY_STRING".equalsIgnoreCase(column.getDefaultValue().trim())) { return StringUtils.join("DEFAULT ''"); } - if("NULL".equalsIgnoreCase(column.getDefaultValue().trim())){ + if ("NULL".equalsIgnoreCase(column.getDefaultValue().trim())) { return StringUtils.join("DEFAULT NULL"); } - return StringUtils.join("DEFAULT ",column.getDefaultValue()); + return StringUtils.join("DEFAULT ", column.getDefaultValue()); } private String buildDataType(TableColumn column, OracleColumnTypeEnum type) { String columnType = type.columnType.getTypeName(); if (Arrays.asList(CHAR, CHAR_VARYING, CHARACTER, CHARACTER_VARYING, - NVARCHAR2, VARCHAR, VARCHAR2,NATIONAL_CHAR, - NATIONAL_CHAR_VARYING,NATIONAL_CHARACTER, - NATIONAL_CHARACTER_VARYING,NCHAR,NCHAR_VARYING).contains(type)) { + NVARCHAR2, VARCHAR, VARCHAR2, NATIONAL_CHAR, + NATIONAL_CHAR_VARYING, NATIONAL_CHARACTER, + NATIONAL_CHARACTER_VARYING, NCHAR, NCHAR_VARYING).contains(type)) { StringBuilder script = new StringBuilder(); script.append(columnType); if (column.getColumnSize() != null && StringUtils.isEmpty(column.getUnit())) { @@ -187,26 +192,41 @@ public enum OracleColumnTypeEnum implements ColumnBuilder { return script.toString(); } - if (Arrays.asList(DECIMAL, FLOAT, NUMBER, UROWID,RAW,TIMESTAMP).contains(type)) { + if (Arrays.asList(DECIMAL, FLOAT, NUMBER, UROWID, RAW).contains(type)) { StringBuilder script = new StringBuilder(); script.append(columnType); if (column.getColumnSize() != null && column.getDecimalDigits() == null) { script.append("(").append(column.getColumnSize()).append(")"); - } else if (column.getColumnSize() != null && column.getDecimalDigits() != null) { + } else if (column.getColumnSize() != null && column.getDecimalDigits() != null) { script.append("(").append(column.getColumnSize()).append(",").append(column.getDecimalDigits()).append(")"); } return script.toString(); } - - if (Arrays.asList(TIMESTAMP_WITH_TIME_ZONE,TIMESTAMP_WITH_LOCAL_TIME_ZONE).contains(type)) { - StringBuilder script = new StringBuilder(); - if(column.getColumnSize() == null){ - script.append(columnType); - }else { - String [] split = columnType.split("TIMESTAMP"); - script.append("TIMESTAMP").append("(").append(column.getColumnSize()).append(")").append(split[1]); - } - return script.toString(); + if (Arrays.asList(TIMESTAMP).contains(type)) { + int decimalDigits = column.getDecimalDigits() != null ? column.getDecimalDigits() : 6; + String valueTemplate = "TIMESTAMP(%s)"; + return String.format(valueTemplate, decimalDigits); + } + if (Arrays.asList(TIMESTAMP_WITH_TIME_ZONE).contains(type)) { + int decimalDigits = column.getDecimalDigits() != null ? column.getDecimalDigits() : 6; + String valueTemplate = "TIMESTAMP(%s) WITH TIME ZONE"; + return String.format(valueTemplate, decimalDigits); + } + if (Arrays.asList(TIMESTAMP_WITH_LOCAL_TIME_ZONE).contains(type)) { + int decimalDigits = column.getDecimalDigits() != null ? column.getDecimalDigits() : 6; + String valueTemplate = "TIMESTAMP(%s) WITH LOCAL TIME ZONE"; + return String.format(valueTemplate, decimalDigits); + } + if (Arrays.asList(INTERVAL_DAY_TO_SECOND).contains(type)) { + int columnSize = column.getColumnSize() != null ? column.getColumnSize() : 2; + int decimalDigits = column.getDecimalDigits() != null ? column.getDecimalDigits() : 6; + String valueTemplate = "INTERVAL DAY(%s) TO SECOND(%s)"; + return String.format(valueTemplate, columnSize, decimalDigits); + } + if (Arrays.asList(INTERVAL_YEAR_TO_MONTH).contains(type)) { + int columnSize = column.getColumnSize() != null ? column.getColumnSize() : 2; + String valueTemplate = "INTERVAL YEAR(%s) TO MONTH"; + return String.format(valueTemplate, columnSize); } @@ -214,30 +234,29 @@ public enum OracleColumnTypeEnum implements ColumnBuilder { } - @Override public String buildModifyColumn(TableColumn tableColumn) { if (EditStatus.DELETE.name().equals(tableColumn.getEditStatus())) { StringBuilder script = new StringBuilder(); - script.append("ALTER TABLE "). append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\""); + script.append("ALTER TABLE ").append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\""); script.append(" ").append("DROP COLUMN ").append("\"").append(tableColumn.getName()).append("\""); return script.toString(); } if (EditStatus.ADD.name().equals(tableColumn.getEditStatus())) { StringBuilder script = new StringBuilder(); - script.append("ALTER TABLE "). append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\""); + script.append("ALTER TABLE ").append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\""); script.append(" ").append("ADD (").append(buildCreateColumnSql(tableColumn)).append(")"); return script.toString(); } if (EditStatus.MODIFY.name().equals(tableColumn.getEditStatus())) { StringBuilder script = new StringBuilder(); - script.append("ALTER TABLE "). append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\""); - script.append(" ").append("MODIFY (").append(buildModifyColumnSql(tableColumn,tableColumn.getOldColumn())).append(") \n" ); + script.append("ALTER TABLE ").append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\""); + script.append(" ").append("MODIFY (").append(buildModifyColumnSql(tableColumn, tableColumn.getOldColumn())).append(") \n"); if (!StringUtils.equalsIgnoreCase(tableColumn.getOldName(), tableColumn.getName())) { script.append(";"); - script.append("ALTER TABLE "). append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\""); + script.append("ALTER TABLE ").append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\""); script.append(" ").append("RENAME COLUMN ").append("\"").append(tableColumn.getOldName()).append("\"").append(" TO ").append("\"").append(tableColumn.getName()).append("\""); } @@ -247,7 +266,7 @@ public enum OracleColumnTypeEnum implements ColumnBuilder { return ""; } - public String buildModifyColumnSql(TableColumn column,TableColumn oldColumn) { + public String buildModifyColumnSql(TableColumn column, TableColumn oldColumn) { OracleColumnTypeEnum type = COLUMN_TYPE_MAP.get(column.getColumnType().toUpperCase()); if (type == null) { return ""; @@ -258,16 +277,16 @@ public enum OracleColumnTypeEnum implements ColumnBuilder { script.append(buildDataType(column, type)).append(" "); - script.append(buildDefaultValue(column,type)).append(" "); + script.append(buildDefaultValue(column, type)).append(" "); - if(oldColumn.getNullable() != column.getNullable()) { + if (oldColumn.getNullable() != column.getNullable()) { script.append(buildNullable(column, type)).append(" "); } return script.toString(); } - public static List getTypes(){ + public static List getTypes() { return Arrays.stream(OracleColumnTypeEnum.values()).map(columnTypeEnum -> columnTypeEnum.getColumnType() ).toList(); diff --git a/chat2db-server/chat2db-server-tools/chat2db-server-tools-common/src/main/java/ai/chat2db/server/tools/common/util/EasyStringUtils.java b/chat2db-server/chat2db-server-tools/chat2db-server-tools-common/src/main/java/ai/chat2db/server/tools/common/util/EasyStringUtils.java index 016ba932..4349d163 100644 --- a/chat2db-server/chat2db-server-tools/chat2db-server-tools-common/src/main/java/ai/chat2db/server/tools/common/util/EasyStringUtils.java +++ b/chat2db-server/chat2db-server-tools/chat2db-server-tools-common/src/main/java/ai/chat2db/server/tools/common/util/EasyStringUtils.java @@ -252,4 +252,6 @@ public class EasyStringUtils { } return str; } + + } diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/util/SqlUtils.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/util/SqlUtils.java index fd244914..668d8176 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/util/SqlUtils.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/util/SqlUtils.java @@ -175,7 +175,7 @@ public class SqlUtils { try { return splitWithCreateEvent(sql, dbType); } catch (Exception e1) { - if(removeComment) { + if (removeComment) { return SQLParserUtils.splitAndRemoveComment(sql, dbType); }{ return SQLParserUtils.split(sql, dbType); @@ -341,5 +341,18 @@ public class SqlUtils { return name; } + /** + * String input = "INTERVAL DAY(2) TO SECOND(6)"; + * remove (2) and (6) + * + * @param input + * @return + */ + public static String removeDigits(String input) { + if (StringUtils.isBlank(input)) { + return input; + } + return input.replaceAll("\\(\\d+\\)", ""); + } } \ No newline at end of file