From 0180110e93f240e726e83cd0d86b9df381c312d6 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Mon, 5 Aug 2024 16:33:33 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E5=A4=9A=E9=87=8D=E5=B0=8F=E6=8B=AC=E5=8F=B7=E7=9A=84sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/utils/SqlparserUtils.java | 57 ++++++++++++------- .../io/dataease/dataset/utils/FieldUtils.java | 1 + 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/commons/utils/SqlparserUtils.java b/core/core-backend/src/main/java/io/dataease/commons/utils/SqlparserUtils.java index 13b3b32f26..bb6f9c2c38 100644 --- a/core/core-backend/src/main/java/io/dataease/commons/utils/SqlparserUtils.java +++ b/core/core-backend/src/main/java/io/dataease/commons/utils/SqlparserUtils.java @@ -101,34 +101,47 @@ public class SqlparserUtils { private static void handleFromItems(PlainSelect plainSelect, String dsType) throws Exception { FromItem fromItem = plainSelect.getFromItem(); if (fromItem instanceof ParenthesedSelect) { - if (((ParenthesedSelect) fromItem).getSelect() instanceof SetOperationList) { - StringBuilder result = new StringBuilder(); - SetOperationList setOperationList = (SetOperationList) ((ParenthesedSelect) fromItem).getSelect().getSelectBody(); - for (int i = 0; i < setOperationList.getSelects().size(); i++) { - result.append(handlePlainSelect((PlainSelect) setOperationList.getSelects().get(i), null, dsType)); - if (i < setOperationList.getSelects().size() - 1) { - result.append(" ").append(setOperationList.getOperations().get(i).toString()).append(" "); - } - } - } else { - PlainSelect selectBody = ((ParenthesedSelect) fromItem).getSelect().getPlainSelect(); - Select subSelectTmp = (Select) CCJSqlParserUtil.parse(removeVariables(selectBody.toString(), dsType)); - ((ParenthesedSelect) fromItem).setSelect(subSelectTmp.getSelectBody()); - if (dsType.equals(DatasourceConfiguration.DatasourceType.oracle.getType())) { - if (fromItem.getAlias() != null) { - fromItem.setAlias(new Alias(fromItem.getAlias().toString(), false)); - } - } else { - if (fromItem.getAlias() == null) { - throw new Exception("Failed to parse sql, Every derived table must have its own alias!"); - } - fromItem.setAlias(new Alias(fromItem.getAlias().toString(), false)); + handleParenthesedSelect(fromItem, dsType); + plainSelect.setFromItem(fromItem); + } else { + if (fromItem instanceof ParenthesedFromItem) { + fromItem = ((ParenthesedFromItem) fromItem).getFromItem(); + while (fromItem instanceof ParenthesedFromItem) { + fromItem = ((ParenthesedFromItem) fromItem).getFromItem(); } + handleParenthesedSelect(fromItem, dsType); } plainSelect.setFromItem(fromItem); } } + private static void handleParenthesedSelect(FromItem fromItem, String dsType) throws Exception { + if (((ParenthesedSelect) fromItem).getSelect() instanceof SetOperationList) { + StringBuilder result = new StringBuilder(); + SetOperationList setOperationList = (SetOperationList) ((ParenthesedSelect) fromItem).getSelect().getSelectBody(); + for (int i = 0; i < setOperationList.getSelects().size(); i++) { + result.append(handlePlainSelect((PlainSelect) setOperationList.getSelects().get(i), null, dsType)); + if (i < setOperationList.getSelects().size() - 1) { + result.append(" ").append(setOperationList.getOperations().get(i).toString()).append(" "); + } + } + } else { + PlainSelect selectBody = ((ParenthesedSelect) fromItem).getSelect().getPlainSelect(); + Select subSelectTmp = (Select) CCJSqlParserUtil.parse(removeVariables(selectBody.toString(), dsType)); + ((ParenthesedSelect) fromItem).setSelect(subSelectTmp.getSelectBody()); + if (dsType.equals(DatasourceConfiguration.DatasourceType.oracle.getType())) { + if (fromItem.getAlias() != null) { + fromItem.setAlias(new Alias(fromItem.getAlias().toString(), false)); + } + } else { + if (fromItem.getAlias() == null) { + throw new Exception("Failed to parse sql, Every derived table must have its own alias!"); + } + fromItem.setAlias(new Alias(fromItem.getAlias().toString(), false)); + } + } + } + private static void handleJoins(PlainSelect plainSelect, String dsType) throws Exception { List joins = plainSelect.getJoins(); if (joins != null) { diff --git a/core/core-backend/src/main/java/io/dataease/dataset/utils/FieldUtils.java b/core/core-backend/src/main/java/io/dataease/dataset/utils/FieldUtils.java index 1e64e177b8..913a1c4537 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/utils/FieldUtils.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/utils/FieldUtils.java @@ -30,6 +30,7 @@ public class FieldUtils { case "DATETIMEOFFSET": case "SMALLDATETIME": case "DATETIME64": + case "_TIMESTAMPTZ": return 1;// 时间 case "INT": case "SMALLINT": From 4b13d91741e7b0f7fc81a859c477723dd4ca9c8b Mon Sep 17 00:00:00 2001 From: taojinlong Date: Mon, 5 Aug 2024 17:21:17 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BD=8E=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84ck=E8=8E=B7=E5=8F=96=E8=A1=A8=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/provider/CalciteProvider.java | 21 +++++++++++++------ .../datasource/dto/DatasourceRequest.java | 1 + 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java index 94de6a954c..a6ff053f04 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java @@ -98,15 +98,18 @@ public class CalciteProvider extends Provider { @Override public List getTables(DatasourceRequest datasourceRequest) { List tables = new ArrayList<>(); - List tablesSqls = getTablesSql(datasourceRequest); - for (String tablesSql : tablesSqls) { - try (ConnectionObj con = getConnection(datasourceRequest.getDatasource()); Statement statement = getStatement(con.getConnection(), 30); ResultSet resultSet = statement.executeQuery(tablesSql)) { + + try (ConnectionObj con = getConnection(datasourceRequest.getDatasource()); Statement statement = getStatement(con.getConnection(), 30)) { + datasourceRequest.setDsVersion(con.getConnection().getMetaData().getDatabaseMajorVersion()); + List tablesSqls = getTablesSql(datasourceRequest); + for (String tablesSql : tablesSqls) { + ResultSet resultSet = statement.executeQuery(tablesSql); while (resultSet.next()) { tables.add(getTableDesc(datasourceRequest, resultSet)); } - } catch (Exception e) { - DEException.throwException(e.getMessage()); } + } catch (Exception e) { + DEException.throwException(e.getMessage()); } return tables; } @@ -237,6 +240,7 @@ public class CalciteProvider extends Provider { ResultSet resultSet = null; try (ConnectionObj con = getConnection(datasourceRequest.getDatasource()); Statement statement = getStatement(con.getConnection(), 30)) { + datasourceRequest.setDsVersion(con.getConnection().getMetaData().getDatabaseMajorVersion()); if (datasourceRequest.getDatasource().getType().equalsIgnoreCase("mongo") || datasourceRequest.getDatasource().getType().equalsIgnoreCase("doris")) { resultSet = statement.executeQuery("select * from " + table + " limit 0 offset 0 "); return fetchResultField(resultSet); @@ -1054,7 +1058,12 @@ public class CalciteProvider extends Provider { String[] databasePrams = matcher.group(3).split("\\?"); database = databasePrams[0]; } - tableSqls.add("SELECT name, comment FROM system.tables where database='DATABASE';".replace("DATABASE", database)); + if(datasourceRequest.getDsVersion() < 22){ + tableSqls.add("SELECT name, name FROM system.tables where database='DATABASE';".replace("DATABASE", database)); + }else { + tableSqls.add("SELECT name, comment FROM system.tables where database='DATABASE';".replace("DATABASE", database)); + } + break; default: diff --git a/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/DatasourceRequest.java b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/DatasourceRequest.java index 35ccb28633..1eb97c02a9 100644 --- a/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/DatasourceRequest.java +++ b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/DatasourceRequest.java @@ -15,6 +15,7 @@ public class DatasourceRequest implements Serializable { protected String query; protected String table; protected DatasourceDTO datasource; + private Integer dsVersion; private Integer pageSize; private Integer page; private Integer realSize; From a69cfc6ac56506a8c370456fb9fd7dc3455a1764 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 7 Aug 2024 09:20:45 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BD=8E=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84ck=E8=8E=B7=E5=8F=96=E8=A1=A8=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/io/dataease/dataset/utils/FieldUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-backend/src/main/java/io/dataease/dataset/utils/FieldUtils.java b/core/core-backend/src/main/java/io/dataease/dataset/utils/FieldUtils.java index 913a1c4537..1825e46bda 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/utils/FieldUtils.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/utils/FieldUtils.java @@ -31,6 +31,7 @@ public class FieldUtils { case "SMALLDATETIME": case "DATETIME64": case "_TIMESTAMPTZ": + case "TIMESTAMPTZ": return 1;// 时间 case "INT": case "SMALLINT":