in core/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java [537:763]
public SQLExpr primaryRest(SQLExpr expr) {
if (lexer.token() == Token.COLON) {
lexer.nextToken();
if (lexer.token() == Token.LITERAL_INT && expr instanceof SQLPropertyExpr) {
SQLPropertyExpr propertyExpr = (SQLPropertyExpr) expr;
Number integerValue = lexer.integerValue();
lexer.nextToken();
propertyExpr.setName(propertyExpr.getName() + ':' + integerValue.intValue());
return propertyExpr;
}
expr = dotRest(expr);
if (expr instanceof SQLPropertyExpr) {
SQLPropertyExpr spe = (SQLPropertyExpr) expr;
spe.setSplitString(":");
}
return expr;
}
if (lexer.token() == Token.LBRACKET) {
SQLArrayExpr array = new SQLArrayExpr();
array.setExpr(expr);
lexer.nextToken();
this.exprList(array.getValues(), array);
accept(Token.RBRACKET);
return primaryRest(array);
} else if ((lexer.token() == Token.LITERAL_CHARS || lexer.token() == Token.LITERAL_ALIAS) && expr instanceof SQLCharExpr) {
SQLCharExpr charExpr = new SQLCharExpr(lexer.stringVal());
lexer.nextTokenValue();
SQLMethodInvokeExpr concat = new SQLMethodInvokeExpr("concat", null, expr, charExpr);
while (lexer.token() == Token.LITERAL_CHARS || lexer.token() == Token.LITERAL_ALIAS) {
charExpr = new SQLCharExpr(lexer.stringVal());
lexer.nextToken();
concat.addArgument(charExpr);
}
expr = concat;
}
if (lexer.token() == Token.LPAREN
&& expr instanceof SQLIdentifierExpr
&& ((SQLIdentifierExpr) expr).nameHashCode64() == FnvHash.Constants.TRANSFORM) {
String name = lexer.stringVal();
OdpsTransformExpr transformExpr = new OdpsTransformExpr();
lexer.nextToken();
List<SQLExpr> inputColumns = transformExpr.getInputColumns();
this.exprList(inputColumns, transformExpr);
accept(Token.RPAREN);
if (inputColumns.size() == 2
&& inputColumns.get(1) instanceof SQLBinaryOpExpr
&& ((SQLBinaryOpExpr) inputColumns.get(1)).getOperator() == SQLBinaryOperator.SubGt
) {
SQLMethodInvokeExpr methodInvokeExpr = new SQLMethodInvokeExpr(name);
for (SQLExpr item : inputColumns) {
methodInvokeExpr.addArgument(item);
}
return primaryRest(methodInvokeExpr);
}
if (lexer.identifierEquals(FnvHash.Constants.ROW)) {
SQLExternalRecordFormat recordFormat = this.parseRowFormat();
transformExpr.setInputRowFormat(recordFormat);
}
if (lexer.token() == Token.USING || lexer.identifierEquals(FnvHash.Constants.USING)) {
lexer.nextToken();
transformExpr.setUsing(this.expr());
}
if (lexer.identifierEquals(FnvHash.Constants.RESOURCES)) {
lexer.nextToken();
this.exprList(transformExpr.getResources(), transformExpr);
}
if (lexer.token() == Token.AS) {
lexer.nextToken();
List<SQLColumnDefinition> outputColumns = transformExpr.getOutputColumns();
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
for (; ; ) {
SQLColumnDefinition column = this.parseColumn();
outputColumns.add(column);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
}
break;
}
accept(Token.RPAREN);
} else {
SQLColumnDefinition column = new SQLColumnDefinition();
column.setName(this.name());
outputColumns.add(column);
}
}
if (lexer.identifierEquals(FnvHash.Constants.ROW)) {
SQLExternalRecordFormat recordFormat = this.parseRowFormat();
transformExpr.setOutputRowFormat(recordFormat);
}
return transformExpr;
}
if (expr instanceof SQLIdentifierExpr
&& ((SQLIdentifierExpr) expr).nameHashCode64() == FnvHash.Constants.NEW) {
SQLIdentifierExpr ident = (SQLIdentifierExpr) expr;
OdpsNewExpr newExpr = new OdpsNewExpr();
if (lexer.token() == Token.IDENTIFIER) { //.GSON
Lexer.SavePoint mark = lexer.mark();
StringBuilder methodName = new StringBuilder(lexer.stringVal());
lexer.nextToken();
switch (lexer.token()) {
case ON:
case WHERE:
case GROUP:
case ORDER:
case INNER:
case JOIN:
case FULL:
case OUTER:
case LEFT:
case RIGHT:
case LATERAL:
case FROM:
case COMMA:
case RPAREN:
return ident;
default:
break;
}
while (lexer.token() == Token.DOT) {
lexer.nextToken();
methodName.append('.').append(lexer.stringVal());
lexer.nextToken();
}
newExpr.setMethodName(methodName.toString());
if (lexer.token() == Token.LT) {
lexer.nextToken();
for (; ; ) {
if (lexer.token() == Token.GT) {
break;
}
SQLDataType paramType = this.parseDataType(false);
paramType.setParent(newExpr);
newExpr.getTypeParameters().add(paramType);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
}
break;
}
accept(Token.GT);
}
if (lexer.token() == Token.LBRACKET) {
lexer.nextToken();
this.exprList(newExpr.getArguments(), newExpr);
accept(Token.RBRACKET);
if (lexer.token() == Token.LBRACKET) {
lexer.nextToken();
accept(Token.RBRACKET);
}
newExpr.setArray(true);
if (lexer.token() == Token.LBRACE) {
lexer.nextToken();
for (; ; ) {
if (lexer.token() == Token.RPAREN) {
break;
}
SQLExpr item = this.expr();
newExpr.getInitValues().add(item);
item.setParent(newExpr);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
}
break;
}
accept(Token.RBRACE);
}
if (lexer.token() == Token.LBRACKET) {
expr = primaryRest(newExpr);
} else {
expr = newExpr;
}
} else {
accept(Token.LPAREN);
this.exprList(newExpr.getArguments(), newExpr);
accept(Token.RPAREN);
expr = newExpr;
}
} else if (lexer.identifierEquals("java") || lexer.identifierEquals("com")) {
SQLName name = this.name();
StringBuilder strName = new StringBuilder();
strName.append(ident.getName()).append(' ').append(name.toString());
if (lexer.token() == Token.LT) {
lexer.nextToken();
for (int i = 0; lexer.token() != Token.GT; i++) {
if (i != 0) {
strName.append(", ");
}
SQLName arg = this.name();
strName.append(arg.toString());
}
lexer.nextToken();
}
ident.setName(strName.toString());
}
}
if (expr == null) {
return null;
}
return super.primaryRest(expr);
}