in core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java [6313:6585]
public void parseValueClause(SQLInsertValueHandler valueHandler) throws SQLException {
for (; ; ) {
if (lexer.token != Token.LPAREN) {
throw new ParserException("syntax error, expect ')', " + lexer.info());
}
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.scanNumber();
} else {
lexer.nextTokenValue();
}
if (lexer.token() != Token.RPAREN) {
Object row = valueHandler.newRow();
for (int j = 0; ; ++j) {
switch (lexer.token) {
case LITERAL_INT: {
Number number = lexer.integerValue();
if (lexer.ch == ',') {
lexer.ch = lexer.charAt(++lexer.pos);
lexer.token = COMMA;
} else {
lexer.nextTokenCommaValue();
}
if (lexer.token != Token.COMMA && lexer.token != Token.RPAREN) {
throw new ParserException("insert value error, " + lexer.info());
}
valueHandler.processInteger(row, j, number);
break;
}
case LITERAL_CHARS:
case LITERAL_NCHARS: {
String strVal = lexer.stringVal();
if (lexer.ch == ',') {
lexer.ch = lexer.charAt(++lexer.pos);
lexer.token = COMMA;
} else {
lexer.nextTokenCommaValue();
}
if (lexer.token != Token.COMMA && lexer.token != Token.RPAREN) {
throw new ParserException("insert value error, " + lexer.info());
}
valueHandler.processString(row, j, strVal);
break;
}
case LITERAL_FLOAT: {
BigDecimal number = lexer.decimalValue();
if (lexer.ch == ',') {
lexer.ch = lexer.charAt(++lexer.pos);
lexer.token = COMMA;
} else {
lexer.nextTokenCommaValue();
}
if (lexer.token != Token.COMMA && lexer.token != Token.RPAREN) {
throw new ParserException("insert value error, " + lexer.info());
}
valueHandler.processDecimal(row, j, number);
break;
}
case NULL: {
lexer.nextTokenCommaValue();
if (lexer.token != Token.COMMA && lexer.token != Token.RPAREN) {
throw new ParserException("insert value error, " + lexer.info());
}
valueHandler.processNull(row, j);
break;
}
case TRUE:
valueHandler.processBoolean(row, j, true);
lexer.nextTokenComma();
break;
case FALSE:
valueHandler.processBoolean(row, j, false);
lexer.nextTokenComma();
break;
case IDENTIFIER: {
long hash = lexer.hashLCase();
if (hash == Constants.DATE) {
lexer.nextTokenValue();
String strVal = lexer.stringVal();
valueHandler.processDate(row, j, strVal);
lexer.nextTokenComma();
} else if (hash == Constants.TIMESTAMP) {
lexer.nextTokenValue();
String strVal = lexer.stringVal();
valueHandler.processTimestamp(row, j, strVal);
lexer.nextTokenComma();
} else if (hash == Constants.TIME) {
lexer.nextTokenValue();
String strVal = lexer.stringVal();
valueHandler.processTime(row, j, strVal);
lexer.nextTokenComma();
} else if (hash == Constants.DECIMAL) {
lexer.nextTokenValue();
String strVal = lexer.stringVal();
BigDecimal decimal = new BigDecimal(strVal);
valueHandler.processDecimal(row, j, decimal);
lexer.nextTokenComma();
} else if (hash == Constants.CURDATE
|| hash == Constants.CUR_DATE
|| hash == Constants.CURRENT_DATE
|| hash == Constants.SYSDATE) {
lexer.nextTokenLParen();
if (lexer.token == Token.LPAREN) {
lexer.nextToken();
accept(Token.RPAREN);
}
if (currentDate == null) {
currentDate = new java.sql.Date(now.getTime());
}
valueHandler.processDate(row, j, currentDate);
} else if (hash == Constants.NOW
|| hash == Constants.CURRENT_TIMESTAMP) {
lexer.nextTokenLParen();
if (lexer.token == Token.LPAREN) {
lexer.nextToken();
accept(Token.RPAREN);
}
if (now == null) {
now = new java.sql.Timestamp(System.currentTimeMillis());
}
valueHandler.processTimestamp(row, j, now);
} else if (hash == Constants.UUID) {
String funcName = lexer.stringVal();
lexer.nextTokenLParen();
if (lexer.token == Token.LPAREN) {
lexer.nextToken();
accept(Token.RPAREN);
} else {
throw new ParserException("insert value error, " + lexer.info());
}
if (now == null) {
now = new java.sql.Timestamp(System.currentTimeMillis());
}
valueHandler.processFunction(row, j, funcName, hash);
} else if (hash == Constants.STR_TO_DATE || hash == Constants.DATE_PARSE) {
String funcName = lexer.stringVal();
lexer.nextTokenLParen();
String strVal, format;
if (lexer.token == Token.LPAREN) {
lexer.nextTokenValue();
strVal = lexer.stringVal();
lexer.nextTokenComma();
accept(Token.COMMA);
format = lexer.stringVal();
lexer.nextTokenValue();
accept(Token.RPAREN);
} else {
throw new ParserException("insert value error, " + lexer.info());
}
valueHandler.processFunction(row, j, funcName, hash, strVal, format);
} else if (Constants.CLOTHES_FEATURE_EXTRACT_V1 == hash ||
Constants.CLOTHES_ATTRIBUTE_EXTRACT_V1 == hash ||
Constants.GENERIC_FEATURE_EXTRACT_V1 == hash ||
Constants.TEXT_FEATURE_EXTRACT_V1 == hash ||
Constants.FACE_FEATURE_EXTRACT_V1 == hash) {
String funcName = lexer.stringVal();
lexer.nextTokenLParen();
String urlVal;
if (Token.LPAREN == lexer.token) {
lexer.nextTokenValue();
urlVal = lexer.stringVal();
lexer.nextToken();
accept(Token.RPAREN);
} else {
throw new ParserException("insert value error, " + lexer.info());
}
valueHandler.processFunction(row, j, funcName, hash, urlVal);
} else {
throw new ParserException("insert value error, " + lexer.info());
}
break;
}
default:
throw new ParserException("insert value error, " + lexer.info());
}
if (lexer.token == Token.COMMA) {
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) {
break;
} else {
throw new ParserException("insert value error, " + lexer.info());
//
// if (lexer.token == Token.COMMA) {
// lexer.nextTokenValue();
// continue;
// } else {
// break;
// }
}
} // for j
valueHandler.processRow(row);
}
if (lexer.token != Token.RPAREN) {
throw new ParserException("syntax error. " + lexer.info());
}
lexer.nextTokenComma();
while (lexer.token == Token.HINT) {
this.exprParser.parseHints();
}
if (lexer.token == Token.COMMA) {
lexer.nextTokenLParen();
continue;
} else {
valueHandler.processComplete();
break;
}
}
}