From ddfecb82abac98ba0ecb0f706002f8898e893c31 Mon Sep 17 00:00:00 2001 From: zrlw Date: Sun, 17 Dec 2023 13:09:53 +0800 Subject: [PATCH] support using CLOSE and SEQUENCE as MySQL alias --- .../alibaba/druid/sql/parser/SQLParser.java | 10 +++- .../bvt/sql/mysql/SELECT_Syntax_Test.java | 58 +++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java index 75dc32df26..e64f9093aa 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java @@ -555,14 +555,20 @@ protected String as() { } break; } + case CLOSE: + case SEQUENCE: + if (dbType == DbType.mysql || dbType == DbType.odps || dbType == DbType.hive) { + alias = lexer.stringVal(); + lexer.nextToken(); + break; + } + break; case CHECK: case INDEX: case ALL: case INNER: - case CLOSE: case VALUES: case SHOW: - case SEQUENCE: case TO: case REFERENCES: case LIKE: diff --git a/core/src/test/java/com/alibaba/druid/bvt/sql/mysql/SELECT_Syntax_Test.java b/core/src/test/java/com/alibaba/druid/bvt/sql/mysql/SELECT_Syntax_Test.java index e44ad48aa1..0a57160752 100644 --- a/core/src/test/java/com/alibaba/druid/bvt/sql/mysql/SELECT_Syntax_Test.java +++ b/core/src/test/java/com/alibaba/druid/bvt/sql/mysql/SELECT_Syntax_Test.java @@ -271,6 +271,64 @@ public void test_15() throws Exception { Assert.assertEquals("select s1\nfrom t1\nwhere s1 not in (?, ?, ?);", SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); } + public void test_16() throws Exception { + // test some keywords that MySQL allows them to be taken as field alias. + String[] sqls = { + "select a.da comment from (select a ad from a ) t", + "select orderId, orderCode from ( select pms_order.remark comment from pms_order) t_order", + "select ada comment from (select a comment from a ) t", + "select comment from (select a comment from a ) t", + "select a TRUNCATE from t", + "select a view from t", + "select a SEQUENCE, (select 1) bb,(select id from tt limit 1) view from (select a do from b) `truncate` ", + "select a tablespace from t", + "select a do from t", + "select a any from t limit 5", + "select a close from t limit 5", + "select a , (select b SEQUENCE from demo limit 1) from t", + "select a enable from t", + "select a disable from t", + "select a cast from t", + "select a escape from t", + "select a minus from t", + "select a some from t", + "select a compute from t", + "select a until from t", + "select a open from t" + }; + + String[] expectedSqls = { + "SELECT a.da AS comment\nFROM (\n\tSELECT a AS ad\n\tFROM a\n) t", + "SELECT orderId, orderCode\nFROM (\n\tSELECT pms_order.remark AS comment\n\tFROM pms_order\n) t_order", + "SELECT ada AS comment\nFROM (\n\tSELECT a AS comment\n\tFROM a\n) t", + "SELECT comment\nFROM (\n\tSELECT a AS comment\n\tFROM a\n) t", + "SELECT a AS TRUNCATE\nFROM t", + "SELECT a AS view\nFROM t", + "SELECT a AS SEQUENCE\n\t, (\n\t\tSELECT 1\n\t) AS bb\n\t, (\n\t\tSELECT id\n\t\tFROM tt\n\t\tLIMIT 1\n\t) AS view\nFROM (\n\tSELECT a AS do\n\tFROM b\n) `truncate`", + "SELECT a AS tablespace\nFROM t", + "SELECT a AS do\nFROM t", + "SELECT a AS any\nFROM t\nLIMIT 5", + "SELECT a AS close\nFROM t\nLIMIT 5", + "SELECT a\n\t, (\n\t\tSELECT b AS SEQUENCE\n\t\tFROM demo\n\t\tLIMIT 1\n\t)\nFROM t", + "SELECT a AS enable\nFROM t", + "SELECT a AS disable\nFROM t", + "SELECT a AS cast\nFROM t", + "SELECT a AS escape\nFROM t", + "SELECT a AS minus\nFROM t", + "SELECT a AS some\nFROM t", + "SELECT a AS compute\nFROM t", + "SELECT a AS until\nFROM t", + "SELECT a AS open\nFROM t" + }; + + for (int i = 0; i < sqls.length; i++) { + MySqlStatementParser parser = new MySqlStatementParser(sqls[i]); + List parseStatementList = parser.parseStatementList(); + Assert.assertEquals(1, parseStatementList.size()); + Assert.assertEquals(expectedSqls[i], parseStatementList.get(0).toString()); + } + } + private String output(List stmtList) { return SQLUtils.toSQLString(stmtList, JdbcConstants.MYSQL); }