mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved odps sql parser, support udf
This commit is contained in:
@@ -21,6 +21,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
|
||||
import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem;
|
||||
import com.alibaba.druid.sql.parser.Lexer;
|
||||
import com.alibaba.druid.sql.parser.ParserException;
|
||||
import com.alibaba.druid.sql.parser.SQLExprParser;
|
||||
import com.alibaba.druid.sql.parser.Token;
|
||||
|
||||
@@ -111,4 +112,13 @@ public class OdpsExprParser extends SQLExprParser {
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
public SQLExpr primaryRest(SQLExpr expr) {
|
||||
if(lexer.token() == Token.COLON) {
|
||||
lexer.nextToken();
|
||||
expr = dotRest(expr);
|
||||
return expr;
|
||||
}
|
||||
return super.primaryRest(expr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -301,4 +301,13 @@ public class OdpsLexer extends Lexer {
|
||||
}
|
||||
}
|
||||
|
||||
public void scanVariable() {
|
||||
if (ch == ':') {
|
||||
token = Token.COLON;
|
||||
ch = charAt(++pos);
|
||||
return;
|
||||
}
|
||||
|
||||
super.scanVariable();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import com.alibaba.druid.sql.ast.SQLOrderBy;
|
||||
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
|
||||
@@ -621,4 +622,16 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean visit(SQLMethodInvokeExpr x) {
|
||||
if (x.getOwner() != null) {
|
||||
x.getOwner().accept(this);
|
||||
print(":");
|
||||
}
|
||||
print(x.getMethodName());
|
||||
print("(");
|
||||
printAndAccept(x.getParameters(), ", ");
|
||||
print(")");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.alibaba.druid.bvt.sql.odps;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
public class OdpsUDFTest extends TestCase {
|
||||
|
||||
public void test_if() throws Exception {
|
||||
String sql = "select secods:ip_region('192.168.1.1', 'city') from dual";
|
||||
Assert.assertEquals("SELECT secods:ip_region('192.168.1.1', 'city')" //
|
||||
+ "\nFROM dual", SQLUtils.formatOdps(sql));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user