Skip to content

Commit

Permalink
Merge branch 'alibaba:master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
lizongbo committed Apr 29, 2024
2 parents d0b6e9b + 957bbab commit 1bf7ba0
Show file tree
Hide file tree
Showing 8 changed files with 105 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -422,9 +422,12 @@ public SQLExpr primary() {
sqlExpr = new OracleBinaryDoubleExpr(Double.parseDouble(lexer.numberString()) * -1);
lexer.nextToken();
break;
case IDENTIFIER:
sqlExpr = primary();
sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, sqlExpr);
break;
case VARIANT:
case QUES:
case IDENTIFIER:
case LITERAL_ALIAS:
sqlExpr = expr();
sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, sqlExpr);
Expand Down Expand Up @@ -915,16 +918,20 @@ protected SQLAggregateExpr parseAggregateExpr(String methodName) {
endExpr = new SQLIdentifierExpr("CURRENT ROW");
} else if (lexer.identifierEquals(FnvHash.Constants.UNBOUNDED)) {
lexer.nextToken();
if (lexer.stringVal().equalsIgnoreCase("PRECEDING")) {
if (lexer.stringVal().equalsIgnoreCase("FOLLOWING")) {
lexer.nextToken();
endExpr = new SQLIdentifierExpr("UNBOUNDED PRECEDING");
endExpr = new SQLIdentifierExpr("UNBOUNDED FOLLOWING");
} else {
throw new ParserException("syntax error. " + lexer.info());
}
} else {
endExpr = relational();
}

final SQLOver.WindowingBound endBound = parseWindowingBound();
if (endBound != null) {
over.setWindowingBetweenEndBound(endBound);
}
SQLExpr expr = new SQLBetweenExpr(null, beginExpr, endExpr);
windowing.setExpr(expr);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -892,8 +892,12 @@ protected SQLTableSource parseTableSourceRest(OracleSelectTableSource tableSourc

SQLTableSource right;
right = parseTableSourcePrimary();
String tableAlias = tableAlias();
right.setAlias(tableAlias);
// Alias is already set for "... JOIN (tbl1 alias1) ON ..." syntax,
// so skip setting alias
if (right.getAlias() == null) {
String tableAlias = tableAlias();
right.setAlias(tableAlias);
}
join.setRight(right);

if (lexer.token() == Token.ON) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,9 @@ public boolean visit(OracleAnalytic x) {
if (x.isWindowingPreceding()) {
print0(ucase ? " PRECEDING" : " preceding");
}
if (x.isWindowingBetweenEndFollowing()) {
print0(ucase ? " FOLLOWING" : " following");
}

print(')');

Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/com/alibaba/druid/util/OracleUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ public static List<String> getTableDDL(Connection conn, List<String> tables) thr
sql.append("select DBMS_METADATA.GET_DDL('TABLE', TABLE_NAME) FROM user_tables");

if (tables.size() > 0) {
sql.append("IN (");
sql.append(" WHERE TABLE_NAME IN (");
for (int i = 0; i < tables.size(); ++i) {
if (i != 0) {
sql.append(", ?");
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/resources/support/http/resources/header.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
<li><a href="api.html" class="lang" langKey="JSON API">JSON API</a></li>
</ul>
<a langKey="ResetAll" class="btn btn-primary lang"
href="javascript:return druid.common.ajaxRequestForReset();">Reset All</a>
href="javascript:druid.common.ajaxRequestForReset();">Reset All</a>
<a langKey="LogAndReset" class="btn btn-primary lang"
href="javascript:return druid.common.ajaxRequestForLogAndReset();">Log And Reset</a>
href="javascript:druid.common.ajaxRequestForLogAndReset();">Log And Reset</a>
</div>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,44 @@ public void test_0() throws Exception {
assertEquals("SELECT J01.COL_A, J01.COL_B, \"SUM\"(J01.COL_C) OVER (PARTITION BY J01.COL_A ORDER BY J01.COL_B NULLS FIRST ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS COL_C\n" +
"FROM TAB_A J01", stmt.toString());
}
public void test_1() throws Exception {
String sql = "SELECT\n" +
"J01.COL_A,\n" +
"J01.COL_B,\n" +
"\"SUM\"(J01.COL_C) OVER (\n" +
"PARTITION BY J01.COL_A ORDER BY J01.COL_B NULLS FIRST ROWS BETWEEN 5 PRECEDING AND 8 FOLLOWING\n" +
") AS COL_C\n" +
"FROM\n" +
"TAB_A J01";

List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE);

assertEquals(1, statementList.size());

SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0);
System.out.println(stmt.toString());

assertEquals("SELECT J01.COL_A, J01.COL_B, \"SUM\"(J01.COL_C) OVER (PARTITION BY J01.COL_A ORDER BY J01.COL_B NULLS FIRST ROWS BETWEEN 5 PRECEDING AND 8 FOLLOWING) AS COL_C\n" +
"FROM TAB_A J01", stmt.toString());
}

public void test_2() throws Exception {
String sql = "SELECT\n" +
"J01.COL_A,\n" +
"J01.COL_B,\n" +
"\"SUM\"(J01.COL_C) OVER (\n" +
"PARTITION BY J01.COL_A ORDER BY J01.COL_B NULLS FIRST ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING\n" +
") AS COL_C\n" +
"FROM\n" +
"TAB_A J01";

List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE);

assertEquals(1, statementList.size());

SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0);
System.out.println(stmt.toString());
assertEquals("SELECT J01.COL_A, J01.COL_B, \"SUM\"(J01.COL_C) OVER (PARTITION BY J01.COL_A ORDER BY J01.COL_B NULLS FIRST ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS COL_C\n" +
"FROM TAB_A J01", stmt.toString());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,4 +94,31 @@ public void test_0() throws Exception {

// Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name")));
}

public void testSelectWithJoin_UnderParen() {
String sql = "SELECT /* NUSQL.TEST */\n" +
" A.ID,\n" +
" B.NAME,\n" +
" C.TYPE\n" +
"FROM\n" +
" tbl_name1 A\n" +
" LEFT JOIN (tbl_name2 B)\n" +
" ON A.ID = B.ID\n" +
" LEFT JOIN (tbl_name3 C)\n" +
" ON A.ID = C.ID\n" +
" AND A.NAME = B.NAME";

OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statement = statementList.get(0);
print(statementList);

Assert.assertEquals(1, statementList.size());

OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statement.accept(visitor);

Assert.assertEquals(3, visitor.getTables().size());
Assert.assertEquals(6, visitor.getColumns().size());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,21 @@ public void test_0() throws Exception {
// Assert.assertTrue(visitor.containsColumn("sup_task", "orgid"));
//
}

public void test_1() throws Exception {
String sql = "SELECT * FROM employees WHERE -salary < 0 ORDER BY employee_id";

OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statement = statementList.get(0);
print(statementList);

Assert.assertEquals(1, statementList.size());

OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statement.accept(visitor);

Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(3, visitor.getColumns().size());
}
}

0 comments on commit 1bf7ba0

Please sign in to comment.