in core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java [4747:4961]
public SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) {
switch (lexer.token) {
case DEFAULT:
lexer.nextToken();
SQLExpr defaultExpr = parseColumnRestDefault();
column.setDefaultExpr(defaultExpr);
return parseColumnRest(column);
case NOT: {
lexer.nextToken();
accept(Token.NULL);
SQLNotNullConstraint notNull = new SQLNotNullConstraint();
if (lexer.token == Token.HINT) {
List<SQLCommentHint> hints = this.parseHints();
notNull.setHints(hints);
}
column.addConstraint(notNull);
return parseColumnRest(column);
}
case NULL:
lexer.nextToken();
column.getConstraints().add(new SQLNullConstraint());
return parseColumnRest(column);
case PRIMARY:
lexer.nextToken();
accept(Token.KEY);
column.addConstraint(new SQLColumnPrimaryKey());
return parseColumnRest(column);
case UNIQUE:
lexer.nextToken();
if (lexer.token == Token.KEY) {
lexer.nextToken();
}
column.addConstraint(new SQLColumnUniqueKey());
return parseColumnRest(column);
case DISABLE:
lexer.nextToken();
if (lexer.stringVal.equalsIgnoreCase("novalidate")) {
column.setDisableNovalidate(true);
}
lexer.nextToken();
return parseColumnRest(column);
case KEY:
lexer.nextToken();
column.addConstraint(new SQLColumnPrimaryKey());
return parseColumnRest(column);
case REFERENCES: {
SQLColumnReference ref = parseReference();
column.addConstraint(ref);
return parseColumnRest(column);
}
case CONSTRAINT:
lexer.nextToken();
SQLName name = this.name();
if (lexer.token == Token.PRIMARY) {
lexer.nextToken();
accept(Token.KEY);
SQLColumnPrimaryKey pk = new SQLColumnPrimaryKey();
pk.setName(name);
column.addConstraint(pk);
return parseColumnRest(column);
}
if (lexer.token == Token.UNIQUE) {
lexer.nextToken();
SQLColumnUniqueKey uk = new SQLColumnUniqueKey();
uk.setName(name);
column.addConstraint(uk);
return parseColumnRest(column);
}
if (lexer.token == Token.REFERENCES) {
SQLColumnReference ref = parseReference();
ref.setName(name);
column.addConstraint(ref);
return parseColumnRest(column);
}
if (lexer.token == Token.NOT) {
lexer.nextToken();
accept(Token.NULL);
SQLNotNullConstraint notNull = new SQLNotNullConstraint();
notNull.setName(name);
column.addConstraint(notNull);
return parseColumnRest(column);
}
if (lexer.token == Token.CHECK) {
SQLColumnCheck check = parseColumnCheck();
check.setName(name);
check.setParent(column);
column.addConstraint(check);
return parseColumnRest(column);
}
if (lexer.token == Token.DEFAULT) {
lexer.nextToken();
SQLExpr expr = this.expr();
column.setDefaultExpr(expr);
return parseColumnRest(column);
}
throw new ParserException("TODO : " + lexer.info());
case CHECK:
SQLColumnCheck check = parseColumnCheck();
column.addConstraint(check);
return parseColumnRest(column);
case IDENTIFIER:
long hash = lexer.hashLCase();
if (hash == FnvHash.Constants.AUTO_INCREMENT) {
lexer.nextToken();
column.setAutoIncrement(true);
//sequence parser
if (lexer.token == Token.BY) {
lexer.nextToken();
if (lexer.hashLCase() == FnvHash.Constants.GROUP) {
lexer.nextToken();
column.setSequenceType(AutoIncrementType.GROUP);
if (lexer.identifierEquals(FnvHash.Constants.UNIT)) {
lexer.nextToken();
if (lexer.identifierEquals(FnvHash.Constants.COUNT)) {
lexer.nextToken();
SQLExpr unitCount = primary();
column.setUnitCount(unitCount);
}
if (lexer.token == Token.INDEX) {
lexer.nextToken();
SQLExpr unitIndex = primary();
column.setUnitIndex(unitIndex);
}
if (lexer.hashLCase() == FnvHash.Constants.STEP) {
lexer.nextToken();
SQLExpr step = primary();
column.setStep(step);
}
} else {
return parseColumnRest(column);
}
} else if (lexer.hashLCase() == FnvHash.Constants.TIME) {
lexer.nextToken();
column.setSequenceType(AutoIncrementType.TIME);
return parseColumnRest(column);
} else if (lexer.hashLCase() == FnvHash.Constants.SIMPLE) {
lexer.nextToken();
if (lexer.hashLCase() == FnvHash.Constants.WITH) {
lexer.nextToken();
if (lexer.hashLCase() == FnvHash.Constants.CACHE) {
column.setSequenceType(AutoIncrementType.SIMPLE_CACHE);
} else {
throw new ParserException("TODO : " + lexer.info());
}
lexer.nextToken();
return parseColumnRest(column);
} else {
column.setSequenceType(AutoIncrementType.SIMPLE);
return parseColumnRest(column);
}
}
return parseColumnRest(column);
} else if (lexer.identifierEquals(FnvHash.Constants.UNIT)) {
lexer.nextToken();
if (lexer.identifierEquals(FnvHash.Constants.COUNT)) {
lexer.nextToken();
SQLExpr unitCount = primary();
column.setUnitCount(unitCount);
}
if (lexer.token == Token.INDEX) {
lexer.nextToken();
SQLExpr unitIndex = primary();
column.setUnitIndex(unitIndex);
}
if (lexer.hashLCase() == FnvHash.Constants.STEP) {
lexer.nextToken();
SQLExpr unitIndex = primary();
column.setStep(unitIndex);
}
} else if (lexer.token == Token.LPAREN) {
column.setIdentity(parseIdentity());
}
return parseColumnRest(column);
}
break;
case COMMENT:
lexer.nextToken();
if (lexer.token == Token.LITERAL_ALIAS) {
String alias = lexer.stringVal();
if (alias.length() > 2 && alias.charAt(0) == '"' && alias.charAt(alias.length() - 1) == '"') {
alias = alias.substring(1, alias.length() - 1);
}
column.setComment(alias);
lexer.nextToken();
} else if (lexer.token == Token.LITERAL_CHARS) {
StringBuilder stringVal = new StringBuilder(lexer.stringVal());
lexer.nextToken();
parseColumnCommentLiteralCharsRest(stringVal);
column.setComment(stringVal.toString());
} else {
column.setComment(primary());
}
return parseColumnRest(column);
default:
return parseColumnSpecific(column);
}
return column;
}