This is an automated email from the ASF dual-hosted git repository. zhaojinchao 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 8006e84a660 Fix mysql assignment column value parsing (#34975) 8006e84a660 is described below commit 8006e84a6606eb66baf05241759f7b5be6ec99c2 Author: ZhangCheng <chengzh...@apache.org> AuthorDate: Thu Mar 13 19:00:55 2025 +0800 Fix mysql assignment column value parsing (#34975) * Extract join where segment from update statement * Extract join where segment from update statement * Extract join where segment from update statement --- .../binder/context/statement/dml/UpdateStatementContext.java | 6 +++++- .../sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java | 7 +------ test/it/parser/src/main/resources/case/dml/insert.xml | 8 ++++++-- test/it/parser/src/main/resources/case/dml/update.xml | 4 ++-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/UpdateStatementContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/UpdateStatementContext.java index 999c576a558..915053e23c0 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/UpdateStatementContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/UpdateStatementContext.java @@ -54,11 +54,15 @@ public final class UpdateStatementContext extends CommonSQLStatementContext impl public UpdateStatementContext(final UpdateStatement sqlStatement) { super(sqlStatement); tablesContext = new TablesContext(getAllSimpleTableSegments()); - getSqlStatement().getWhere().ifPresent(whereSegments::add); + extractWhereSegments(whereSegments, sqlStatement); ColumnExtractor.extractColumnSegments(columnSegments, whereSegments); ExpressionExtractor.extractJoinConditions(joinConditions, whereSegments); } + private void extractWhereSegments(final Collection<WhereSegment> whereSegments, final UpdateStatement updateStatement) { + updateStatement.getWhere().ifPresent(whereSegments::add); + } + private Collection<SimpleTableSegment> getAllSimpleTableSegments() { TableExtractor tableExtractor = new TableExtractor(); tableExtractor.extractTablesFromUpdate(getSqlStatement()); diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java index d098d9757cc..96b723e2106 100644 --- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java +++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java @@ -1613,12 +1613,7 @@ public abstract class MySQLStatementVisitor extends MySQLStatementBaseVisitor<AS public ASTNode visitAssignmentValue(final AssignmentValueContext ctx) { ExprContext expr = ctx.expr(); if (null != expr) { - ASTNode result = visit(expr); - if (result instanceof ColumnSegment) { - return new CommonExpressionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.getText()); - } else { - return result; - } + return visit(expr); } return new CommonExpressionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.getText()); } diff --git a/test/it/parser/src/main/resources/case/dml/insert.xml b/test/it/parser/src/main/resources/case/dml/insert.xml index 15c5b983210..40770270601 100644 --- a/test/it/parser/src/main/resources/case/dml/insert.xml +++ b/test/it/parser/src/main/resources/case/dml/insert.xml @@ -508,13 +508,17 @@ <assignment start-index="65" stop-index="69"> <column name="b" start-index="65" stop-index="65" /> <assignment-value> - <common-expression literal-text="n.a" start-index="67" stop-index="69" /> + <column name="a" start-index="67" stop-index="69"> + <owner name="n" start-index="67" stop-index="67" /> + </column> </assignment-value> </assignment> <assignment start-index="72" stop-index="76"> <column name="a" start-index="72" stop-index="72" /> <assignment-value> - <common-expression literal-text="n.b" start-index="74" stop-index="76" /> + <column name="b" start-index="74" stop-index="76" > + <owner name="n" start-index="74" stop-index="74" /> + </column> </assignment-value> </assignment> </on-duplicate-key-columns> diff --git a/test/it/parser/src/main/resources/case/dml/update.xml b/test/it/parser/src/main/resources/case/dml/update.xml index 890e3d01c74..1a2fe36f9fb 100644 --- a/test/it/parser/src/main/resources/case/dml/update.xml +++ b/test/it/parser/src/main/resources/case/dml/update.xml @@ -577,14 +577,14 @@ <assignment start-index="19" stop-index="37" literal-stop-index="37"> <column name="order_id" start-index="19" stop-index="26" /> <assignment-value> - <common-expression text="order_id" literal-text="order_id" start-index="30" stop-index="37" literal-start-index="30" literal-stop-index="37" /> + <column name="order_id" start-index="30" stop-index="37" literal-start-index="30" literal-stop-index="37" /> </assignment-value> </assignment> <assignment start-index="40" stop-index="54" literal-stop-index="54"> <column name="status" start-index="40" stop-index="45" /> <assignment-value> <literal-expression value="init" start-index="49" stop-index="54" /> - <common-expression text="init" start-index="49" stop-index="54" literal-start-index="49" literal-stop-index="54" /> + <column name="init" start-index="49" stop-index="54" literal-start-index="49" literal-stop-index="54" /> </assignment-value> </assignment> </set>