This is an automated email from the ASF dual-hosted git repository. wuweijie pushed a commit to branch opengauss_adapt in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
commit 7b8746c32ef1dca3f53e73e5a37a2f3052c23f2f Author: justbk2015 <[email protected]> AuthorDate: Tue Jun 1 20:38:33 2021 +0800 add jdbc:opengauss supoort (#10601) --- .../dialect/OpenGaussDataSourceMetaData.java | 2 +- .../dialect/OpenGaussTableMetaDataLoader.java | 144 +++++++++++++++++++++ ...a.schema.builder.spi.DialectTableMetaDataLoader | 1 + .../optimize/context/OptimizeContextFactory.java | 4 +- .../jdbc/recognizer/impl/OpenGaussRecognizer.java | 44 +++++++ ...aussStatementMemoryStrictlyFetchSizeSetter.java | 39 ++++++ ...ion.jdbc.recognizer.spi.JDBCDriverURLRecognizer | 1 + ...tatement.StatementMemoryStrictlyFetchSizeSetter | 1 + .../src/main/resources/conf/config-sharding.yaml | 4 +- .../postgresql/OpenGaussFrontendEngine.java | 56 ++++++++ ...oxy.frontend.spi.DatabaseProtocolFrontendEngine | 1 + .../postgresql/parser/OpenGaussParserFacade.java | 43 ++++++ .../facade/OpenGaussFormatSQLVisitorFacade.java | 72 +++++++++++ .../facade/OpenGaussStatementSQLVisitorFacade.java | 77 +++++++++++ ...e.shardingsphere.sql.parser.spi.SQLParserFacade | 1 + ....shardingsphere.sql.parser.spi.SQLVisitorFacade | 2 + .../xa/jta/connection/XAConnectionFactory.java | 1 + .../dialect/OpenGaussXADataSourceDefinition.java | 39 ++++++ ...ta.datasource.properties.XADataSourceDefinition | 1 + 19 files changed, 529 insertions(+), 4 deletions(-) diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/database/metadata/dialect/OpenGaussDataSourceMetaData.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/database/metadata/dialect/OpenGaussDataSourceMetaData.java index 84974b3..b9837e6 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/database/metadata/dialect/OpenGaussDataSourceMetaData.java +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/database/metadata/dialect/OpenGaussDataSourceMetaData.java @@ -42,7 +42,7 @@ public final class OpenGaussDataSourceMetaData implements DataSourceMetaData { private final String schema; // TODO fix OpenGauss's url pattern - private final Pattern pattern = Pattern.compile("jdbc:openguass://([\\w\\-\\.]+):?([0-9]*),?.*?/([\\w\\-]+)?\\S*", Pattern.CASE_INSENSITIVE); + private final Pattern pattern = Pattern.compile("jdbc:opengauss://([\\w\\-\\.]+):?([0-9]*),?.*?/([\\w\\-]+)?\\S*", Pattern.CASE_INSENSITIVE); public OpenGaussDataSourceMetaData(final String url) { Matcher matcher = pattern.matcher(url); diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/OpenGaussTableMetaDataLoader.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/OpenGaussTableMetaDataLoader.java new file mode 100644 index 0000000..9346b5a --- /dev/null +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/loader/dialect/OpenGaussTableMetaDataLoader.java @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.metadata.schema.builder.loader.dialect; + +import org.apache.shardingsphere.infra.metadata.schema.builder.loader.DataTypeLoader; +import org.apache.shardingsphere.infra.metadata.schema.builder.spi.DialectTableMetaDataLoader; +import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData; +import org.apache.shardingsphere.infra.metadata.schema.model.IndexMetaData; +import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * Table meta data loader for OpenGauss. + */ +public final class OpenGaussTableMetaDataLoader implements DialectTableMetaDataLoader { + + private static final String BASIC_TABLE_META_DATA_SQL = "SELECT table_name, column_name, data_type, udt_name, column_default FROM information_schema.columns WHERE table_schema = ?"; + + private static final String TABLE_META_DATA_SQL_WITH_EXISTED_TABLES = BASIC_TABLE_META_DATA_SQL + " AND table_name NOT IN (%s)"; + + private static final String PRIMARY_KEY_META_DATA_SQL = "SELECT tc.table_name, kc.column_name FROM information_schema.table_constraints tc" + + " JOIN information_schema.key_column_usage kc" + + " ON kc.table_schema = tc.table_schema AND kc.table_name = tc.table_name AND kc.constraint_name = tc.constraint_name" + + " WHERE tc.constraint_type = 'PRIMARY KEY' AND kc.ordinal_position IS NOT NULL AND kc.table_schema = ?"; + + private static final String BASIC_INDEX_META_DATA_SQL = "SELECT tablename, indexname FROM pg_indexes WHERE schemaname = ?"; + + @Override + public Map<String, TableMetaData> load(final DataSource dataSource, final Collection<String> existedTables) throws SQLException { + Map<String, TableMetaData> result = new LinkedHashMap<>(); + Map<String, Collection<IndexMetaData>> indexMetaDataMap = loadIndexMetaDataMap(dataSource); + for (Entry<String, Collection<ColumnMetaData>> entry : loadColumnMetaDataMap(dataSource, existedTables).entrySet()) { + Collection<IndexMetaData> indexMetaDataList = indexMetaDataMap.get(entry.getKey()); + if (null == indexMetaDataList) { + indexMetaDataList = Collections.emptyList(); + } + result.put(entry.getKey(), new TableMetaData(entry.getValue(), indexMetaDataList)); + } + return result; + } + + private Map<String, Collection<ColumnMetaData>> loadColumnMetaDataMap(final DataSource dataSource, final Collection<String> existedTables) throws SQLException { + Map<String, Collection<ColumnMetaData>> result = new HashMap<>(); + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(getTableMetaDataSQL(existedTables))) { + Map<String, Integer> dataTypes = DataTypeLoader.load(connection.getMetaData()); + Set<String> primaryKeys = loadPrimaryKeys(connection); + preparedStatement.setString(1, connection.getSchema()); + try (ResultSet resultSet = preparedStatement.executeQuery()) { + while (resultSet.next()) { + String tableName = resultSet.getString("table_name"); + Collection<ColumnMetaData> columns = result.computeIfAbsent(tableName, key -> new LinkedList<>()); + ColumnMetaData columnMetaData = loadColumnMetaData(dataTypes, primaryKeys, resultSet); + columns.add(columnMetaData); + } + } + } + return result; + } + + private Set<String> loadPrimaryKeys(final Connection connection) throws SQLException { + Set<String> result = new HashSet<>(); + try (PreparedStatement preparedStatement = connection.prepareStatement(PRIMARY_KEY_META_DATA_SQL)) { + preparedStatement.setString(1, connection.getSchema()); + try (ResultSet resultSet = preparedStatement.executeQuery()) { + while (resultSet.next()) { + String tableName = resultSet.getString("table_name"); + String columnName = resultSet.getString("column_name"); + result.add(tableName + "," + columnName); + } + } + } + return result; + } + + private ColumnMetaData loadColumnMetaData(final Map<String, Integer> dataTypeMap, final Set<String> primaryKeys, final ResultSet resultSet) throws SQLException { + String tableName = resultSet.getString("table_name"); + String columnName = resultSet.getString("column_name"); + String dataType = resultSet.getString("udt_name"); + boolean isPrimaryKey = primaryKeys.contains(tableName + "," + columnName); + String columnDefault = resultSet.getString("column_default"); + boolean generated = null != columnDefault && columnDefault.startsWith("nextval("); + //TODO user defined collation which deterministic is false + boolean caseSensitive = true; + return new ColumnMetaData(columnName, dataTypeMap.get(dataType), isPrimaryKey, generated, caseSensitive); + } + + private String getTableMetaDataSQL(final Collection<String> existedTables) { + return existedTables.isEmpty() ? BASIC_TABLE_META_DATA_SQL + : String.format(TABLE_META_DATA_SQL_WITH_EXISTED_TABLES, existedTables.stream().map(each -> String.format("'%s'", each)).collect(Collectors.joining(","))); + } + + private Map<String, Collection<IndexMetaData>> loadIndexMetaDataMap(final DataSource dataSource) throws SQLException { + Map<String, Collection<IndexMetaData>> result = new HashMap<>(); + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(BASIC_INDEX_META_DATA_SQL)) { + preparedStatement.setString(1, connection.getSchema()); + try (ResultSet resultSet = preparedStatement.executeQuery()) { + while (resultSet.next()) { + String tableName = resultSet.getString("tablename"); + Collection<IndexMetaData> indexes = result.computeIfAbsent(tableName, k -> new LinkedList<>()); + String indexName = resultSet.getString("indexname"); + indexes.add(new IndexMetaData(indexName)); + } + } + } + return result; + } + + @Override + public String getDatabaseType() { + return "OpenGauss"; + } +} diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.schema.builder.spi.DialectTableMetaDataLoader b/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.schema.builder.spi.DialectTableMetaDataLoader index 9e92eb6..4dbc8ef 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.schema.builder.spi.DialectTableMetaDataLoader +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.schema.builder.spi.DialectTableMetaDataLoader @@ -18,5 +18,6 @@ org.apache.shardingsphere.infra.metadata.schema.builder.loader.dialect.MySQLTableMetaDataLoader org.apache.shardingsphere.infra.metadata.schema.builder.loader.dialect.OracleTableMetaDataLoader org.apache.shardingsphere.infra.metadata.schema.builder.loader.dialect.PostgreSQLTableMetaDataLoader +org.apache.shardingsphere.infra.metadata.schema.builder.loader.dialect.OpenGaussTableMetaDataLoader org.apache.shardingsphere.infra.metadata.schema.builder.loader.dialect.SQLServerTableMetaDataLoader org.apache.shardingsphere.infra.metadata.schema.builder.loader.dialect.H2TableMetaDataLoader diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java index c54cb94..372a258 100644 --- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java +++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java @@ -45,6 +45,7 @@ import org.apache.shardingsphere.infra.database.type.DatabaseType; import org.apache.shardingsphere.infra.database.type.dialect.H2DatabaseType; import org.apache.shardingsphere.infra.database.type.dialect.MariaDBDatabaseType; import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType; +import org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType; import org.apache.shardingsphere.infra.database.type.dialect.OracleDatabaseType; import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType; import org.apache.shardingsphere.infra.database.type.dialect.SQL92DatabaseType; @@ -117,7 +118,8 @@ public final class OptimizeContextFactory { properties.setProperty(CONFORMANCE_CAMEL_NAME, SqlConformanceEnum.ORACLE_12.name()); return; } - if (databaseType instanceof PostgreSQLDatabaseType) { + if (databaseType instanceof PostgreSQLDatabaseType + || databaseType instanceof OpenGaussDatabaseType) { // TODO No suitable type of Lex and conformance properties.setProperty(LEX_CAMEL_NAME, Lex.MYSQL.name()); properties.setProperty(CONFORMANCE_CAMEL_NAME, SqlConformanceEnum.DEFAULT.name()); diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/recognizer/impl/OpenGaussRecognizer.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/recognizer/impl/OpenGaussRecognizer.java new file mode 100644 index 0000000..4a545c0 --- /dev/null +++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/recognizer/impl/OpenGaussRecognizer.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.proxy.backend.communication.jdbc.recognizer.impl; + +import org.apache.shardingsphere.proxy.backend.communication.jdbc.recognizer.spi.JDBCDriverURLRecognizer; + +import java.util.Collection; +import java.util.Collections; + +/** + * JDBC URL recognizer for OpenGauss. + */ +public final class OpenGaussRecognizer implements JDBCDriverURLRecognizer { + + @Override + public String getDatabaseType() { + return "OpenGauss"; + } + + @Override + public Collection<String> getURLPrefixes() { + return Collections.singletonList("jdbc:opengauss:"); + } + + @Override + public String getDriverClassName() { + return "org.postgresql.OpenGaussDriver"; + } +} diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/statement/impl/OpenGaussStatementMemoryStrictlyFetchSizeSetter.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/statement/impl/OpenGaussStatementMemoryStrictlyFetchSizeSetter.java new file mode 100644 index 0000000..0e9fbf1 --- /dev/null +++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/statement/impl/OpenGaussStatementMemoryStrictlyFetchSizeSetter.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.impl; + +import org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.StatementMemoryStrictlyFetchSizeSetter; + +import java.sql.SQLException; +import java.sql.Statement; + +/** + * Statement memory strictly fetch size setter for OpenGauss. + */ +public final class OpenGaussStatementMemoryStrictlyFetchSizeSetter implements StatementMemoryStrictlyFetchSizeSetter { + + @Override + public void setFetchSize(final Statement statement) throws SQLException { + statement.setFetchSize(1); + } + + @Override + public String getType() { + return "OpenGauss"; + } +} diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.communication.jdbc.recognizer.spi.JDBCDriverURLRecognizer b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.communication.jdbc.recognizer.spi.JDBCDriverURLRecognizer index ef113f7..3a86eb7 100644 --- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.communication.jdbc.recognizer.spi.JDBCDriverURLRecognizer +++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.communication.jdbc.recognizer.spi.JDBCDriverURLRecognizer @@ -17,6 +17,7 @@ org.apache.shardingsphere.proxy.backend.communication.jdbc.recognizer.impl.MySQLRecognizer org.apache.shardingsphere.proxy.backend.communication.jdbc.recognizer.impl.PostgreSQLRecognizer +org.apache.shardingsphere.proxy.backend.communication.jdbc.recognizer.impl.OpenGaussRecognizer org.apache.shardingsphere.proxy.backend.communication.jdbc.recognizer.impl.OracleRecognizer org.apache.shardingsphere.proxy.backend.communication.jdbc.recognizer.impl.SQLServerRecognizer org.apache.shardingsphere.proxy.backend.communication.jdbc.recognizer.impl.H2Recognizer diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.StatementMemoryStrictlyFetchSizeSetter b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.StatementMemoryStrictlyFetchSizeSetter index 1992b53..077e29e 100644 --- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.StatementMemoryStrictlyFetchSizeSetter +++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.StatementMemoryStrictlyFetchSizeSetter @@ -17,3 +17,4 @@ org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.impl.MySQLStatementMemoryStrictlyFetchSizeSetter org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.impl.PostgreSQLStatementMemoryStrictlyFetchSizeSetter +org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.impl.OpenGaussStatementMemoryStrictlyFetchSizeSetter diff --git a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/resources/conf/config-sharding.yaml b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/resources/conf/config-sharding.yaml index 621efaa..f0de349 100644 --- a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/resources/conf/config-sharding.yaml +++ b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/resources/conf/config-sharding.yaml @@ -75,7 +75,7 @@ # shardingAlgorithmName: database_inline # defaultTableStrategy: # none: -# +# # shardingAlgorithms: # database_inline: # type: INLINE @@ -89,7 +89,7 @@ # type: INLINE # props: # algorithm-expression: t_order_item_${order_id % 2} -# +# # keyGenerators: # snowflake: # type: SNOWFLAKE diff --git a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/OpenGaussFrontendEngine.java b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/OpenGaussFrontendEngine.java new file mode 100644 index 0000000..41090e1 --- /dev/null +++ b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/OpenGaussFrontendEngine.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.proxy.frontend.postgresql; + +import lombok.Getter; +import org.apache.shardingsphere.db.protocol.codec.DatabasePacketCodecEngine; +import org.apache.shardingsphere.db.protocol.postgresql.codec.PostgreSQLPacketCodecEngine; +import org.apache.shardingsphere.db.protocol.postgresql.packet.PostgreSQLPacket; +import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.binary.PostgreSQLBinaryStatementRegistry; +import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection; +import org.apache.shardingsphere.proxy.frontend.authentication.AuthenticationEngine; +import org.apache.shardingsphere.proxy.frontend.command.CommandExecuteEngine; +import org.apache.shardingsphere.proxy.frontend.context.FrontendContext; +import org.apache.shardingsphere.proxy.frontend.postgresql.authentication.PostgreSQLAuthenticationEngine; +import org.apache.shardingsphere.proxy.frontend.postgresql.command.PostgreSQLCommandExecuteEngine; +import org.apache.shardingsphere.proxy.frontend.spi.DatabaseProtocolFrontendEngine; + +/** + * Frontend engine for OpenGauss. + */ +@Getter +public final class OpenGaussFrontendEngine implements DatabaseProtocolFrontendEngine { + + private final FrontendContext frontendContext = new FrontendContext(true, false); + + private final AuthenticationEngine authenticationEngine = new PostgreSQLAuthenticationEngine(); + + private final CommandExecuteEngine commandExecuteEngine = new PostgreSQLCommandExecuteEngine(); + + private final DatabasePacketCodecEngine<PostgreSQLPacket> codecEngine = new PostgreSQLPacketCodecEngine(); + + @Override + public void release(final BackendConnection backendConnection) { + PostgreSQLBinaryStatementRegistry.getInstance().unregister(backendConnection.getConnectionId()); + } + + @Override + public String getDatabaseType() { + return "OpenGauss"; + } +} diff --git a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.frontend.spi.DatabaseProtocolFrontendEngine b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.frontend.spi.DatabaseProtocolFrontendEngine index 05657ad..4f9324e 100644 --- a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.frontend.spi.DatabaseProtocolFrontendEngine +++ b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.frontend.spi.DatabaseProtocolFrontendEngine @@ -16,3 +16,4 @@ # org.apache.shardingsphere.proxy.frontend.postgresql.PostgreSQLFrontendEngine +org.apache.shardingsphere.proxy.frontend.postgresql.OpenGaussFrontendEngine \ No newline at end of file diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/parser/OpenGaussParserFacade.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/parser/OpenGaussParserFacade.java new file mode 100644 index 0000000..cce6487 --- /dev/null +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/parser/OpenGaussParserFacade.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.sql.parser.postgresql.parser; + +import org.apache.shardingsphere.sql.parser.api.parser.SQLLexer; +import org.apache.shardingsphere.sql.parser.api.parser.SQLParser; +import org.apache.shardingsphere.sql.parser.spi.SQLParserFacade; + +/** + * SQL parser facade for OpenGauss. + */ +public final class OpenGaussParserFacade implements SQLParserFacade { + + @Override + public String getDatabaseType() { + return "OpenGauss"; + } + + @Override + public Class<? extends SQLLexer> getLexerClass() { + return PostgreSQLLexer.class; + } + + @Override + public Class<? extends SQLParser> getParserClass() { + return PostgreSQLParser.class; + } +} diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/format/facade/OpenGaussFormatSQLVisitorFacade.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/format/facade/OpenGaussFormatSQLVisitorFacade.java new file mode 100644 index 0000000..c28e787 --- /dev/null +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/format/facade/OpenGaussFormatSQLVisitorFacade.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.sql.parser.postgresql.visitor.format.facade; + +import org.apache.shardingsphere.sql.parser.api.visitor.type.DALSQLVisitor; +import org.apache.shardingsphere.sql.parser.api.visitor.type.DCLSQLVisitor; +import org.apache.shardingsphere.sql.parser.api.visitor.type.DDLSQLVisitor; +import org.apache.shardingsphere.sql.parser.api.visitor.type.DMLSQLVisitor; +import org.apache.shardingsphere.sql.parser.api.visitor.type.RLSQLVisitor; +import org.apache.shardingsphere.sql.parser.api.visitor.type.TCLSQLVisitor; +import org.apache.shardingsphere.sql.parser.spi.SQLVisitorFacade; + +/** + * Format SQL Visitor facade for OpenGauss. + */ +public final class OpenGaussFormatSQLVisitorFacade implements SQLVisitorFacade { + + @Override + public Class<? extends DMLSQLVisitor> getDMLVisitorClass() { + throw new UnsupportedOperationException(); + } + + @Override + public Class<? extends DDLSQLVisitor> getDDLVisitorClass() { + throw new UnsupportedOperationException(); + } + + @Override + public Class<? extends TCLSQLVisitor> getTCLVisitorClass() { + throw new UnsupportedOperationException(); + } + + @Override + public Class<? extends DCLSQLVisitor> getDCLVisitorClass() { + throw new UnsupportedOperationException(); + } + + @Override + public Class<? extends DALSQLVisitor> getDALVisitorClass() { + throw new UnsupportedOperationException(); + } + + @Override + public Class<? extends RLSQLVisitor> getRLVisitorClass() { + throw new UnsupportedOperationException(); + } + + @Override + public String getDatabaseType() { + return "OpenGauss"; + } + + @Override + public String getVisitorType() { + return "FORMAT"; + } +} diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/facade/OpenGaussStatementSQLVisitorFacade.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/facade/OpenGaussStatementSQLVisitorFacade.java new file mode 100644 index 0000000..a60356a --- /dev/null +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/facade/OpenGaussStatementSQLVisitorFacade.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.sql.parser.postgresql.visitor.statement.facade; + +import org.apache.shardingsphere.sql.parser.api.visitor.type.DALSQLVisitor; +import org.apache.shardingsphere.sql.parser.api.visitor.type.DCLSQLVisitor; +import org.apache.shardingsphere.sql.parser.api.visitor.type.DDLSQLVisitor; +import org.apache.shardingsphere.sql.parser.api.visitor.type.DMLSQLVisitor; +import org.apache.shardingsphere.sql.parser.api.visitor.type.RLSQLVisitor; +import org.apache.shardingsphere.sql.parser.api.visitor.type.TCLSQLVisitor; +import org.apache.shardingsphere.sql.parser.postgresql.visitor.statement.impl.PostgreSQLDALStatementSQLVisitor; +import org.apache.shardingsphere.sql.parser.postgresql.visitor.statement.impl.PostgreSQLDCLStatementSQLVisitor; +import org.apache.shardingsphere.sql.parser.postgresql.visitor.statement.impl.PostgreSQLDDLStatementSQLVisitor; +import org.apache.shardingsphere.sql.parser.postgresql.visitor.statement.impl.PostgreSQLDMLStatementSQLVisitor; +import org.apache.shardingsphere.sql.parser.postgresql.visitor.statement.impl.PostgreSQLTCLStatementSQLVisitor; +import org.apache.shardingsphere.sql.parser.spi.SQLVisitorFacade; + +/** + * Statement SQL Visitor facade for OpenGauss. + */ +public final class OpenGaussStatementSQLVisitorFacade implements SQLVisitorFacade { + + @Override + public Class<? extends DMLSQLVisitor> getDMLVisitorClass() { + return PostgreSQLDMLStatementSQLVisitor.class; + } + + @Override + public Class<? extends DDLSQLVisitor> getDDLVisitorClass() { + return PostgreSQLDDLStatementSQLVisitor.class; + } + + @Override + public Class<? extends TCLSQLVisitor> getTCLVisitorClass() { + return PostgreSQLTCLStatementSQLVisitor.class; + } + + @Override + public Class<? extends DCLSQLVisitor> getDCLVisitorClass() { + return PostgreSQLDCLStatementSQLVisitor.class; + } + + @Override + public Class<? extends DALSQLVisitor> getDALVisitorClass() { + return PostgreSQLDALStatementSQLVisitor.class; + } + + @Override + public Class<? extends RLSQLVisitor> getRLVisitorClass() { + return null; + } + + @Override + public String getDatabaseType() { + return "OpenGauss"; + } + + @Override + public String getVisitorType() { + return "STATEMENT"; + } +} diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.spi.SQLParserFacade b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.spi.SQLParserFacade index b5461a9..54ae70b 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.spi.SQLParserFacade +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.spi.SQLParserFacade @@ -16,3 +16,4 @@ # org.apache.shardingsphere.sql.parser.postgresql.parser.PostgreSQLParserFacade +org.apache.shardingsphere.sql.parser.postgresql.parser.OpenGaussParserFacade diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.spi.SQLVisitorFacade b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.spi.SQLVisitorFacade index b1fc497..611c2ec 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.spi.SQLVisitorFacade +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.spi.SQLVisitorFacade @@ -16,4 +16,6 @@ # org.apache.shardingsphere.sql.parser.postgresql.visitor.statement.facade.PostgreSQLStatementSQLVisitorFacade +org.apache.shardingsphere.sql.parser.postgresql.visitor.statement.facade.OpenGaussStatementSQLVisitorFacade org.apache.shardingsphere.sql.parser.postgresql.visitor.format.facade.PostgreSQLFormatSQLVisitorFacade +org.apache.shardingsphere.sql.parser.postgresql.visitor.format.facade.OpenGaussFormatSQLVisitorFacade diff --git a/shardingsphere-transaction/shardingsphere-transaction-2pc/shardingsphere-transaction-xa/shardingsphere-transaction-xa-core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/XAConnectionFactory.java b/shardingsphere-transaction/shardingsphere-transaction-2pc/shardingsphere-transaction-xa/shardingsphere-transaction-xa-core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/XAConnectionFactory.java index afad978..171a58e 100644 --- a/shardingsphere-transaction/shardingsphere-transaction-2pc/shardingsphere-transaction-xa/shardingsphere-transaction-xa-core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/XAConnectionFactory.java +++ b/shardingsphere-transaction/shardingsphere-transaction-2pc/shardingsphere-transaction-xa/shardingsphere-transaction-xa-core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/XAConnectionFactory.java @@ -51,6 +51,7 @@ public final class XAConnectionFactory { case "MariaDB": return new MariaDBXAConnectionWrapper().wrap(xaDataSource, connection); case "PostgreSQL": + case "OpenGauss": return new PostgreSQLXAConnectionWrapper().wrap(xaDataSource, connection); case "H2": return new H2XAConnectionWrapper().wrap(xaDataSource, connection); diff --git a/shardingsphere-transaction/shardingsphere-transaction-2pc/shardingsphere-transaction-xa/shardingsphere-transaction-xa-core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/datasource/properties/dialect/OpenGaussXADataSourceDefinition.java b/shardingsphere-transaction/shardingsphere-transaction-2pc/shardingsphere-transaction-xa/shardingsphere-transaction-xa-core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/datasource/properties/dialect/OpenGaussXADataSo [...] new file mode 100644 index 0000000..9905384 --- /dev/null +++ b/shardingsphere-transaction/shardingsphere-transaction-2pc/shardingsphere-transaction-xa/shardingsphere-transaction-xa-core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/datasource/properties/dialect/OpenGaussXADataSourceDefinition.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.transaction.xa.jta.datasource.properties.dialect; + +import org.apache.shardingsphere.transaction.xa.jta.datasource.properties.XADataSourceDefinition; + +import java.util.Collection; +import java.util.Collections; + +/** + * XA data source definition for PostgreSQL. + */ +public final class OpenGaussXADataSourceDefinition implements XADataSourceDefinition { + + @Override + public String getDatabaseType() { + return "OpenGauss"; + } + + @Override + public Collection<String> getXADriverClassName() { + return Collections.singletonList("org.postgresql.xa.PGXADataSource"); + } +} diff --git a/shardingsphere-transaction/shardingsphere-transaction-2pc/shardingsphere-transaction-xa/shardingsphere-transaction-xa-core/src/main/resources/META-INF/services/org.apache.shardingsphere.transaction.xa.jta.datasource.properties.XADataSourceDefinition b/shardingsphere-transaction/shardingsphere-transaction-2pc/shardingsphere-transaction-xa/shardingsphere-transaction-xa-core/src/main/resources/META-INF/services/org.apache.shardingsphere.transaction.xa.jta.datasource.properties.X [...] index fc31195..6e707a8 100644 --- a/shardingsphere-transaction/shardingsphere-transaction-2pc/shardingsphere-transaction-xa/shardingsphere-transaction-xa-core/src/main/resources/META-INF/services/org.apache.shardingsphere.transaction.xa.jta.datasource.properties.XADataSourceDefinition +++ b/shardingsphere-transaction/shardingsphere-transaction-2pc/shardingsphere-transaction-xa/shardingsphere-transaction-xa-core/src/main/resources/META-INF/services/org.apache.shardingsphere.transaction.xa.jta.datasource.properties.XADataSourceDefinition @@ -18,6 +18,7 @@ org.apache.shardingsphere.transaction.xa.jta.datasource.properties.dialect.MySQLXADataSourceDefinition org.apache.shardingsphere.transaction.xa.jta.datasource.properties.dialect.MariaDBXADataSourceDefinition org.apache.shardingsphere.transaction.xa.jta.datasource.properties.dialect.PostgreSQLXADataSourceDefinition +org.apache.shardingsphere.transaction.xa.jta.datasource.properties.dialect.OpenGaussXADataSourceDefinition org.apache.shardingsphere.transaction.xa.jta.datasource.properties.dialect.OracleXADataSourceDefinition org.apache.shardingsphere.transaction.xa.jta.datasource.properties.dialect.SQLServerXADataSourceDefinition org.apache.shardingsphere.transaction.xa.jta.datasource.properties.dialect.H2XADataSourceDefinition
