From 9d221dee60bd918fc0727edc1e388e78bf615a77 Mon Sep 17 00:00:00 2001 From: inrgihc Date: Wed, 28 May 2025 21:49:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dsr=E6=97=A0=E4=B8=BB=E9=94=AE?= =?UTF-8?q?=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dbswitch/core/util/GenerateSqlUtils.java | 3 ++ .../doris/DorisMetadataQueryProvider.java | 28 +++++----- .../sr/StarrocksMetadataQueryProvider.java | 54 ++++++++++--------- 3 files changed, 48 insertions(+), 37 deletions(-) diff --git a/dbswitch-core/src/main/java/org/dromara/dbswitch/core/util/GenerateSqlUtils.java b/dbswitch-core/src/main/java/org/dromara/dbswitch/core/util/GenerateSqlUtils.java index 6bda3a74..a80cc3fc 100644 --- a/dbswitch-core/src/main/java/org/dromara/dbswitch/core/util/GenerateSqlUtils.java +++ b/dbswitch-core/src/main/java/org/dromara/dbswitch/core/util/GenerateSqlUtils.java @@ -81,16 +81,19 @@ public final class GenerateSqlUtils { // StarRocks 当中,字段主键的情况下,必须将字段放在最前面,并且顺序一致。 if (type.isPrimaryKeyShouldAtFirst()) { List copyFieldNames = new ArrayList<>(); + List copyPrimaryKeys = new ArrayList<>(); Integer fieldIndex = 0; for (int i = 0; i < fieldNames.size(); i++) { ColumnDescription cd = fieldNames.get(i); if (primaryKeys.contains(cd.getFieldName())) { copyFieldNames.add(fieldIndex++, cd); + copyPrimaryKeys.add(cd.getFieldName()); } else { copyFieldNames.add(cd); } } fieldNames = copyFieldNames; + pks = copyPrimaryKeys; } for (int i = 0; i < fieldNames.size(); i++) { diff --git a/dbswitch-product/dbswitch-product-doris/src/main/java/org/dromara/dbswitch/product/doris/DorisMetadataQueryProvider.java b/dbswitch-product/dbswitch-product-doris/src/main/java/org/dromara/dbswitch/product/doris/DorisMetadataQueryProvider.java index f505bcf2..76255870 100644 --- a/dbswitch-product/dbswitch-product-doris/src/main/java/org/dromara/dbswitch/product/doris/DorisMetadataQueryProvider.java +++ b/dbswitch-product/dbswitch-product-doris/src/main/java/org/dromara/dbswitch/product/doris/DorisMetadataQueryProvider.java @@ -9,14 +9,6 @@ ///////////////////////////////////////////////////////////// package org.dromara.dbswitch.product.doris; -import org.dromara.dbswitch.common.consts.Constants; -import org.dromara.dbswitch.core.provider.ProductFactoryProvider; -import org.dromara.dbswitch.core.provider.meta.AbstractMetadataProvider; -import org.dromara.dbswitch.core.schema.ColumnDescription; -import org.dromara.dbswitch.core.schema.ColumnMetaData; -import org.dromara.dbswitch.core.schema.IndexDescription; -import org.dromara.dbswitch.core.schema.SourceProperties; -import org.dromara.dbswitch.core.schema.TableDescription; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -30,6 +22,14 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.dromara.dbswitch.common.consts.Constants; +import org.dromara.dbswitch.core.provider.ProductFactoryProvider; +import org.dromara.dbswitch.core.provider.meta.AbstractMetadataProvider; +import org.dromara.dbswitch.core.schema.ColumnDescription; +import org.dromara.dbswitch.core.schema.ColumnMetaData; +import org.dromara.dbswitch.core.schema.IndexDescription; +import org.dromara.dbswitch.core.schema.SourceProperties; +import org.dromara.dbswitch.core.schema.TableDescription; @Slf4j public class DorisMetadataQueryProvider extends AbstractMetadataProvider { @@ -251,12 +251,13 @@ public class DorisMetadataQueryProvider extends AbstractMetadataProvider { String retval = " `" + fieldname + "` "; + // https://doris.apache.org/zh-CN/docs/table-design/data-type switch (type) { case ColumnMetaData.TYPE_TIMESTAMP: retval += "DATETIME"; break; case ColumnMetaData.TYPE_TIME: - retval += "TIME"; + retval += "DATETIME"; break; case ColumnMetaData.TYPE_DATE: retval += "DATE"; @@ -282,7 +283,7 @@ public class DorisMetadataQueryProvider extends AbstractMetadataProvider { // 18 significant digits retval += "BIGINT"; } else { - retval += "DECIMAL(" + length + ")"; + retval += "DECIMAL(" + (length > 38 ? 38 : length) + ")"; } } else { retval += "INT"; @@ -290,9 +291,10 @@ public class DorisMetadataQueryProvider extends AbstractMetadataProvider { } else { // Floating point values... if (length > 15) { - retval += "DECIMAL(" + length; + int p = (length > 38 ? 38 : length); + retval += "DECIMAL(" + p; if (precision > 0) { - retval += ", " + precision; + retval += ", " + (precision > p ? p : precision); } retval += ")"; } else { @@ -307,7 +309,7 @@ public class DorisMetadataQueryProvider extends AbstractMetadataProvider { case ColumnMetaData.TYPE_STRING: long newLength = length * 3; if (newLength < 255) { - retval += "CHAR(" + newLength + ")"; + retval += "VARCHAR(" + newLength + ")"; } else if (newLength < 65533) { retval += "VARCHAR(" + newLength + ")"; } else { diff --git a/dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/StarrocksMetadataQueryProvider.java b/dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/StarrocksMetadataQueryProvider.java index 54629262..d35df860 100644 --- a/dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/StarrocksMetadataQueryProvider.java +++ b/dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/StarrocksMetadataQueryProvider.java @@ -9,15 +9,6 @@ ///////////////////////////////////////////////////////////// package org.dromara.dbswitch.product.sr; -import org.dromara.dbswitch.common.consts.Constants; -import org.dromara.dbswitch.common.type.ProductTypeEnum; -import org.dromara.dbswitch.core.provider.ProductFactoryProvider; -import org.dromara.dbswitch.core.provider.meta.AbstractMetadataProvider; -import org.dromara.dbswitch.core.schema.ColumnDescription; -import org.dromara.dbswitch.core.schema.ColumnMetaData; -import org.dromara.dbswitch.core.schema.IndexDescription; -import org.dromara.dbswitch.core.schema.TableDescription; -import org.dromara.dbswitch.core.schema.SourceProperties; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -29,7 +20,17 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.dromara.dbswitch.common.consts.Constants; +import org.dromara.dbswitch.common.type.ProductTypeEnum; +import org.dromara.dbswitch.core.provider.ProductFactoryProvider; +import org.dromara.dbswitch.core.provider.meta.AbstractMetadataProvider; +import org.dromara.dbswitch.core.schema.ColumnDescription; +import org.dromara.dbswitch.core.schema.ColumnMetaData; +import org.dromara.dbswitch.core.schema.IndexDescription; +import org.dromara.dbswitch.core.schema.SourceProperties; +import org.dromara.dbswitch.core.schema.TableDescription; /** * https://docs.starrocks.io/zh/docs/3.1/quick_start/Create_table/ @@ -269,7 +270,7 @@ public class StarrocksMetadataQueryProvider extends AbstractMetadataProvider { retval += "DATETIME"; break; case ColumnMetaData.TYPE_TIME: - retval += "TIME"; + retval += "DATETIME"; break; case ColumnMetaData.TYPE_DATE: retval += "DATE"; @@ -297,7 +298,7 @@ public class StarrocksMetadataQueryProvider extends AbstractMetadataProvider { // 18 significant digits retval += "BIGINT"; } else { - retval += "DECIMAL(" + length + ")"; + retval += "DECIMAL(" + (length > 38 ? 38 : length) + ")"; } } else { retval += "INT"; @@ -305,9 +306,10 @@ public class StarrocksMetadataQueryProvider extends AbstractMetadataProvider { } else { // Floating point values... if (length > 15) { - retval += "DECIMAL(" + length; + int p = (length > 38 ? 38 : length); + retval += "DECIMAL(" + p; if (precision > 0) { - retval += ", " + precision; + retval += ", " + (precision > p ? p : precision); } retval += ")"; } else { @@ -321,21 +323,22 @@ public class StarrocksMetadataQueryProvider extends AbstractMetadataProvider { break; case ColumnMetaData.TYPE_STRING: //see: https://docs.starrocks.io/zh/docs/category/string/ - if (length <= 255) { - retval += "CHAR(" + length + ")"; - } else if (length <= 65533) { + long newLength = length * 3; + if (newLength < 255) { + retval += "VARCHAR(" + newLength + ")"; + } else if (newLength <= 65533) { retval += "STRING"; - } else if (length <= 1048576){ - retval += "VARCHAR(" + length + ")"; + } else if (newLength <= 1048576) { + retval += "VARCHAR(" + newLength + ")"; } else { - retval += "VARBINARY"; + retval += "VARCHAR(1048576)"; } break; case ColumnMetaData.TYPE_BINARY: - retval += "LONGBLOB"; + retval += "VARBINARY "; break; default: - retval += "LONGTEXT"; + retval += "VARCHAR(1048576)"; break; } @@ -363,8 +366,11 @@ public class StarrocksMetadataQueryProvider extends AbstractMetadataProvider { @Override public void postAppendCreateTableSql(StringBuilder builder, String tblComment, List primaryKeys, SourceProperties tblProperties) { - String pk = getPrimaryKeyAsString(primaryKeys); - builder.append("PRIMARY KEY (").append(pk).append(")"); - builder.append("\n DISTRIBUTED BY HASH(").append(pk).append(")"); + // https://docs.mirrorship.cn/zh/docs/table_design/table_types/primary_key_table/ + if (CollectionUtils.isNotEmpty(primaryKeys)) { + String pk = getPrimaryKeyAsString(primaryKeys); + builder.append("PRIMARY KEY (").append(pk).append(")"); + builder.append("\n DISTRIBUTED BY HASH(").append(pk).append(")"); + } } }