in core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java [6587:6849]
protected void parseValueClause(
List<SQLInsertStatement.ValuesClause> valueClauseList,
List<SQLColumnDefinition> columnDefinitionList,
int columnSize,
SQLObject parent
) {
final boolean optimizedForParameterized = lexer.isEnabled(SQLParserFeature.OptimizedForForParameterizedSkipValue);
SQLInsertStatement.ValuesClause values;
for (int i = 0; ; ++i) {
int startPos = lexer.pos - 1;
if (lexer.token == Token.ROW) {
lexer.nextToken();
}
if (lexer.token != Token.LPAREN) {
throw new ParserException("syntax error, expect ')', " + lexer.info());
}
// lexer.nextTokenValue();
if (lexer.ch == '\'') { // for performance
lexer.bufPos = 0;
lexer.scanString();
} else if (lexer.ch == '0') {
lexer.bufPos = 0;
if (lexer.charAt(lexer.pos + 1) == 'x') {
lexer.scanChar();
lexer.scanChar();
lexer.scanHexaDecimal();
} else {
lexer.scanNumber();
}
} else if (lexer.ch > '0' && lexer.ch <= '9') {
lexer.bufPos = 0;
lexer.scanNumber();
} else if (lexer.ch == '-' && lexer.charAt(lexer.pos + 1) != '-') {
lexer.bufPos = 0;
lexer.scanNumber();
} else {
lexer.nextTokenValue();
}
if (lexer.token() != Token.RPAREN) {
List valueExprList;
if (columnSize > 0) {
valueExprList = new ArrayList(columnSize);
} else {
valueExprList = new ArrayList();
}
values = new SQLInsertStatement.ValuesClause(valueExprList, parent);
for (int j = 0; ; ++j) {
SQLExpr expr;
SQLColumnDefinition columnDefinition = null;
if (columnDefinitionList != null && j < columnDefinitionList.size()) {
columnDefinition = columnDefinitionList.get(j);
}
SQLDataType dataType = null;
if (columnDefinition != null) {
dataType = columnDefinition.getDataType();
}
if (lexer.token == Token.LITERAL_INT) {
if (optimizedForParameterized) {
expr = new SQLVariantRefExpr("?", values);
values.incrementReplaceCount();
} else {
expr = new SQLIntegerExpr(lexer.integerValue(), values);
}
if (lexer.ch == ',') {
lexer.ch = lexer.charAt(++lexer.pos);
lexer.token = COMMA;
} else {
lexer.nextTokenCommaValue();
}
if (lexer.token != Token.COMMA && lexer.token != Token.RPAREN) {
expr = this.exprParser.exprRest(expr);
expr.setParent(values);
}
} else if (lexer.token == Token.LITERAL_CHARS) {
if (optimizedForParameterized) {
expr = new SQLVariantRefExpr("?", values);
values.incrementReplaceCount();
} else {
expr = new SQLCharExpr(lexer.stringVal(), values);
}
if (lexer.ch == ',') {
lexer.ch = lexer.charAt(++lexer.pos);
lexer.token = COMMA;
} else {
lexer.nextTokenCommaValue();
}
if (lexer.token != Token.COMMA && lexer.token != Token.RPAREN) {
expr = this.exprParser.exprRest(expr);
expr.setParent(values);
}
} else if (lexer.token == Token.LITERAL_NCHARS) {
if (optimizedForParameterized) {
expr = new SQLVariantRefExpr("?", values);
values.incrementReplaceCount();
} else {
expr = new SQLNCharExpr(lexer.stringVal(), values);
}
if (lexer.ch == ',') {
lexer.ch = lexer.charAt(++lexer.pos);
lexer.token = COMMA;
} else {
lexer.nextTokenCommaValue();
}
if (lexer.token != Token.COMMA && lexer.token != Token.RPAREN) {
expr = this.exprParser.exprRest(expr);
expr.setParent(values);
}
} else if (lexer.token == Token.LITERAL_FLOAT) {
if (optimizedForParameterized) {
expr = new SQLVariantRefExpr("?", values);
values.incrementReplaceCount();
} else {
SQLNumberExpr numberExpr = lexer.numberExpr(values);
if (dataType != null
&& dataType.nameHashCode64() == Constants.DECIMAL) {
Number number = numberExpr.getNumber();
int precision = 0, scale = 0;
List<SQLExpr> arguments = dataType.getArguments();
if (arguments.size() > 0) {
SQLExpr arg0 = arguments.get(0);
if (arg0 instanceof SQLIntegerExpr) {
precision = ((SQLIntegerExpr) arg0).getNumber().intValue();
}
}
if (arguments.size() > 1) {
SQLExpr arg0 = arguments.get(1);
if (arg0 instanceof SQLIntegerExpr) {
scale = ((SQLIntegerExpr) arg0).getNumber().intValue();
}
}
if (number instanceof BigDecimal) {
number = MySqlUtils.decimal((BigDecimal) number, precision, scale);
numberExpr.setNumber(number);
}
}
expr = numberExpr;
}
if (lexer.ch == ',') {
lexer.ch = lexer.charAt(++lexer.pos);
lexer.token = COMMA;
} else {
lexer.nextTokenCommaValue();
}
if (lexer.token != Token.COMMA && lexer.token != Token.RPAREN) {
expr = this.exprParser.exprRest(expr);
expr.setParent(values);
}
} else if (lexer.token == Token.NULL) {
if (optimizedForParameterized) {
expr = new SQLVariantRefExpr("?", parent);
values.incrementReplaceCount();
} else {
expr = new SQLNullExpr(parent);
}
lexer.nextTokenCommaValue();
if (lexer.token != Token.COMMA && lexer.token != Token.RPAREN) {
expr = this.exprParser.exprRest(expr);
expr.setParent(values);
}
} else {
expr = exprParser.expr();
expr.setParent(values);
}
if (lexer.token == Token.COMMA) {
valueExprList.add(expr);
if (lexer.ch == '\'') { // for performance
lexer.bufPos = 0;
lexer.scanString();
} else if (lexer.ch == '0') {
lexer.bufPos = 0;
if (lexer.charAt(lexer.pos + 1) == 'x') {
lexer.scanChar();
lexer.scanChar();
lexer.scanHexaDecimal();
} else {
lexer.scanNumber();
}
} else if (lexer.ch > '0' && lexer.ch <= '9') {
lexer.bufPos = 0;
lexer.scanNumber();
} else if (lexer.ch == '-' && lexer.charAt(lexer.pos + 1) != '-') {
lexer.bufPos = 0;
lexer.scanNumber();
} else {
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);
}
expr.setParent(values);
valueExprList.add(expr);
if (lexer.token == Token.COMMA) {
lexer.nextTokenValue();
continue;
} else {
break;
}
}
}
if (lexer.isEnabled(SQLParserFeature.KeepInsertValueClauseOriginalString)) {
int endPos = lexer.pos();
String orginalString = lexer.subString(startPos, endPos - startPos);
values.setOriginalString(orginalString);
}
} else {
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();
while (lexer.token == Token.HINT) {
this.exprParser.parseHints();
}
if (lexer.token == Token.COMMA) {
lexer.nextTokenLParen();
if (values != null) {
columnSize = values.getValues().size();
}
continue;
} else {
break;
}
}
}