From 2f6b3fcaca1141d81227c4c310ed40f17e326e1d Mon Sep 17 00:00:00 2001 From: LiZongbo Date: Mon, 10 Jul 2023 00:29:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dmysql=E8=AF=AD=E5=8F=A5?= =?UTF-8?q?=E4=B8=ADpartition=E5=92=8C=E5=88=AB=E5=90=8D=E7=9A=84=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=E9=97=AE=E9=A2=98=20#5351?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复mysql语句中partition和别名的顺序问题 #5351 --- .../mysql/visitor/MySqlOutputVisitor.java | 12 ++--- .../select/MySqlSelectTest_partition.java | 44 +++++++++++++++++++ 2 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 core/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_partition.java diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index d7555e2657..b49fb99b67 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -3599,6 +3599,12 @@ public boolean visit(SQLExprTableSource x) { sampling.accept(this); } + if (x.getPartitionSize() > 0) { + print0(ucase ? " PARTITION (" : " partition ("); + printlnAndAccept(x.getPartitions(), ", "); + print(')'); + } + String alias = x.getAlias(); List columns = x.getColumnsDirect(); if (alias != null) { @@ -3620,12 +3626,6 @@ public boolean visit(SQLExprTableSource x) { x.getHints().get(i).accept(this); } - if (x.getPartitionSize() > 0) { - print0(ucase ? " PARTITION (" : " partition ("); - printlnAndAccept(x.getPartitions(), ", "); - print(')'); - } - return false; } diff --git a/core/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_partition.java b/core/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_partition.java new file mode 100644 index 0000000000..cf55451e1e --- /dev/null +++ b/core/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_partition.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.bvt.sql.mysql.select; + +import java.util.List; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; + +public class MySqlSelectTest_partition extends MysqlTest { + public void test_0() throws Exception { + String sql = "select\n" + + " p.id as id,\n" + + " c.template_no as templateNo\n" + + " from\n" + + " contract_relation_party partition(p0) p\n" + + " left join\n" + + " contract partition(p0) c\n" + + " on\n" + + " p.contract_sn = c.contract_sn\n" + + " and p.contract_id_no = c.id_no\n" + + " where p.seal_type is null\n" + + " order by p.update_time asc\n" + + " limit 5"; + + //System.out.println(sql); + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + + assertEquals(1, statementList.size()); + //System.out.println(stmt.toString()); + assertEquals("SELECT p.id AS id, c.template_no AS templateNo\n" + + "FROM contract_relation_party PARTITION (p0) p\n" + + "\tLEFT JOIN contract PARTITION (p0) c\n" + + "\tON p.contract_sn = c.contract_sn\n" + + "\t\tAND p.contract_id_no = c.id_no\n" + + "WHERE p.seal_type IS NULL\n" + + "ORDER BY p.update_time ASC\n" + + "LIMIT 5", stmt.toString()); + } +} \ No newline at end of file