improved odps sql parser, support udf

This commit is contained in:
shaojin.wensj
2015-07-15 13:16:18 +08:00
parent e7185c4b25
commit 41af4e97a8
4 changed files with 48 additions and 0 deletions
@@ -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));
}
}