This is an automated email from the ASF dual-hosted git repository. chengzhang 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 f9f175e47d4 Minor refactor for EncryptAssignmentTokenGenerator (#35380) f9f175e47d4 is described below commit f9f175e47d4b5b0e688fba890376bc0e2bf67b10 Author: Zhengqiang Duan <duanzhengqi...@apache.org> AuthorDate: Tue May 13 10:06:14 2025 +0800 Minor refactor for EncryptAssignmentTokenGenerator (#35380) * Minor refactor for EncryptAssignmentTokenGenerator * fix unit test * fix checkstyle --- .../EncryptAssignmentTokenGenerator.java | 51 +++++++++++++++++----- .../EncryptInsertAssignmentTokenGenerator.java | 12 ++++- .../EncryptUpdateAssignmentTokenGenerator.java | 12 ++++- .../EncryptAssignmentTokenGeneratorTest.java | 16 +++++-- .../EncryptInsertAssignmentTokenGeneratorTest.java | 11 ++++- .../EncryptUpdateAssignmentTokenGeneratorTest.java | 11 ++++- .../parser/statement/core/enums/SubqueryType.java | 2 +- .../generic/bound/ColumnSegmentBoundInfo.java | 2 +- 8 files changed, 93 insertions(+), 24 deletions(-) diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptAssignmentTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptAssignmentTokenGenerator.java index 5692d6bc17a..2c9f0fe7f15 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptAssignmentTokenGenerator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptAssignmentTokenGenerator.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.encrypt.rewrite.token.generator.assignment; import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.encrypt.enums.EncryptDerivedColumnSuffix; import org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptAssignmentToken; import org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptLiteralAssignmentToken; import org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptParameterAssignmentToken; @@ -29,11 +30,15 @@ import org.apache.shardingsphere.infra.binder.context.segment.table.TablesContex import org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; +import org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException; import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken; +import org.apache.shardingsphere.sql.parser.statement.core.enums.TableSourceType; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.ColumnAssignmentSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.SetAssignmentSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; import java.util.Collection; import java.util.Collections; @@ -59,22 +64,33 @@ public final class EncryptAssignmentTokenGenerator { * @param tablesContext SQL statement context * @param setAssignmentSegment set assignment segment * @return generated SQL tokens + * @throws UnsupportedSQLOperationException unsupported SQL operation exception */ public Collection<SQLToken> generateSQLTokens(final TablesContext tablesContext, final SetAssignmentSegment setAssignmentSegment) { - String tableName = tablesContext.getSimpleTables().iterator().next().getTableName().getIdentifier().getValue(); - EncryptTable encryptTable = rule.getEncryptTable(tableName); Collection<SQLToken> result = new LinkedList<>(); String schemaName = tablesContext.getSchemaName().orElseGet(() -> new DatabaseTypeRegistry(databaseType).getDefaultSchemaName(databaseName)); QuoteCharacter quoteCharacter = new DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getQuoteCharacter(); for (ColumnAssignmentSegment each : setAssignmentSegment.getAssignments()) { - String columnName = each.getColumns().get(0).getIdentifier().getValue(); - if (encryptTable.isEncryptColumn(columnName)) { - generateSQLToken(schemaName, encryptTable.getTable(), encryptTable.getEncryptColumn(columnName), each, quoteCharacter).ifPresent(result::add); + ColumnSegment columnSegment = each.getColumns().get(0); + Optional<EncryptTable> encryptTable = findEncryptTable(columnSegment); + if (encryptTable.isPresent() && encryptTable.get().isEncryptColumn(columnSegment.getIdentifier().getValue())) { + generateSQLToken(schemaName, encryptTable.get().getTable(), encryptTable.get().getEncryptColumn(columnSegment.getIdentifier().getValue()), each, quoteCharacter).ifPresent(result::add); + } else if (each.getValue() instanceof ColumnSegment && isEncryptColumn((ColumnSegment) each.getValue())) { + throw new UnsupportedSQLOperationException( + "Can not use different encryptor for " + columnSegment.getColumnBoundInfo() + " and " + ((ColumnSegment) each.getValue()).getColumnBoundInfo() + " in set clause"); } } return result; } + private boolean isEncryptColumn(final ColumnSegment columnSegment) { + ColumnSegmentBoundInfo columnBoundInfo = columnSegment.getColumnBoundInfo(); + String originalTable = columnBoundInfo.getOriginalTable().getValue(); + String originalColumn = columnBoundInfo.getOriginalColumn().getValue(); + Optional<EncryptTable> encryptTable = rule.findEncryptTable(originalTable); + return encryptTable.isPresent() && encryptTable.get().isEncryptColumn(originalColumn); + } + private Optional<EncryptAssignmentToken> generateSQLToken(final String schemaName, final String tableName, final EncryptColumn encryptColumn, final ColumnAssignmentSegment segment, final QuoteCharacter quoteCharacter) { if (segment.getValue() instanceof ParameterMarkerExpressionSegment) { @@ -87,14 +103,21 @@ public final class EncryptAssignmentTokenGenerator { } private EncryptAssignmentToken generateParameterSQLToken(final EncryptColumn encryptColumn, final ColumnAssignmentSegment segment, final QuoteCharacter quoteCharacter) { + ColumnSegment columnSegment = segment.getColumns().get(0); EncryptParameterAssignmentToken result = - new EncryptParameterAssignmentToken(segment.getColumns().get(0).getStartIndex(), segment.getStopIndex(), quoteCharacter); - result.addColumnName(encryptColumn.getCipher().getName()); - encryptColumn.getAssistedQuery().ifPresent(optional -> result.addColumnName(optional.getName())); - encryptColumn.getLikeQuery().ifPresent(optional -> result.addColumnName(optional.getName())); + new EncryptParameterAssignmentToken(columnSegment.getStartIndex(), segment.getStopIndex(), quoteCharacter); + result.addColumnName(getColumnName(columnSegment, EncryptDerivedColumnSuffix.CIPHER, encryptColumn.getCipher().getName())); + encryptColumn.getAssistedQuery().ifPresent(optional -> result.addColumnName(getColumnName(columnSegment, EncryptDerivedColumnSuffix.ASSISTED_QUERY, optional.getName()))); + encryptColumn.getLikeQuery().ifPresent(optional -> result.addColumnName(getColumnName(columnSegment, EncryptDerivedColumnSuffix.LIKE_QUERY, optional.getName()))); return result; } + private String getColumnName(final ColumnSegment columnSegment, final EncryptDerivedColumnSuffix derivedColumnSuffix, final String actualColumnName) { + return TableSourceType.TEMPORARY_TABLE == columnSegment.getColumnBoundInfo().getTableSourceType() + ? derivedColumnSuffix.getDerivedColumnName(columnSegment.getIdentifier().getValue(), databaseType) + : actualColumnName; + } + private EncryptAssignmentToken generateLiteralSQLToken(final String schemaName, final String tableName, final EncryptColumn encryptColumn, final ColumnAssignmentSegment segment, final QuoteCharacter quoteCharacter) { EncryptLiteralAssignmentToken result = @@ -109,7 +132,7 @@ public final class EncryptAssignmentTokenGenerator { final EncryptColumn encryptColumn, final ColumnAssignmentSegment segment, final EncryptLiteralAssignmentToken token) { Object originalValue = ((LiteralExpressionSegment) segment.getValue()).getLiterals(); Object cipherValue = encryptColumn.getCipher().encrypt(databaseName, schemaName, tableName, encryptColumn.getName(), Collections.singletonList(originalValue)).iterator().next(); - token.addAssignment(encryptColumn.getCipher().getName(), cipherValue); + token.addAssignment(getColumnName(segment.getColumns().get(0), EncryptDerivedColumnSuffix.CIPHER, encryptColumn.getCipher().getName()), cipherValue); } private void addAssistedQueryAssignment(final String schemaName, final String tableName, final EncryptColumn encryptColumn, @@ -118,7 +141,7 @@ public final class EncryptAssignmentTokenGenerator { if (encryptColumn.getAssistedQuery().isPresent()) { Object assistedQueryValue = encryptColumn.getAssistedQuery().get().encrypt( databaseName, schemaName, tableName, encryptColumn.getName(), Collections.singletonList(originalValue)).iterator().next(); - token.addAssignment(encryptColumn.getAssistedQuery().get().getName(), assistedQueryValue); + token.addAssignment(getColumnName(segment.getColumns().get(0), EncryptDerivedColumnSuffix.ASSISTED_QUERY, encryptColumn.getAssistedQuery().get().getName()), assistedQueryValue); } } @@ -128,7 +151,11 @@ public final class EncryptAssignmentTokenGenerator { if (encryptColumn.getLikeQuery().isPresent()) { Object assistedQueryValue = encryptColumn.getLikeQuery().get().encrypt(databaseName, schemaName, tableName, segment.getColumns().get(0).getIdentifier().getValue(), Collections.singletonList(originalValue)).iterator().next(); - token.addAssignment(encryptColumn.getLikeQuery().get().getName(), assistedQueryValue); + token.addAssignment(getColumnName(segment.getColumns().get(0), EncryptDerivedColumnSuffix.LIKE_QUERY, encryptColumn.getLikeQuery().get().getName()), assistedQueryValue); } } + + private Optional<EncryptTable> findEncryptTable(final ColumnSegment columnSegment) { + return rule.findEncryptTable(columnSegment.getColumnBoundInfo().getOriginalTable().getValue()); + } } diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptInsertAssignmentTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptInsertAssignmentTokenGenerator.java index 5547fda947c..cc10982bde2 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptInsertAssignmentTokenGenerator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptInsertAssignmentTokenGenerator.java @@ -27,6 +27,7 @@ import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator; import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import java.util.Collection; @@ -45,7 +46,16 @@ public final class EncryptInsertAssignmentTokenGenerator implements CollectionSQ @Override public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) { return sqlStatementContext instanceof InsertStatementContext && (((InsertStatementContext) sqlStatementContext).getSqlStatement()).getSetAssignment().isPresent() - && rule.findEncryptTable(((TableAvailable) sqlStatementContext).getTablesContext().getSimpleTables().iterator().next().getTableName().getIdentifier().getValue()).isPresent(); + && containsEncryptTable(((TableAvailable) sqlStatementContext).getTablesContext().getSimpleTables()); + } + + private boolean containsEncryptTable(final Collection<SimpleTableSegment> simpleTableSegments) { + for (SimpleTableSegment each : simpleTableSegments) { + if (rule.findEncryptTable(each.getTableName().getIdentifier().getValue()).isPresent()) { + return true; + } + } + return false; } @SuppressWarnings("OptionalGetWithoutIsPresent") diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptUpdateAssignmentTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptUpdateAssignmentTokenGenerator.java index ca41790067d..910f83f7386 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptUpdateAssignmentTokenGenerator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptUpdateAssignmentTokenGenerator.java @@ -27,6 +27,7 @@ import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator; import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import java.util.Collection; @@ -45,7 +46,16 @@ public final class EncryptUpdateAssignmentTokenGenerator implements CollectionSQ @Override public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) { return sqlStatementContext instanceof UpdateStatementContext - && rule.findEncryptTable(((TableAvailable) sqlStatementContext).getTablesContext().getSimpleTables().iterator().next().getTableName().getIdentifier().getValue()).isPresent(); + && containsEncryptTable(((TableAvailable) sqlStatementContext).getTablesContext().getSimpleTables()); + } + + private boolean containsEncryptTable(final Collection<SimpleTableSegment> simpleTableSegments) { + for (SimpleTableSegment each : simpleTableSegments) { + if (rule.findEncryptTable(each.getTableName().getIdentifier().getValue()).isPresent()) { + return true; + } + } + return false; } @Override diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptAssignmentTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptAssignmentTokenGeneratorTest.java index c89e9dd667c..1dfa6bfa06b 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptAssignmentTokenGeneratorTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptAssignmentTokenGeneratorTest.java @@ -21,13 +21,18 @@ import org.apache.shardingsphere.encrypt.rule.EncryptRule; import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn; import org.apache.shardingsphere.encrypt.rule.table.EncryptTable; import org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext; -import org.apache.shardingsphere.infra.database.core.metadata.database.metadata.DialectDatabaseMetaData; import org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter; +import org.apache.shardingsphere.infra.database.core.metadata.database.metadata.DialectDatabaseMetaData; import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; +import org.apache.shardingsphere.sql.parser.statement.core.enums.TableSourceType; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.ColumnAssignmentSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.SetAssignmentSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; +import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -39,6 +44,7 @@ import org.mockito.MockedConstruction; import org.mockito.junit.jupiter.MockitoExtension; import java.util.Collections; +import java.util.Optional; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -81,9 +87,11 @@ class EncryptAssignmentTokenGeneratorTest { @BeforeEach void setup() { tokenGenerator = new EncryptAssignmentTokenGenerator(mockEncryptRule(), null, null); - when(tablesContext.getSimpleTables().iterator().next().getTableName().getIdentifier().getValue()).thenReturn("table"); - when(assignmentSegment.getColumns().get(0).getIdentifier().getValue()).thenReturn("columns"); when(setAssignmentSegment.getAssignments()).thenReturn(Collections.singleton(assignmentSegment)); + ColumnSegment columnSegment = new ColumnSegment(0, 0, new IdentifierValue("columns")); + columnSegment.setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_schema")), new IdentifierValue("table"), + new IdentifierValue("columns"), TableSourceType.PHYSICAL_TABLE)); + when(assignmentSegment.getColumns()).thenReturn(Collections.singletonList(columnSegment)); } private EncryptRule mockEncryptRule() { @@ -91,7 +99,7 @@ class EncryptAssignmentTokenGeneratorTest { EncryptTable encryptTable = mock(EncryptTable.class); when(encryptTable.isEncryptColumn("columns")).thenReturn(true); when(encryptTable.getEncryptColumn("columns")).thenReturn(mock(EncryptColumn.class, RETURNS_DEEP_STUBS)); - when(result.getEncryptTable("table")).thenReturn(encryptTable); + when(result.findEncryptTable("table")).thenReturn(Optional.of(encryptTable)); return result; } diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptInsertAssignmentTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptInsertAssignmentTokenGeneratorTest.java index b23b7578fee..fd80e6617b4 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptInsertAssignmentTokenGeneratorTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptInsertAssignmentTokenGeneratorTest.java @@ -23,6 +23,10 @@ import org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatem import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.ColumnAssignmentSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.SetAssignmentSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; +import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -50,8 +54,11 @@ class EncryptInsertAssignmentTokenGeneratorTest { @BeforeEach void setup() { - tokenGenerator = new EncryptInsertAssignmentTokenGenerator(mockEncryptRule(), mock(ShardingSphereDatabase.class)); - when(insertStatementContext.getTablesContext().getSimpleTables().iterator().next().getTableName().getIdentifier().getValue()).thenReturn("table"); + EncryptRule encryptRule = mockEncryptRule(); + tokenGenerator = new EncryptInsertAssignmentTokenGenerator(encryptRule, mock(ShardingSphereDatabase.class)); + TableNameSegment tableNameSegment = new TableNameSegment(0, 0, new IdentifierValue("table")); + tableNameSegment.setTableBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_db"))); + when(insertStatementContext.getTablesContext().getSimpleTables()).thenReturn(Collections.singleton(new SimpleTableSegment(tableNameSegment))); ColumnAssignmentSegment assignmentSegment = mock(ColumnAssignmentSegment.class); when(setAssignmentSegment.getAssignments()).thenReturn(Collections.singleton(assignmentSegment)); } diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptUpdateAssignmentTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptUpdateAssignmentTokenGeneratorTest.java index c8e7efa75c3..1c4ab0ea19b 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptUpdateAssignmentTokenGeneratorTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/assignment/EncryptUpdateAssignmentTokenGeneratorTest.java @@ -22,6 +22,10 @@ import org.apache.shardingsphere.encrypt.rule.table.EncryptTable; import org.apache.shardingsphere.infra.binder.context.statement.dml.UpdateStatementContext; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.ColumnAssignmentSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; +import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -46,8 +50,11 @@ class EncryptUpdateAssignmentTokenGeneratorTest { @BeforeEach void setup() { - tokenGenerator = new EncryptUpdateAssignmentTokenGenerator(mockEncryptRule(), mock(ShardingSphereDatabase.class)); - when(updateStatementContext.getTablesContext().getSimpleTables().iterator().next().getTableName().getIdentifier().getValue()).thenReturn("table"); + EncryptRule encryptRule = mockEncryptRule(); + tokenGenerator = new EncryptUpdateAssignmentTokenGenerator(encryptRule, mock(ShardingSphereDatabase.class)); + TableNameSegment tableNameSegment = new TableNameSegment(0, 0, new IdentifierValue("table")); + tableNameSegment.setTableBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_db"))); + when(updateStatementContext.getTablesContext().getSimpleTables()).thenReturn(Collections.singleton(new SimpleTableSegment(tableNameSegment))); ColumnAssignmentSegment assignmentSegment = mock(ColumnAssignmentSegment.class); when(updateStatementContext.getSqlStatement().getSetAssignment().getAssignments()).thenReturn(Collections.singleton(assignmentSegment)); } diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/enums/SubqueryType.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/enums/SubqueryType.java index 5a711674575..dfb1fd59ff5 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/enums/SubqueryType.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/enums/SubqueryType.java @@ -22,5 +22,5 @@ package org.apache.shardingsphere.sql.parser.statement.core.enums; */ public enum SubqueryType { - PROJECTION, TABLE, JOIN, PREDICATE, INSERT_SELECT, EXISTS, WITH, VIEW_DEFINITION + PROJECTION, TABLE, JOIN, PREDICATE, INSERT_SELECT, EXISTS, WITH, VIEW_DEFINITION, UPDATE_JOIN, DELETE_JOIN } diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/ColumnSegmentBoundInfo.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/ColumnSegmentBoundInfo.java index ec2c66f70d6..dba37e23024 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/ColumnSegmentBoundInfo.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/generic/bound/ColumnSegmentBoundInfo.java @@ -36,7 +36,7 @@ public final class ColumnSegmentBoundInfo { private final TableSourceType tableSourceType; public ColumnSegmentBoundInfo(final IdentifierValue originalColumn) { - this(null, null, originalColumn, TableSourceType.TEMPORARY_TABLE); + this(null, null, originalColumn, TableSourceType.PHYSICAL_TABLE); } public ColumnSegmentBoundInfo(final TableSegmentBoundInfo tableBoundInfo, final IdentifierValue originalTable, final IdentifierValue originalColumn, final TableSourceType tableSourceType) {