Skip to content

Commit

Permalink
support using CLOSE and SEQUENCE as MySQL alias
Browse files Browse the repository at this point in the history
  • Loading branch information
zrlw authored and lizongbo committed Dec 17, 2023
1 parent 8ac8106 commit ddfecb8
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 2 deletions.
10 changes: 8 additions & 2 deletions core/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<SQLStatement> parseStatementList = parser.parseStatementList();
Assert.assertEquals(1, parseStatementList.size());
Assert.assertEquals(expectedSqls[i], parseStatementList.get(0).toString());
}
}

private String output(List<SQLStatement> stmtList) {
return SQLUtils.toSQLString(stmtList, JdbcConstants.MYSQL);
}
Expand Down

0 comments on commit ddfecb8

Please sign in to comment.