You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/11/01 11:01:43 UTC
[shardingsphere] branch master updated: Make SQLStatementContext always present in ServerPreparedStatement (#21877)
This is an automated email from the ASF dual-hosted git repository.
zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 7690fe01d7a Make SQLStatementContext always present in ServerPreparedStatement (#21877)
7690fe01d7a is described below
commit 7690fe01d7aa069a314a5fa41266fa4313181433
Author: 吴伟杰 <wu...@apache.org>
AuthorDate: Tue Nov 1 19:01:35 2022 +0800
Make SQLStatementContext always present in ServerPreparedStatement (#21877)
* Make SQLStatementContext always present in ServerPreparedStatement
* Complete tests
---
.../DistSQLStatementContext.java} | 43 ++++++++++------------
.../handler/ProxyBackendHandlerFactory.java | 11 +++++-
.../backend/session/ServerPreparedStatement.java | 16 ++------
.../ServerServerPreparedStatementRegistryTest.java | 12 +-----
.../mysql/command/MySQLCommandPacketFactory.java | 2 +-
.../query/binary/MySQLServerPreparedStatement.java | 11 ------
.../execute/MySQLComStmtExecuteExecutor.java | 2 +-
.../prepare/MySQLComStmtPrepareExecutor.java | 2 +-
.../command/MySQLCommandPacketFactoryTest.java | 5 ++-
.../MySQLComStmtSendLongDataExecutorTest.java | 2 +-
.../execute/MySQLComStmtExecuteExecutorTest.java | 20 +++++-----
.../prepare/MySQLComStmtPrepareExecutorTest.java | 11 ++----
.../reset/MySQLComStmtResetExecutorTest.java | 2 +-
.../bind/OpenGaussComBatchBindExecutor.java | 2 +-
.../bind/OpenGaussComBatchBindExecutorTest.java | 7 +++-
.../command/query/extended/JDBCPortal.java | 10 +----
...AggregatedBatchedStatementsCommandExecutor.java | 2 +-
.../PostgreSQLBatchedStatementsExecutor.java | 5 ++-
.../PostgreSQLServerPreparedStatement.java | 8 ----
.../describe/PostgreSQLComDescribeExecutor.java | 10 ++---
.../extended/parse/PostgreSQLComParseExecutor.java | 10 ++---
.../command/query/extended/JDBCPortalTest.java | 27 +++++++++-----
...egatedBatchedStatementsCommandExecutorTest.java | 9 ++++-
.../PostgreSQLBatchedStatementsExecutorTest.java | 5 ++-
.../bind/PostgreSQLComBindExecutorTest.java | 24 ++++++++++--
.../PostgreSQLComDescribeExecutorTest.java | 28 +++++++++++---
.../parse/PostgreSQLComParseExecutorTest.java | 14 ++++---
.../ReactiveMySQLComStmtExecuteExecutor.java | 4 +-
28 files changed, 165 insertions(+), 139 deletions(-)
diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/session/ServerPreparedStatement.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/DistSQLStatementContext.java
similarity index 50%
copy from proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/session/ServerPreparedStatement.java
copy to proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/DistSQLStatementContext.java
index 292257a0f68..f4228e2168d 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/session/ServerPreparedStatement.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/DistSQLStatementContext.java
@@ -15,36 +15,31 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.session;
+package org.apache.shardingsphere.proxy.backend.distsql;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.distsql.parser.statement.DistSQLStatement;
+import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-
-import java.util.Optional;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
/**
- * Server prepared statement for clients of ShardingSphere-Proxy.
+ * SQL statement context for DistSQL.
*/
-public interface ServerPreparedStatement {
+@RequiredArgsConstructor
+@Getter
+public final class DistSQLStatementContext implements SQLStatementContext<DistSQLStatement> {
- /**
- * Get SQL of server prepared statement.
- *
- * @return SQL
- */
- String getSql();
+ private final DistSQLStatement sqlStatement;
- /**
- * Get {@link SQLStatement} of server prepared statement.
- *
- * @return {@link SQLStatement}
- */
- SQLStatement getSqlStatement();
+ @Override
+ public TablesContext getTablesContext() {
+ throw new UnsupportedOperationException("Cannot get tables context of DistSQLStatementContext");
+ }
- /**
- * Get optional {@link SQLStatementContext} of server prepared statement.
- *
- * @return optional {@link SQLStatementContext}
- */
- Optional<SQLStatementContext<?>> getSqlStatementContext();
+ @Override
+ public DatabaseType getDatabaseType() {
+ throw new UnsupportedOperationException("Cannot get database type of DistSQLStatementContext");
+ }
}
diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
index 124d65915e8..692c2d3509c 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
@@ -104,8 +104,6 @@ public final class ProxyBackendHandlerFactory {
if (sqlStatement instanceof EmptyStatement) {
return new SkipBackendHandler(sqlStatement);
}
- databaseType.handleRollbackOnly(connectionSession.getTransactionStatus().isRollbackOnly(), sqlStatement);
- checkUnsupportedSQLStatement(sqlStatement);
if (sqlStatement instanceof DistSQLStatement) {
checkUnsupportedDistSQLStatementInTransaction(sqlStatement, connectionSession);
return DistSQLBackendHandlerFactory.newInstance((DistSQLStatement) sqlStatement, connectionSession);
@@ -132,6 +130,15 @@ public final class ProxyBackendHandlerFactory {
final boolean preferPreparedStatement) throws SQLException {
SQLStatementContext<?> sqlStatementContext = queryContext.getSqlStatementContext();
SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
+ databaseType.handleRollbackOnly(connectionSession.getTransactionStatus().isRollbackOnly(), sqlStatement);
+ checkUnsupportedSQLStatement(sqlStatement);
+ if (sqlStatement instanceof EmptyStatement) {
+ return new SkipBackendHandler(sqlStatement);
+ }
+ if (sqlStatement instanceof DistSQLStatement) {
+ checkUnsupportedDistSQLStatementInTransaction(sqlStatement, connectionSession);
+ return DistSQLBackendHandlerFactory.newInstance((DistSQLStatement) sqlStatement, connectionSession);
+ }
String sql = queryContext.getSql();
handleAutoCommit(sqlStatement, connectionSession);
if (sqlStatement instanceof TCLStatement) {
diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/session/ServerPreparedStatement.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/session/ServerPreparedStatement.java
index 292257a0f68..4465d3a8e92 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/session/ServerPreparedStatement.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/session/ServerPreparedStatement.java
@@ -18,9 +18,6 @@
package org.apache.shardingsphere.proxy.backend.session;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-
-import java.util.Optional;
/**
* Server prepared statement for clients of ShardingSphere-Proxy.
@@ -35,16 +32,9 @@ public interface ServerPreparedStatement {
String getSql();
/**
- * Get {@link SQLStatement} of server prepared statement.
- *
- * @return {@link SQLStatement}
- */
- SQLStatement getSqlStatement();
-
- /**
- * Get optional {@link SQLStatementContext} of server prepared statement.
+ * Get {@link SQLStatementContext} of server prepared statement.
*
- * @return optional {@link SQLStatementContext}
+ * @return {@link SQLStatementContext}
*/
- Optional<SQLStatementContext<?>> getSqlStatementContext();
+ SQLStatementContext<?> getSqlStatementContext();
}
diff --git a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/session/ServerServerPreparedStatementRegistryTest.java b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/session/ServerServerPreparedStatementRegistryTest.java
index e3219f15cf9..aeda58ee77d 100644
--- a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/session/ServerServerPreparedStatementRegistryTest.java
+++ b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/session/ServerServerPreparedStatementRegistryTest.java
@@ -19,14 +19,11 @@ package org.apache.shardingsphere.proxy.backend.session;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.util.exception.external.sql.type.generic.UnsupportedSQLOperationException;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import org.junit.Test;
-import java.util.Optional;
-
import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertNull;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertNull;
public final class ServerServerPreparedStatementRegistryTest {
@@ -48,12 +45,7 @@ public final class ServerServerPreparedStatementRegistryTest {
}
@Override
- public SQLStatement getSqlStatement() {
- throw new UnsupportedSQLOperationException("");
- }
-
- @Override
- public Optional<SQLStatementContext<?>> getSqlStatementContext() {
+ public SQLStatementContext<?> getSqlStatementContext() {
throw new UnsupportedSQLOperationException("");
}
}
diff --git a/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandPacketFactory.java b/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandPacketFactory.java
index ee6c6301e46..f5ec3b549d7 100644
--- a/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandPacketFactory.java
+++ b/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandPacketFactory.java
@@ -66,7 +66,7 @@ public final class MySQLCommandPacketFactory {
case COM_STMT_EXECUTE:
MySQLServerPreparedStatement serverPreparedStatement =
connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(payload.getByteBuf().getIntLE(payload.getByteBuf().readerIndex()));
- return new MySQLComStmtExecutePacket(payload, serverPreparedStatement.getSqlStatement().getParameterCount());
+ return new MySQLComStmtExecutePacket(payload, serverPreparedStatement.getSqlStatementContext().getSqlStatement().getParameterCount());
case COM_STMT_SEND_LONG_DATA:
return new MySQLComStmtSendLongDataPacket(payload);
case COM_STMT_RESET:
diff --git a/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLServerPreparedStatement.java b/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLServerPreparedStatement.java
index b11adb706f3..fded1dbfd2f 100644
--- a/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLServerPreparedStatement.java
+++ b/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLServerPreparedStatement.java
@@ -19,15 +19,12 @@ package org.apache.shardingsphere.proxy.frontend.mysql.command.query.binary;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
-import lombok.Setter;
import org.apache.shardingsphere.db.protocol.mysql.packet.command.query.binary.MySQLPreparedStatementParameterType;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.proxy.backend.session.ServerPreparedStatement;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -37,21 +34,13 @@ import java.util.concurrent.CopyOnWriteArrayList;
*/
@RequiredArgsConstructor
@Getter
-@Setter
public final class MySQLServerPreparedStatement implements ServerPreparedStatement {
private final String sql;
- private final SQLStatement sqlStatement;
-
private final SQLStatementContext<?> sqlStatementContext;
private final List<MySQLPreparedStatementParameterType> parameterTypes = new CopyOnWriteArrayList<>();
private final Map<Integer, byte[]> longData = new ConcurrentHashMap<>();
-
- @Override
- public Optional<SQLStatementContext<?>> getSqlStatementContext() {
- return Optional.of(sqlStatementContext);
- }
}
diff --git a/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java b/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
index fc51a10da12..dd471aa8c82 100644
--- a/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
+++ b/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
@@ -73,7 +73,7 @@ public final class MySQLComStmtExecuteExecutor implements QueryCommandExecutor {
MySQLServerPreparedStatement preparedStatement = updateAndGetPreparedStatement();
List<Object> parameters = packet.readParameters(preparedStatement.getParameterTypes(), preparedStatement.getLongData().keySet());
preparedStatement.getLongData().forEach(parameters::set);
- SQLStatementContext<?> sqlStatementContext = preparedStatement.getSqlStatementContext().get();
+ SQLStatementContext<?> sqlStatementContext = preparedStatement.getSqlStatementContext();
if (sqlStatementContext instanceof ParameterAware) {
((ParameterAware) sqlStatementContext).setUpParameters(parameters);
}
diff --git a/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java b/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
index b2dd59d0605..c65e20f2738 100644
--- a/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
+++ b/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
@@ -73,7 +73,7 @@ public final class MySQLComStmtPrepareExecutor implements CommandExecutor {
int statementId = MySQLStatementIDGenerator.getInstance().nextStatementId(connectionSession.getConnectionId());
SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabases(),
sqlStatement, connectionSession.getDefaultDatabaseName());
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new MySQLServerPreparedStatement(packet.getSql(), sqlStatement, sqlStatementContext));
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new MySQLServerPreparedStatement(packet.getSql(), sqlStatementContext));
return createPackets(statementId, projectionCount, sqlStatement.getParameterCount());
}
diff --git a/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandPacketFactoryTest.java b/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandPacketFactoryTest.java
index 32781c5898d..f66ce65181d 100644
--- a/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandPacketFactoryTest.java
+++ b/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandPacketFactoryTest.java
@@ -36,6 +36,7 @@ import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import org.apache.shardingsphere.proxy.backend.session.ServerPreparedStatementRegistry;
import org.apache.shardingsphere.proxy.frontend.mysql.command.query.binary.MySQLServerPreparedStatement;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLSelectStatement;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -93,7 +94,9 @@ public final class MySQLCommandPacketFactoryTest {
when(payload.getByteBuf().getIntLE(anyInt())).thenReturn(1);
ServerPreparedStatementRegistry serverPreparedStatementRegistry = new ServerPreparedStatementRegistry();
when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(serverPreparedStatementRegistry);
- serverPreparedStatementRegistry.addPreparedStatement(1, new MySQLServerPreparedStatement("select 1", new MySQLSelectStatement(), mock(SQLStatementContext.class)));
+ SQLStatementContext<SelectStatement> sqlStatementContext = mock(SQLStatementContext.class);
+ when(sqlStatementContext.getSqlStatement()).thenReturn(new MySQLSelectStatement());
+ serverPreparedStatementRegistry.addPreparedStatement(1, new MySQLServerPreparedStatement("select 1", sqlStatementContext));
assertThat(MySQLCommandPacketFactory.newInstance(MySQLCommandPacketType.COM_STMT_EXECUTE, payload, connectionSession), instanceOf(MySQLComStmtExecutePacket.class));
}
diff --git a/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLComStmtSendLongDataExecutorTest.java b/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLComStmtSendLongDataExecutorTest.java
index ba30224a160..81e9be5485b 100644
--- a/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLComStmtSendLongDataExecutorTest.java
+++ b/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLComStmtSendLongDataExecutorTest.java
@@ -44,7 +44,7 @@ public final class MySQLComStmtSendLongDataExecutorTest {
when(packet.getData()).thenReturn(data);
ConnectionSession connectionSession = mock(ConnectionSession.class);
when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(new ServerPreparedStatementRegistry());
- MySQLServerPreparedStatement preparedStatement = new MySQLServerPreparedStatement("insert into t (b) values (?)", null, mock(SQLStatementContext.class));
+ MySQLServerPreparedStatement preparedStatement = new MySQLServerPreparedStatement("insert into t (b) values (?)", mock(SQLStatementContext.class));
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(1, preparedStatement);
MySQLComStmtSendLongDataExecutor executor = new MySQLComStmtSendLongDataExecutor(packet, connectionSession);
Collection<DatabasePacket<?>> actual = executor.execute();
diff --git a/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutorTest.java b/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutorTest.java
index 0e1816fc4e9..86f2a71c437 100644
--- a/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutorTest.java
+++ b/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutorTest.java
@@ -120,12 +120,13 @@ public final class MySQLComStmtExecuteExecutorTest extends ProxyContextRestorer
when(connectionSession.getBackendConnection()).thenReturn(backendConnection);
SQLStatementContext<?> selectStatementContext = prepareSelectStatementContext();
when(connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(1))
- .thenReturn(new MySQLServerPreparedStatement("select * from tbl where id = ?", prepareSelectStatement(), selectStatementContext));
+ .thenReturn(new MySQLServerPreparedStatement("select * from tbl where id = ?", selectStatementContext));
UpdateStatementContext updateStatementContext = mock(UpdateStatementContext.class, RETURNS_DEEP_STUBS);
+ when(updateStatementContext.getSqlStatement()).thenReturn(prepareUpdateStatement());
when(connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(2))
- .thenReturn(new MySQLServerPreparedStatement("update tbl set col=1 where id = ?", prepareUpdateStatement(), updateStatementContext));
+ .thenReturn(new MySQLServerPreparedStatement("update tbl set col=1 where id = ?", updateStatementContext));
when(connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(3))
- .thenReturn(new MySQLServerPreparedStatement("commit", new MySQLCommitStatement(), new CommonSQLStatementContext<>(new MySQLCommitStatement())));
+ .thenReturn(new MySQLServerPreparedStatement("commit", new CommonSQLStatementContext<>(new MySQLCommitStatement())));
}
private ShardingSphereDatabase mockDatabase() {
@@ -136,15 +137,16 @@ public final class MySQLComStmtExecuteExecutorTest extends ProxyContextRestorer
return result;
}
- private MySQLSelectStatement prepareSelectStatement() {
- MySQLSelectStatement sqlStatement = new MySQLSelectStatement();
- sqlStatement.setProjections(new ProjectionsSegment(0, 0));
- return sqlStatement;
- }
-
private SQLStatementContext<?> prepareSelectStatementContext() {
SelectStatementContext result = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
when(result.getTablesContext().getDatabaseName()).thenReturn(Optional.empty());
+ when(result.getSqlStatement()).thenReturn(prepareSelectStatement());
+ return result;
+ }
+
+ private MySQLSelectStatement prepareSelectStatement() {
+ MySQLSelectStatement result = new MySQLSelectStatement();
+ result.setProjections(new ProjectionsSegment(0, 0));
return result;
}
diff --git a/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutorTest.java b/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutorTest.java
index 80814e51709..3e6a21e1e37 100644
--- a/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutorTest.java
+++ b/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutorTest.java
@@ -55,7 +55,6 @@ import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -110,9 +109,8 @@ public final class MySQLComStmtPrepareExecutorTest extends ProxyContextRestorer
assertFalse(actualIterator.hasNext());
MySQLServerPreparedStatement actualPreparedStatement = connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(1);
assertThat(actualPreparedStatement.getSql(), is(sql));
- assertThat(actualPreparedStatement.getSqlStatement(), instanceOf(MySQLSelectStatement.class));
- assertTrue(actualPreparedStatement.getSqlStatementContext().isPresent());
- assertThat(actualPreparedStatement.getSqlStatementContext().get(), instanceOf(SelectStatementContext.class));
+ assertThat(actualPreparedStatement.getSqlStatementContext(), instanceOf(SelectStatementContext.class));
+ assertThat(actualPreparedStatement.getSqlStatementContext().getSqlStatement(), instanceOf(MySQLSelectStatement.class));
MySQLStatementIDGenerator.getInstance().unregisterConnection(1);
}
@@ -129,9 +127,8 @@ public final class MySQLComStmtPrepareExecutorTest extends ProxyContextRestorer
assertFalse(actualIterator.hasNext());
MySQLServerPreparedStatement actualPreparedStatement = connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(1);
assertThat(actualPreparedStatement.getSql(), is(sql));
- assertThat(actualPreparedStatement.getSqlStatement(), instanceOf(MySQLUpdateStatement.class));
- assertTrue(actualPreparedStatement.getSqlStatementContext().isPresent());
- assertThat(actualPreparedStatement.getSqlStatementContext().get(), instanceOf(UpdateStatementContext.class));
+ assertThat(actualPreparedStatement.getSqlStatementContext(), instanceOf(UpdateStatementContext.class));
+ assertThat(actualPreparedStatement.getSqlStatementContext().getSqlStatement(), instanceOf(MySQLUpdateStatement.class));
MySQLStatementIDGenerator.getInstance().unregisterConnection(1);
}
diff --git a/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/reset/MySQLComStmtResetExecutorTest.java b/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/reset/MySQLComStmtResetExecutorTest.java
index 33aca4ea230..91850c52ed8 100644
--- a/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/reset/MySQLComStmtResetExecutorTest.java
+++ b/proxy/frontend/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/reset/MySQLComStmtResetExecutorTest.java
@@ -44,7 +44,7 @@ public final class MySQLComStmtResetExecutorTest {
ConnectionSession connectionSession = mock(ConnectionSession.class);
when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(new ServerPreparedStatementRegistry());
when(connectionSession.getTransactionStatus()).thenReturn(new TransactionStatus(TransactionType.LOCAL));
- MySQLServerPreparedStatement preparedStatement = new MySQLServerPreparedStatement("", null, mock(SQLStatementContext.class));
+ MySQLServerPreparedStatement preparedStatement = new MySQLServerPreparedStatement("", mock(SQLStatementContext.class));
preparedStatement.getLongData().put(0, new byte[0]);
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(1, preparedStatement);
MySQLComStmtResetPacket packet = mock(MySQLComStmtResetPacket.class);
diff --git a/proxy/frontend/opengauss/src/main/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutor.java b/proxy/frontend/opengauss/src/main/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutor.java
index 6581861c318..244abb55ef8 100644
--- a/proxy/frontend/opengauss/src/main/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutor.java
+++ b/proxy/frontend/opengauss/src/main/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutor.java
@@ -48,7 +48,7 @@ public final class OpenGaussComBatchBindExecutor implements CommandExecutor {
connectionSession.getBackendConnection().handleAutoCommit();
PostgreSQLServerPreparedStatement preparedStatement = connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(packet.getStatementId());
int updateCount = new PostgreSQLBatchedStatementsExecutor(connectionSession, preparedStatement, packet.readParameterSets(preparedStatement.getParameterTypes())).executeBatch();
- return Arrays.asList(PostgreSQLBindCompletePacket.getInstance(), createCommandComplete(preparedStatement.getSqlStatement(), updateCount));
+ return Arrays.asList(PostgreSQLBindCompletePacket.getInstance(), createCommandComplete(preparedStatement.getSqlStatementContext().getSqlStatement(), updateCount));
}
private PostgreSQLCommandCompletePacket createCommandComplete(final SQLStatement sqlStatement, final int updateCount) {
diff --git a/proxy/frontend/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java b/proxy/frontend/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
index ccb72e2f337..6df48210d0e 100644
--- a/proxy/frontend/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
+++ b/proxy/frontend/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
@@ -21,6 +21,8 @@ import org.apache.shardingsphere.db.protocol.opengauss.packet.command.query.exte
import org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.bind.PostgreSQLBindCompletePacket;
import org.apache.shardingsphere.db.protocol.postgresql.packet.generic.PostgreSQLCommandCompletePacket;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType;
@@ -72,6 +74,7 @@ public final class OpenGaussComBatchBindExecutorTest extends ProxyContextRestore
ProxyContext.init(mock(ContextManager.class, RETURNS_DEEP_STUBS));
}
+ @SuppressWarnings("rawtypes")
@Test
public void assertExecute() throws SQLException {
when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.KERNEL_EXECUTOR_SIZE)).thenReturn(0);
@@ -105,7 +108,9 @@ public final class OpenGaussComBatchBindExecutorTest extends ProxyContextRestore
when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(new ServerPreparedStatementRegistry());
String sql = "insert into bmsql (id) values (?)";
SQLStatement sqlStatement = SQL_PARSER_ENGINE.parse(sql, false);
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statement, new PostgreSQLServerPreparedStatement(sql, sqlStatement, null, Collections.emptyList()));
+ SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class);
+ when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statement, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, Collections.emptyList()));
OpenGaussComBatchBindExecutor executor = new OpenGaussComBatchBindExecutor(packet, connectionSession);
Iterator<DatabasePacket<?>> actualPacketsIterator = executor.execute().iterator();
assertThat(actualPacketsIterator.next(), is(PostgreSQLBindCompletePacket.getInstance()));
diff --git a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/JDBCPortal.java b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/JDBCPortal.java
index 72c281a6d09..05ca9fae920 100644
--- a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/JDBCPortal.java
+++ b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/JDBCPortal.java
@@ -36,7 +36,6 @@ import org.apache.shardingsphere.infra.binder.QueryContext;
import org.apache.shardingsphere.infra.binder.aware.ParameterAware;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.JDBCBackendConnection;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
@@ -82,16 +81,11 @@ public final class JDBCPortal implements Portal<Void> {
public JDBCPortal(final String name, final PostgreSQLServerPreparedStatement preparedStatement, final List<Object> parameters, final List<PostgreSQLValueFormat> resultFormats,
final JDBCBackendConnection backendConnection) throws SQLException {
this.name = name;
- this.sqlStatement = preparedStatement.getSqlStatement();
+ this.sqlStatement = preparedStatement.getSqlStatementContext().getSqlStatement();
this.resultFormats = resultFormats;
this.backendConnection = backendConnection;
- if (!preparedStatement.getSqlStatementContext().isPresent()) {
- proxyBackendHandler = ProxyBackendHandlerFactory.newInstance(DatabaseTypeFactory.getInstance("PostgreSQL"),
- preparedStatement.getSql(), sqlStatement, backendConnection.getConnectionSession());
- return;
- }
String databaseName = backendConnection.getConnectionSession().getDefaultDatabaseName();
- SQLStatementContext<?> sqlStatementContext = preparedStatement.getSqlStatementContext().get();
+ SQLStatementContext<?> sqlStatementContext = preparedStatement.getSqlStatementContext();
if (sqlStatementContext instanceof ParameterAware) {
((ParameterAware) sqlStatementContext).setUpParameters(parameters);
}
diff --git a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutor.java b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutor.java
index 2f706ced368..86fa9f6646f 100644
--- a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutor.java
+++ b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutor.java
@@ -62,7 +62,7 @@ public final class PostgreSQLAggregatedBatchedStatementsCommandExecutor implemen
result.add(preparedStatement.describeRows().orElseGet(PostgreSQLNoDataPacket::getInstance));
}
if (each instanceof PostgreSQLComExecutePacket) {
- String tag = PostgreSQLCommand.valueOf(preparedStatement.getSqlStatement().getClass()).orElse(PostgreSQLCommand.INSERT).getTag();
+ String tag = PostgreSQLCommand.valueOf(preparedStatement.getSqlStatementContext().getSqlStatement().getClass()).orElse(PostgreSQLCommand.INSERT).getTag();
result.add(new PostgreSQLCommandCompletePacket(tag, totalInserted / executePacketCount));
}
}
diff --git a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
index 7cc9ab212a8..568fcec9bea 100644
--- a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
+++ b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
@@ -103,7 +103,8 @@ public final class PostgreSQLBatchedStatementsExecutor {
}
private SQLStatementContext<?> createSQLStatementContext(final List<Object> parameters) {
- return SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData().getDatabases(), parameters, preparedStatement.getSqlStatement(), connectionSession.getDatabaseName());
+ return SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData().getDatabases(), parameters, preparedStatement.getSqlStatementContext().getSqlStatement(),
+ connectionSession.getDatabaseName());
}
private void prepareForRestOfParametersSet(final Iterator<List<Object>> parameterSetsIterator, final SQLStatementContext<?> sqlStatementContext) {
@@ -178,7 +179,7 @@ public final class PostgreSQLBatchedStatementsExecutor {
ShardingSphereDatabase database = metaDataContexts.getMetaData().getDatabase(connectionSession.getDatabaseName());
Map<String, DatabaseType> storageTypes = database.getResourceMetaData().getStorageTypes();
DatabaseType protocolType = database.getProtocolType();
- JDBCExecutorCallback<int[]> callback = new BatchedStatementsJDBCExecutorCallback(protocolType, storageTypes, preparedStatement.getSqlStatement(), isExceptionThrown);
+ JDBCExecutorCallback<int[]> callback = new BatchedStatementsJDBCExecutorCallback(protocolType, storageTypes, preparedStatement.getSqlStatementContext().getSqlStatement(), isExceptionThrown);
List<int[]> executeResults = jdbcExecutor.execute(executionGroupContext, callback);
int result = 0;
for (int[] eachResult : executeResults) {
diff --git a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLServerPreparedStatement.java b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLServerPreparedStatement.java
index ff17fa26464..817fe5db653 100644
--- a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLServerPreparedStatement.java
+++ b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLServerPreparedStatement.java
@@ -26,7 +26,6 @@ import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.Pos
import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.PostgreSQLColumnType;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.proxy.backend.session.ServerPreparedStatement;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import java.util.List;
import java.util.Optional;
@@ -41,8 +40,6 @@ public final class PostgreSQLServerPreparedStatement implements ServerPreparedSt
private final String sql;
- private final SQLStatement sqlStatement;
-
private final SQLStatementContext<?> sqlStatementContext;
private final List<PostgreSQLColumnType> parameterTypes;
@@ -50,11 +47,6 @@ public final class PostgreSQLServerPreparedStatement implements ServerPreparedSt
@Getter(AccessLevel.NONE)
private PostgreSQLPacket rowDescription;
- @Override
- public Optional<SQLStatementContext<?>> getSqlStatementContext() {
- return Optional.ofNullable(sqlStatementContext);
- }
-
/**
* Describe parameters of the prepared statement.
*
diff --git a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
index 1dabe2ac37d..9b36e521fea 100644
--- a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
+++ b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
@@ -108,7 +108,7 @@ public final class PostgreSQLComDescribeExecutor implements CommandExecutor {
}
private void tryDescribePreparedStatement(final PostgreSQLServerPreparedStatement preparedStatement) throws SQLException {
- if (preparedStatement.getSqlStatement() instanceof InsertStatement) {
+ if (preparedStatement.getSqlStatementContext().getSqlStatement() instanceof InsertStatement) {
describeInsertStatementByDatabaseMetaData(preparedStatement);
} else {
tryDescribePreparedStatementByJDBC(preparedStatement);
@@ -120,7 +120,7 @@ public final class PostgreSQLComDescribeExecutor implements CommandExecutor {
// TODO Consider the SQL `insert into table (col) values ($1) returning id`
preparedStatement.setRowDescription(PostgreSQLNoDataPacket.getInstance());
}
- InsertStatement insertStatement = (InsertStatement) preparedStatement.getSqlStatement();
+ InsertStatement insertStatement = (InsertStatement) preparedStatement.getSqlStatementContext().getSqlStatement();
if (0 == insertStatement.getParameterCount()) {
return;
}
@@ -191,7 +191,7 @@ public final class PostgreSQLComDescribeExecutor implements CommandExecutor {
MetaDataContexts metaDataContexts = ProxyContext.getInstance().getContextManager().getMetaDataContexts();
String databaseName = connectionSession.getDatabaseName();
SQLStatementContext<?> sqlStatementContext =
- SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData().getDatabases(), logicPreparedStatement.getSqlStatement(), databaseName);
+ SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData().getDatabases(), logicPreparedStatement.getSqlStatementContext().getSqlStatement(), databaseName);
QueryContext queryContext = new QueryContext(sqlStatementContext, logicPreparedStatement.getSql(), Collections.emptyList());
ShardingSphereDatabase database = ProxyContext.getInstance().getDatabase(databaseName);
ExecutionContext executionContext = new KernelProcessor().generateExecutionContext(
@@ -206,12 +206,12 @@ public final class PostgreSQLComDescribeExecutor implements CommandExecutor {
}
private void populateParameterTypes(final PostgreSQLServerPreparedStatement logicPreparedStatement, final PreparedStatement actualPreparedStatement) throws SQLException {
- if (0 == logicPreparedStatement.getSqlStatement().getParameterCount()
+ if (0 == logicPreparedStatement.getSqlStatementContext().getSqlStatement().getParameterCount()
|| logicPreparedStatement.getParameterTypes().stream().noneMatch(each -> PostgreSQLColumnType.POSTGRESQL_TYPE_UNSPECIFIED == each)) {
return;
}
ParameterMetaData parameterMetaData = actualPreparedStatement.getParameterMetaData();
- for (int i = 0; i < logicPreparedStatement.getSqlStatement().getParameterCount(); i++) {
+ for (int i = 0; i < logicPreparedStatement.getSqlStatementContext().getSqlStatement().getParameterCount(); i++) {
if (PostgreSQLColumnType.POSTGRESQL_TYPE_UNSPECIFIED == logicPreparedStatement.getParameterTypes().get(i)) {
logicPreparedStatement.getParameterTypes().set(i, PostgreSQLColumnType.valueOfJDBCType(parameterMetaData.getParameterType(i + 1)));
}
diff --git a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutor.java b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutor.java
index db653aafd40..b8cf9991f3a 100644
--- a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutor.java
+++ b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutor.java
@@ -25,6 +25,7 @@ import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.ext
import org.apache.shardingsphere.distsql.parser.statement.DistSQLStatement;
import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.proxy.backend.distsql.DistSQLStatementContext;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
@@ -65,11 +66,10 @@ public final class PostgreSQLComParseExecutor implements CommandExecutor {
sqlStatement = sqlParserEngine.parse(sql, true);
}
List<PostgreSQLColumnType> paddedColumnTypes = paddingColumnTypes(sqlStatement.getParameterCount(), packet.readParameterTypes());
- SQLStatementContext<?> sqlStatementContext = !(sqlStatement instanceof DistSQLStatement)
- ? SQLStatementContextFactory.newInstance(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabases(),
- sqlStatement, connectionSession.getDefaultDatabaseName())
- : null;
- PostgreSQLServerPreparedStatement serverPreparedStatement = new PostgreSQLServerPreparedStatement(sql, sqlStatement, sqlStatementContext, paddedColumnTypes);
+ SQLStatementContext<?> sqlStatementContext = sqlStatement instanceof DistSQLStatement ? new DistSQLStatementContext((DistSQLStatement) sqlStatement)
+ : SQLStatementContextFactory.newInstance(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabases(),
+ sqlStatement, connectionSession.getDefaultDatabaseName());
+ PostgreSQLServerPreparedStatement serverPreparedStatement = new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, paddedColumnTypes);
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(packet.getStatementId(), serverPreparedStatement);
return Collections.singletonList(PostgreSQLParseCompletePacket.getInstance());
}
diff --git a/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/JDBCPortalTest.java b/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/JDBCPortalTest.java
index 03d25bf6e59..053a438a25c 100644
--- a/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/JDBCPortalTest.java
+++ b/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/JDBCPortalTest.java
@@ -28,6 +28,7 @@ import org.apache.shardingsphere.db.protocol.postgresql.packet.generic.PostgreSQ
import org.apache.shardingsphere.db.protocol.postgresql.packet.handshake.PostgreSQLParameterStatusPacket;
import org.apache.shardingsphere.infra.binder.QueryContext;
import org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
@@ -48,7 +49,7 @@ import org.apache.shardingsphere.proxy.frontend.postgresql.ProxyContextRestorer;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableAssignSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.dal.EmptyStatement;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dal.PostgreSQLEmptyStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dal.PostgreSQLSetStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dml.PostgreSQLInsertStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dml.PostgreSQLSelectStatement;
@@ -123,7 +124,8 @@ public final class JDBCPortalTest extends ProxyContextRestorer {
@Test
public void assertGetName() throws SQLException {
- JDBCPortal portal = new JDBCPortal("", new PostgreSQLServerPreparedStatement("", null, null, Collections.emptyList()), Collections.emptyList(), Collections.emptyList(), backendConnection);
+ JDBCPortal portal = new JDBCPortal("", new PostgreSQLServerPreparedStatement("",
+ new CommonSQLStatementContext<>(new PostgreSQLEmptyStatement()), Collections.emptyList()), Collections.emptyList(), Collections.emptyList(), backendConnection);
assertThat(portal.getName(), is(""));
}
@@ -136,8 +138,10 @@ public final class JDBCPortalTest extends ProxyContextRestorer {
when(proxyBackendHandler.next()).thenReturn(true, true, false);
when(proxyBackendHandler.getRowData()).thenReturn(new QueryResponseRow(Collections.singletonList(new QueryResponseCell(Types.INTEGER, 0))),
new QueryResponseRow(Collections.singletonList(new QueryResponseCell(Types.INTEGER, 1))));
+ SelectStatementContext sqlStatementContext = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
+ when(sqlStatementContext.getSqlStatement()).thenReturn(new PostgreSQLSelectStatement());
PostgreSQLServerPreparedStatement preparedStatement =
- new PostgreSQLServerPreparedStatement("", new PostgreSQLSelectStatement(), mock(SelectStatementContext.class, RETURNS_DEEP_STUBS), Collections.emptyList());
+ new PostgreSQLServerPreparedStatement("", sqlStatementContext, Collections.emptyList());
List<PostgreSQLValueFormat> resultFormats = new ArrayList<>(Arrays.asList(PostgreSQLValueFormat.TEXT, PostgreSQLValueFormat.BINARY));
JDBCPortal portal = new JDBCPortal("", preparedStatement, Collections.emptyList(), resultFormats, backendConnection);
portal.bind();
@@ -160,8 +164,10 @@ public final class JDBCPortalTest extends ProxyContextRestorer {
when(proxyBackendHandler.getRowData()).thenReturn(
new QueryResponseRow(Collections.singletonList(new QueryResponseCell(Types.INTEGER, 0))),
new QueryResponseRow(Collections.singletonList(new QueryResponseCell(Types.INTEGER, 1))));
+ SelectStatementContext selectStatementContext = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
+ when(selectStatementContext.getSqlStatement()).thenReturn(new PostgreSQLSelectStatement());
PostgreSQLServerPreparedStatement preparedStatement =
- new PostgreSQLServerPreparedStatement("", new PostgreSQLSelectStatement(), mock(SelectStatementContext.class, RETURNS_DEEP_STUBS), Collections.emptyList());
+ new PostgreSQLServerPreparedStatement("", selectStatementContext, Collections.emptyList());
List<PostgreSQLValueFormat> resultFormats = new ArrayList<>(Arrays.asList(PostgreSQLValueFormat.TEXT, PostgreSQLValueFormat.BINARY));
JDBCPortal portal = new JDBCPortal("", preparedStatement, Collections.emptyList(), resultFormats, backendConnection);
portal.bind();
@@ -178,8 +184,10 @@ public final class JDBCPortalTest extends ProxyContextRestorer {
public void assertExecuteUpdate() throws SQLException {
when(proxyBackendHandler.execute()).thenReturn(mock(UpdateResponseHeader.class));
when(proxyBackendHandler.next()).thenReturn(false);
+ InsertStatementContext insertStatementContext = mock(InsertStatementContext.class, RETURNS_DEEP_STUBS);
+ when(insertStatementContext.getSqlStatement()).thenReturn(new PostgreSQLInsertStatement());
PostgreSQLServerPreparedStatement preparedStatement =
- new PostgreSQLServerPreparedStatement("", new PostgreSQLInsertStatement(), mock(InsertStatementContext.class, RETURNS_DEEP_STUBS), Collections.emptyList());
+ new PostgreSQLServerPreparedStatement("", insertStatementContext, Collections.emptyList());
JDBCPortal portal = new JDBCPortal("insert into t values (1)", preparedStatement, Collections.emptyList(), Collections.emptyList(), backendConnection);
portal.bind();
assertThat(portal.describe(), is(PostgreSQLNoDataPacket.getInstance()));
@@ -191,7 +199,7 @@ public final class JDBCPortalTest extends ProxyContextRestorer {
public void assertExecuteEmptyStatement() throws SQLException {
when(proxyBackendHandler.execute()).thenReturn(mock(UpdateResponseHeader.class));
when(proxyBackendHandler.next()).thenReturn(false);
- PostgreSQLServerPreparedStatement preparedStatement = new PostgreSQLServerPreparedStatement("", new EmptyStatement(), null, Collections.emptyList());
+ PostgreSQLServerPreparedStatement preparedStatement = new PostgreSQLServerPreparedStatement("", new CommonSQLStatementContext<>(new PostgreSQLEmptyStatement()), Collections.emptyList());
JDBCPortal portal = new JDBCPortal("", preparedStatement, Collections.emptyList(), Collections.emptyList(), backendConnection);
portal.bind();
assertThat(portal.describe(), is(PostgreSQLNoDataPacket.getInstance()));
@@ -208,7 +216,7 @@ public final class JDBCPortalTest extends ProxyContextRestorer {
VariableAssignSegment variableAssignSegment = new VariableAssignSegment();
variableAssignSegment.setVariable(new VariableSegment());
setStatement.getVariableAssigns().add(variableAssignSegment);
- PostgreSQLServerPreparedStatement preparedStatement = new PostgreSQLServerPreparedStatement(sql, setStatement, new CommonSQLStatementContext<>(setStatement), Collections.emptyList());
+ PostgreSQLServerPreparedStatement preparedStatement = new PostgreSQLServerPreparedStatement(sql, new CommonSQLStatementContext<>(setStatement), Collections.emptyList());
JDBCPortal portal = new JDBCPortal("", preparedStatement, Collections.emptyList(), Collections.emptyList(), backendConnection);
portal.bind();
List<PostgreSQLPacket> actualPackets = portal.execute(0);
@@ -217,17 +225,18 @@ public final class JDBCPortalTest extends ProxyContextRestorer {
assertThat(actualPackets.get(1), instanceOf(PostgreSQLParameterStatusPacket.class));
}
+ @SuppressWarnings("unchecked")
@Test(expected = IllegalStateException.class)
public void assertDescribeBeforeBind() throws SQLException {
PostgreSQLServerPreparedStatement preparedStatement = mock(PostgreSQLServerPreparedStatement.class);
when(preparedStatement.getSql()).thenReturn("");
- when(preparedStatement.getSqlStatement()).thenReturn(new EmptyStatement());
+ when(preparedStatement.getSqlStatementContext()).thenReturn(mock(SQLStatementContext.class));
new JDBCPortal("", preparedStatement, Collections.emptyList(), Collections.emptyList(), backendConnection).describe();
}
@Test
public void assertClose() throws SQLException {
- PostgreSQLServerPreparedStatement preparedStatement = new PostgreSQLServerPreparedStatement("", new EmptyStatement(), null, Collections.emptyList());
+ PostgreSQLServerPreparedStatement preparedStatement = new PostgreSQLServerPreparedStatement("", new CommonSQLStatementContext<>(new PostgreSQLEmptyStatement()), Collections.emptyList());
JDBCPortal portal = new JDBCPortal("", preparedStatement, Collections.emptyList(), Collections.emptyList(), backendConnection);
portal.close();
verify(backendConnection).unmarkResourceInUse(proxyBackendHandler);
diff --git a/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java b/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
index cb689b35ccd..2ecf5b492b2 100644
--- a/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
+++ b/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
@@ -26,6 +26,8 @@ import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.ext
import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.describe.PostgreSQLComDescribePacket;
import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.execute.PostgreSQLComExecutePacket;
import org.apache.shardingsphere.db.protocol.postgresql.packet.generic.PostgreSQLCommandCompletePacket;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
@@ -43,6 +45,7 @@ import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import org.apache.shardingsphere.proxy.backend.session.ServerPreparedStatementRegistry;
import org.apache.shardingsphere.proxy.frontend.postgresql.ProxyContextRestorer;
import org.apache.shardingsphere.sql.parser.api.CacheOption;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import org.apache.shardingsphere.sqltranslator.rule.SQLTranslatorRule;
import org.apache.shardingsphere.sqltranslator.rule.builder.DefaultSQLTranslatorRuleConfigurationBuilder;
import org.junit.Before;
@@ -82,6 +85,7 @@ public final class PostgreSQLAggregatedBatchedStatementsCommandExecutorTest exte
ProxyContext.init(mock(ContextManager.class, RETURNS_DEEP_STUBS));
}
+ @SuppressWarnings("rawtypes")
@Test
public void assertExecute() throws SQLException {
when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.KERNEL_EXECUTOR_SIZE)).thenReturn(0);
@@ -97,8 +101,11 @@ public final class PostgreSQLAggregatedBatchedStatementsCommandExecutorTest exte
when(database.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singletonList("ds_0"));
when(database.getResourceMetaData().getStorageTypes()).thenReturn(Collections.singletonMap("ds_0", new PostgreSQLDatabaseType()));
when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase("db")).thenReturn(database);
+ SQLStatement sqlStatement = SQL_PARSER_ENGINE.parse(SQL, false);
+ SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class);
+ when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(STATEMENT_ID,
- new PostgreSQLServerPreparedStatement(SQL, SQL_PARSER_ENGINE.parse(SQL, false), null, Collections.singletonList(PostgreSQLColumnType.POSTGRESQL_TYPE_INT4)));
+ new PostgreSQLServerPreparedStatement(SQL, sqlStatementContext, Collections.singletonList(PostgreSQLColumnType.POSTGRESQL_TYPE_INT4)));
when(connectionSession.getConnectionId()).thenReturn(CONNECTION_ID);
JDBCBackendConnection backendConnection = mock(JDBCBackendConnection.class);
Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
diff --git a/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java b/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java
index b2cfe79f7da..7e3d2c7c945 100644
--- a/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java
+++ b/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extend
import lombok.SneakyThrows;
import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.PostgreSQLColumnType;
import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.bind.PostgreSQLTypeUnspecifiedSQLParameter;
+import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
@@ -102,7 +103,9 @@ public final class PostgreSQLBatchedStatementsExecutorTest extends ProxyContextR
public void assertExecuteBatch() throws SQLException {
PostgreSQLInsertStatement insertStatement = mock(PostgreSQLInsertStatement.class, RETURNS_DEEP_STUBS);
when(insertStatement.getTable().getTableName().getIdentifier().getValue()).thenReturn("t");
- PostgreSQLServerPreparedStatement postgreSQLPreparedStatement = new PostgreSQLServerPreparedStatement("insert into t (id, col) values (?, ?)", insertStatement, null,
+ InsertStatementContext insertStatementContext = mock(InsertStatementContext.class);
+ when(insertStatementContext.getSqlStatement()).thenReturn(insertStatement);
+ PostgreSQLServerPreparedStatement postgreSQLPreparedStatement = new PostgreSQLServerPreparedStatement("insert into t (id, col) values (?, ?)", insertStatementContext,
Arrays.asList(PostgreSQLColumnType.POSTGRESQL_TYPE_INT4, PostgreSQLColumnType.POSTGRESQL_TYPE_VARCHAR));
List<List<Object>> parameterSets = Arrays.asList(Arrays.asList(1, new PostgreSQLTypeUnspecifiedSQLParameter("foo")),
Arrays.asList(2, new PostgreSQLTypeUnspecifiedSQLParameter("bar")), Arrays.asList(3, new PostgreSQLTypeUnspecifiedSQLParameter("baz")));
diff --git a/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/bind/PostgreSQLComBindExecutorTest.java b/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/bind/PostgreSQLComBindExecutorTest.java
index feb2fb28147..1bc65407bf0 100644
--- a/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/bind/PostgreSQLComBindExecutorTest.java
+++ b/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/bind/PostgreSQLComBindExecutorTest.java
@@ -20,13 +20,21 @@ package org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extend
import org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.bind.PostgreSQLBindCompletePacket;
import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.bind.PostgreSQLComBindPacket;
+import org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
+import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
+import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.JDBCBackendConnection;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import org.apache.shardingsphere.proxy.backend.session.ServerPreparedStatementRegistry;
+import org.apache.shardingsphere.proxy.backend.session.transaction.TransactionStatus;
+import org.apache.shardingsphere.proxy.frontend.postgresql.ProxyContextRestorer;
import org.apache.shardingsphere.proxy.frontend.postgresql.command.PortalContext;
import org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.JDBCPortal;
import org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.PostgreSQLServerPreparedStatement;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.dal.EmptyStatement;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dal.PostgreSQLEmptyStatement;
+import org.apache.shardingsphere.transaction.core.TransactionType;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
@@ -41,12 +49,13 @@ import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
-public final class PostgreSQLComBindExecutorTest {
+public final class PostgreSQLComBindExecutorTest extends ProxyContextRestorer {
@Mock
private PortalContext portalContext;
@@ -62,12 +71,21 @@ public final class PostgreSQLComBindExecutorTest {
@Test
public void assertExecuteBind() throws SQLException {
+ ProxyContext.init(mock(ContextManager.class, RETURNS_DEEP_STUBS));
+ String databaseName = "postgres";
+ when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().containsDatabase(databaseName)).thenReturn(true);
+ ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ when(ProxyContext.getInstance().getDatabase(databaseName)).thenReturn(database);
+ when(database.getProtocolType()).thenReturn(new PostgreSQLDatabaseType());
when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(new ServerPreparedStatementRegistry());
JDBCBackendConnection backendConnection = mock(JDBCBackendConnection.class);
when(connectionSession.getBackendConnection()).thenReturn(backendConnection);
+ when(connectionSession.getDefaultDatabaseName()).thenReturn(databaseName);
+ when(connectionSession.getTransactionStatus()).thenReturn(new TransactionStatus(TransactionType.LOCAL));
when(backendConnection.getConnectionSession()).thenReturn(connectionSession);
String statementId = "S_1";
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement("", new EmptyStatement(), null, Collections.emptyList()));
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId,
+ new PostgreSQLServerPreparedStatement("", new CommonSQLStatementContext<>(new PostgreSQLEmptyStatement()), Collections.emptyList()));
when(bindPacket.getStatementId()).thenReturn(statementId);
when(bindPacket.getPortal()).thenReturn("C_1");
when(bindPacket.readParameters(anyList())).thenReturn(Collections.emptyList());
diff --git a/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java b/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
index 20d372efc30..6d2f386cba5 100644
--- a/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
+++ b/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
@@ -27,6 +27,9 @@ import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.ext
import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.describe.PostgreSQLComDescribePacket;
import org.apache.shardingsphere.db.protocol.postgresql.payload.PostgreSQLPacketPayload;
import org.apache.shardingsphere.dialect.postgresql.exception.metadata.ColumnNotFoundException;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
import org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode;
@@ -146,6 +149,7 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
assertThat(actual.iterator().next(), is(expected));
}
+ @SuppressWarnings("rawtypes")
@Test
public void assertDescribePreparedStatementInsertWithoutColumns() throws SQLException {
when(packet.getType()).thenReturn('S');
@@ -157,7 +161,9 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
for (int i = 0; i < sqlStatement.getParameterCount(); i++) {
parameterTypes.add(PostgreSQLColumnType.POSTGRESQL_TYPE_UNSPECIFIED);
}
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatement, null, parameterTypes));
+ SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class);
+ when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
Collection<DatabasePacket<?>> actualPackets = executor.execute();
assertThat(actualPackets.size(), is(2));
Iterator<DatabasePacket<?>> actualPacketsIterator = actualPackets.iterator();
@@ -170,6 +176,7 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
assertThat(actualPacketsIterator.next(), is(PostgreSQLNoDataPacket.getInstance()));
}
+ @SuppressWarnings("rawtypes")
@Test
public void assertDescribePreparedStatementInsertWithColumns() throws SQLException {
when(packet.getType()).thenReturn('S');
@@ -181,7 +188,9 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
for (int i = 0; i < sqlStatement.getParameterCount(); i++) {
parameterTypes.add(PostgreSQLColumnType.POSTGRESQL_TYPE_UNSPECIFIED);
}
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatement, null, parameterTypes));
+ SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class);
+ when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
Collection<DatabasePacket<?>> actualPackets = executor.execute();
assertThat(actualPackets.size(), is(2));
Iterator<DatabasePacket<?>> actualPacketsIterator = actualPackets.iterator();
@@ -194,6 +203,7 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
assertThat(actualPacketsIterator.next(), is(PostgreSQLNoDataPacket.getInstance()));
}
+ @SuppressWarnings("rawtypes")
@Test
public void assertDescribePreparedStatementInsertWithCaseInsensitiveColumns() throws SQLException {
when(packet.getType()).thenReturn('S');
@@ -205,7 +215,9 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
for (int i = 0; i < sqlStatement.getParameterCount(); i++) {
parameterTypes.add(PostgreSQLColumnType.POSTGRESQL_TYPE_UNSPECIFIED);
}
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatement, null, parameterTypes));
+ SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class);
+ when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
Collection<DatabasePacket<?>> actualPackets = executor.execute();
assertThat(actualPackets.size(), is(2));
Iterator<DatabasePacket<?>> actualPacketsIterator = actualPackets.iterator();
@@ -218,6 +230,7 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
assertThat(actualPacketsIterator.next(), is(PostgreSQLNoDataPacket.getInstance()));
}
+ @SuppressWarnings("rawtypes")
@Test(expected = ColumnNotFoundException.class)
public void assertDescribePreparedStatementInsertWithUndefinedColumns() throws SQLException {
when(packet.getType()).thenReturn('S');
@@ -229,10 +242,13 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
for (int i = 0; i < sqlStatement.getParameterCount(); i++) {
parameterTypes.add(PostgreSQLColumnType.POSTGRESQL_TYPE_UNSPECIFIED);
}
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatement, null, parameterTypes));
+ SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class);
+ when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
executor.execute();
}
+ @SuppressWarnings("rawtypes")
@Test
public void assertDescribeSelectPreparedStatement() throws SQLException {
when(packet.getType()).thenReturn('S');
@@ -240,9 +256,11 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
when(packet.getName()).thenReturn(statementId);
String sql = "select id, k, c, pad from t_order where id = ?";
SQLStatement sqlStatement = SQL_PARSER_ENGINE.parse(sql, false);
+ SQLStatementContext sqlStatementContext = mock(SelectStatementContext.class);
+ when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
prepareJDBCBackendConnection(sql);
List<PostgreSQLColumnType> parameterTypes = new ArrayList<>(Collections.singleton(PostgreSQLColumnType.POSTGRESQL_TYPE_UNSPECIFIED));
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatement, null, parameterTypes));
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
Collection<DatabasePacket<?>> actual = executor.execute();
assertThat(actual.size(), is(2));
Iterator<DatabasePacket<?>> actualPacketsIterator = actual.iterator();
diff --git a/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java b/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
index 350fdc45bdb..a6e473833aa 100644
--- a/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
+++ b/proxy/frontend/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
@@ -23,12 +23,15 @@ import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.ext
import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.parse.PostgreSQLComParsePacket;
import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.parse.PostgreSQLParseCompletePacket;
import org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ShowDistVariableStatement;
+import org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.parser.rule.SQLParserRule;
import org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigurationBuilder;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.proxy.backend.distsql.DistSQLStatementContext;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import org.apache.shardingsphere.proxy.backend.session.ServerPreparedStatementRegistry;
import org.apache.shardingsphere.proxy.frontend.postgresql.ProxyContextRestorer;
@@ -47,7 +50,6 @@ import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.Optional;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
@@ -95,7 +97,8 @@ public final class PostgreSQLComParseExecutorTest extends ProxyContextRestorer {
assertThat(actualPackets.size(), is(1));
assertThat(actualPackets.iterator().next(), is(PostgreSQLParseCompletePacket.getInstance()));
PostgreSQLServerPreparedStatement actualPreparedStatement = connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(statementId);
- assertThat(actualPreparedStatement.getSqlStatement(), instanceOf(EmptyStatement.class));
+ assertThat(actualPreparedStatement.getSqlStatementContext(), instanceOf(CommonSQLStatementContext.class));
+ assertThat(actualPreparedStatement.getSqlStatementContext().getSqlStatement(), instanceOf(EmptyStatement.class));
assertThat(actualPreparedStatement.getSql(), is(expectedSQL));
assertThat(actualPreparedStatement.getParameterTypes(), is(Collections.emptyList()));
}
@@ -121,7 +124,8 @@ public final class PostgreSQLComParseExecutorTest extends ProxyContextRestorer {
assertThat(actualPackets.size(), is(1));
assertThat(actualPackets.iterator().next(), is(PostgreSQLParseCompletePacket.getInstance()));
PostgreSQLServerPreparedStatement actualPreparedStatement = connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(statementId);
- assertThat(actualPreparedStatement.getSqlStatement(), instanceOf(PostgreSQLInsertStatement.class));
+ assertThat(actualPreparedStatement.getSqlStatementContext(), instanceOf(InsertStatementContext.class));
+ assertThat(actualPreparedStatement.getSqlStatementContext().getSqlStatement(), instanceOf(PostgreSQLInsertStatement.class));
assertThat(actualPreparedStatement.getSql(), is(expectedSQL));
assertThat(actualPreparedStatement.getParameterTypes(), is(Arrays.asList(PostgreSQLColumnType.POSTGRESQL_TYPE_INT4, PostgreSQLColumnType.POSTGRESQL_TYPE_UNSPECIFIED)));
}
@@ -151,8 +155,8 @@ public final class PostgreSQLComParseExecutorTest extends ProxyContextRestorer {
assertThat(actualPackets.iterator().next(), is(PostgreSQLParseCompletePacket.getInstance()));
PostgreSQLServerPreparedStatement actualPreparedStatement = connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(statementId);
assertThat(actualPreparedStatement.getSql(), is(sql));
- assertThat(actualPreparedStatement.getSqlStatement(), instanceOf(ShowDistVariableStatement.class));
- assertThat(actualPreparedStatement.getSqlStatementContext(), is(Optional.empty()));
+ assertThat(actualPreparedStatement.getSqlStatementContext(), instanceOf(DistSQLStatementContext.class));
+ assertThat(actualPreparedStatement.getSqlStatementContext().getSqlStatement(), instanceOf(ShowDistVariableStatement.class));
assertThat(actualPreparedStatement.getParameterTypes(), is(Collections.emptyList()));
}
}
diff --git a/proxy/frontend/reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/binary/execute/ReactiveMySQLComStmtExecuteExecutor.java b/proxy/frontend/reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/binary/execute/ReactiveMySQLComStmtExecuteExecutor.java
index ad7c6067fa6..8550d604f9f 100644
--- a/proxy/frontend/reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/binary/execute/ReactiveMySQLComStmtExecuteExecutor.java
+++ b/proxy/frontend/reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/binary/execute/ReactiveMySQLComStmtExecuteExecutor.java
@@ -87,13 +87,13 @@ public final class ReactiveMySQLComStmtExecuteExecutor implements ReactiveComman
MySQLServerPreparedStatement preparedStatement = updateAndGetPreparedStatement();
List<Object> parameters = packet.readParameters(preparedStatement.getParameterTypes(), preparedStatement.getLongData().keySet());
preparedStatement.getLongData().forEach(parameters::set);
- SQLStatementContext<?> sqlStatementContext = preparedStatement.getSqlStatementContext().get();
+ SQLStatementContext<?> sqlStatementContext = preparedStatement.getSqlStatementContext();
if (sqlStatementContext instanceof ParameterAware) {
((ParameterAware) sqlStatementContext).setUpParameters(parameters);
}
QueryContext queryContext = new QueryContext(sqlStatementContext, preparedStatement.getSql(), parameters);
connectionSession.setQueryContext(queryContext);
- SQLStatement sqlStatement = preparedStatement.getSqlStatement();
+ SQLStatement sqlStatement = preparedStatement.getSqlStatementContext().getSqlStatement();
String databaseName = connectionSession.getDatabaseName();
MetaDataContexts metaDataContexts = ProxyContext.getInstance().getContextManager().getMetaDataContexts();
SQLCheckEngine.check(sqlStatementContext, parameters, getRules(databaseName), databaseName, metaDataContexts.getMetaData().getDatabases(), connectionSession.getGrantee());