imporved sql parser. improved h2 support. for issue #1941 #1942

This commit is contained in:
wenshao
2017-09-10 16:11:19 +08:00
parent 61794c4c19
commit 19501d678d
52 changed files with 922 additions and 370 deletions
@@ -22,7 +22,6 @@ import com.alibaba.druid.sql.ast.*;
import com.alibaba.druid.sql.ast.expr.*;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement.TriggerType;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser;
import com.alibaba.druid.util.FnvHash;
import com.alibaba.druid.util.JdbcConstants;
@@ -2600,7 +2599,7 @@ public class SQLStatementParser extends SQLParser {
this.parseValuesSize = parseValuesSize;
}
public SQLMergeStatement parseMerge() {
public SQLStatement parseMerge() {
accept(Token.MERGE);
SQLMergeStatement stmt = new SQLMergeStatement();
@@ -2870,4 +2869,93 @@ public class SQLStatementParser extends SQLParser {
throw new ParserException("TODO. " + lexer.info());
}
protected void parseValueClause(List<SQLInsertStatement.ValuesClause> valueClauseList, int columnSize, SQLObject parent) {
for (int i = 0; ; ++i) {
int startPos = lexer.pos() - 1;
if (lexer.token() != Token.LPAREN) {
throw new ParserException("syntax error, expect ')', " + lexer.info());
}
lexer.nextTokenValue();
if (lexer.token() != Token.RPAREN) {
List<SQLExpr> valueExprList;
if (columnSize > 0) {
valueExprList = new ArrayList<SQLExpr>(columnSize);
} else {
valueExprList = new ArrayList<SQLExpr>();
}
for (; ; ) {
SQLExpr expr;
if (lexer.token() == Token.LITERAL_INT) {
expr = new SQLIntegerExpr(lexer.integerValue());
lexer.nextTokenComma();
} else if (lexer.token() == Token.LITERAL_CHARS) {
expr = new SQLCharExpr(lexer.stringVal());
lexer.nextTokenComma();
} else if (lexer.token() == Token.LITERAL_NCHARS) {
expr = new SQLNCharExpr(lexer.stringVal());
lexer.nextTokenComma();
} else {
expr = exprParser.expr();
}
if (lexer.token() == Token.COMMA) {
valueExprList.add(expr);
lexer.nextTokenValue();
continue;
} else if (lexer.token() == Token.RPAREN) {
valueExprList.add(expr);
break;
} else {
expr = this.exprParser.primaryRest(expr);
if (lexer.token() != Token.COMMA && lexer.token() != Token.RPAREN) {
expr = this.exprParser.exprRest(expr);
}
valueExprList.add(expr);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
} else {
break;
}
}
}
SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(valueExprList);
values.setParent(parent);
if (lexer.isEnabled(SQLParserFeature.KeepInsertValueClauseOriginalString)) {
int endPos = lexer.pos();
String orginalString = lexer.subString(startPos, endPos - startPos);
values.setOriginalString(orginalString);
}
valueClauseList.add(values);
} else {
SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(new ArrayList<SQLExpr>(0));
valueClauseList.add(values);
}
if (lexer.token() != Token.RPAREN) {
throw new ParserException("syntax error. " + lexer.info());
}
if (!parseCompleteValues && valueClauseList.size() >= parseValuesSize) {
lexer.skipToEOF();
break;
}
lexer.nextTokenComma();
if (lexer.token() == Token.COMMA) {
lexer.nextTokenLParen();
continue;
} else {
break;
}
}
}
}