improved sql parser.

This commit is contained in:
wenshao
2017-06-29 21:06:21 +08:00
parent f5cbc026b1
commit 2c52661fe9
11 changed files with 457 additions and 41 deletions
@@ -22,12 +22,13 @@ import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLTableConstraint;
import com.alibaba.druid.sql.ast.statement.SQLTableElement;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class OraclePrimaryKey extends SQLPrimaryKeyImpl implements OracleConstraint, SQLPrimaryKey, SQLTableElement {
public class OraclePrimaryKey extends SQLPrimaryKeyImpl implements OracleConstraint, SQLPrimaryKey, SQLTableElement, SQLTableConstraint {
private OracleUsingIndexClause using;
private SQLName exceptionsInto;
@@ -1026,6 +1026,31 @@ public class OracleExprParser extends SQLExprParser {
OracleUsingIndexClause using = parseUsingIndex();
primaryKey.setUsing(using);
}
for (;;) {
if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
primaryKey.setEnable(Boolean.TRUE);
} else if (lexer.token() == Token.DISABLE) {
lexer.nextToken();
primaryKey.setEnable(Boolean.FALSE);
} else if (identifierEquals("VALIDATE")) {
lexer.nextToken();
primaryKey.setValidate(Boolean.TRUE);
} else if (identifierEquals("NOVALIDATE")) {
lexer.nextToken();
primaryKey.setValidate(Boolean.FALSE);
} else if (identifierEquals("RELY")) {
lexer.nextToken();
primaryKey.setRely(Boolean.TRUE);
} else if (identifierEquals("NORELY")) {
lexer.nextToken();
primaryKey.setRely(Boolean.FALSE);
} else {
break;
}
}
return primaryKey;
}
@@ -1088,25 +1113,29 @@ public class OracleExprParser extends SQLExprParser {
public SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) {
column = super.parseColumnRest(column);
if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
column.setEnable(Boolean.TRUE);
} else if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
column.setEnable(true);
} else if (identifierEquals("VALIDATE")) {
lexer.nextToken();
column.setValidate(Boolean.TRUE);
} else if (identifierEquals("NOVALIDATE")) {
lexer.nextToken();
column.setValidate(Boolean.FALSE);
} else if (identifierEquals("RELY")) {
lexer.nextToken();
column.setRely(Boolean.TRUE);
} else if (identifierEquals("NORELY")) {
lexer.nextToken();
column.setRely(Boolean.FALSE);
for (;;) {
if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
column.setEnable(Boolean.TRUE);
} else if (lexer.token() == Token.DISABLE) {
lexer.nextToken();
column.setEnable(Boolean.FALSE);
} else if (identifierEquals("VALIDATE")) {
lexer.nextToken();
column.setValidate(Boolean.TRUE);
} else if (identifierEquals("NOVALIDATE")) {
lexer.nextToken();
column.setValidate(Boolean.FALSE);
} else if (identifierEquals("RELY")) {
lexer.nextToken();
column.setRely(Boolean.TRUE);
} else if (identifierEquals("NORELY")) {
lexer.nextToken();
column.setRely(Boolean.FALSE);
} else {
break;
}
}
return column;
@@ -236,7 +236,8 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
query.accept(this);
if (x.getRestriction() != null) {
print(' ');
println();
print("WITH ");
x.getRestriction().accept(this);
}
@@ -2006,8 +2007,24 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
printAndAccept(x.getColumns(), ", ");
print(')');
Boolean rely = x.getRely();
if (rely != null) {
if (rely.booleanValue()) {
print0(ucase ? " RELY" : " rely");
}
}
printConstraintState(x);
Boolean validate = x.getValidate();
if (validate != null) {
if (validate.booleanValue()) {
print0(ucase ? " VALIDATE" : " validate");
} else {
print0(ucase ? " NOVALIDATE" : " novalidate");
}
}
return false;
}
@@ -2024,8 +2041,9 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
x.getExceptionsInto().accept(this);
}
if (x.getEnable() != null) {
if (x.getEnable().booleanValue()) {
Boolean enable = x.getEnable();
if (enable != null) {
if (enable.booleanValue()) {
print0(ucase ? " ENABLE" : " enable");
} else {
print0(ucase ? " DIABLE" : " diable");