This commit is contained in:
温少
2012-05-17 01:07:47 +08:00
parent 6acc3a92b2
commit de1d141e4b
16 changed files with 126 additions and 79 deletions
@@ -93,7 +93,7 @@ public final class PreparedStatementHolder {
}
public boolean isInUse() {
return inUseCount <= 0;
return inUseCount > 0;
}
public void incrementInUseCount() {
@@ -103,18 +103,6 @@ public class SQLUtils {
}
public static String format(String sql, String dbType) {
if (JdbcUtils.ORACLE.equals(dbType)) {
return formatOracle(sql);
}
if (JdbcUtils.MYSQL.equals(dbType)) {
return formatMySql(sql);
}
if (JdbcUtils.POSTGRESQL.equals(dbType)) {
return formatPGSql(sql);
}
SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType);
List<SQLStatement> statementList = parser.parseStatementList();
@@ -300,15 +300,8 @@ public class MySqlStatementParser extends SQLStatementParser {
for (;;) {
MySqlCreateUserStatement.UserSpecification userSpec = new MySqlCreateUserStatement.UserSpecification();
SQLCharExpr expr = (SQLCharExpr) exprParser.expr();
String user = expr.toString();
if (lexer.token() == Token.VARIANT) {
lexer.nextToken();
SQLCharExpr expr2 = (SQLCharExpr) exprParser.expr();
user += '@';
user += expr2.toString();
}
userSpec.setUser(new SQLIdentifierExpr(user));
SQLExpr expr = exprParser.primary();
userSpec.setUser(expr);
if (lexer.token() == Token.IDENTIFIED) {
lexer.nextToken();
@@ -478,7 +471,7 @@ public class MySqlStatementParser extends SQLStatementParser {
}
public MySqlDescribeStatement parseDescribe() throws ParserException {
if (identifierEquals("DESC") || identifierEquals("DESCRIBE")) {
if (lexer.token() == Token.DESC || identifierEquals("DESCRIBE")) {
lexer.nextToken();
} else {
throw new ParserException("expect DESC, actual " + lexer.token());
@@ -1626,7 +1619,7 @@ public class MySqlStatementParser extends SQLStatementParser {
SQLName tableName = this.exprParser.name();
insertStatement.setTableName(tableName);
if (lexer.token() == Token.IDENTIFIER) {
if (lexer.token() == Token.IDENTIFIER && !identifierEquals("VALUE")) {
insertStatement.setAlias(lexer.stringVal());
lexer.nextToken();
}
@@ -1639,7 +1632,7 @@ public class MySqlStatementParser extends SQLStatementParser {
accept(Token.RPAREN);
}
if (lexer.token() == (Token.VALUES)) {
if (lexer.token() == Token.VALUES || identifierEquals("VALUE")) {
lexer.nextToken();
for (;;) {
@@ -1656,6 +1649,29 @@ public class MySqlStatementParser extends SQLStatementParser {
break;
}
}
} else if (lexer.token() == Token.SET) {
lexer.nextToken();
SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause();
insertStatement.getValuesList().add(values);
for (;;) {
SQLName name = this.exprParser.name();
insertStatement.getColumns().add(name);
if (lexer.token() == Token.EQ) {
lexer.nextToken();
} else {
accept(Token.COLONEQ);
}
values.getValues().add(this.exprParser.expr());
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
}
break;
}
} else if (lexer.token() == (Token.SELECT)) {
SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr();
@@ -1679,15 +1695,8 @@ public class MySqlStatementParser extends SQLStatementParser {
MySqlDropUser stmt = new MySqlDropUser();
for (;;) {
SQLCharExpr expr = (SQLCharExpr) this.exprParser.expr();
String user = expr.toString();
if (lexer.token() == Token.VARIANT) {
lexer.nextToken();
SQLCharExpr expr2 = (SQLCharExpr) this.exprParser.expr();
user += '@';
user += expr2.toString();
}
stmt.getUsers().add(new SQLIdentifierExpr(user));
SQLExpr expr = this.exprParser.expr();
stmt.getUsers().add(expr);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
@@ -1727,7 +1736,7 @@ public class MySqlStatementParser extends SQLStatementParser {
}
break;
}
if (identifierEquals("RESTRICT")) {
stmt.setOption("RESTRICT");
lexer.nextToken();
@@ -1735,25 +1744,25 @@ public class MySqlStatementParser extends SQLStatementParser {
stmt.setOption("CASCADE");
lexer.nextToken();
}
return stmt;
}
protected SQLDropViewStatement parseDropView(boolean acceptDrop) {
if (acceptDrop) {
accept(Token.DROP);
}
MySqlDropViewStatement stmt = new MySqlDropViewStatement();
accept(Token.VIEW);
if (lexer.token() == Token.IF) {
lexer.nextToken();
accept(Token.EXISTS);
stmt.setIfExists(true);
}
for (;;) {
SQLName name = this.exprParser.name();
stmt.addTableSource(name);
@@ -1763,7 +1772,7 @@ public class MySqlStatementParser extends SQLStatementParser {
}
break;
}
if (identifierEquals("RESTRICT")) {
stmt.setOption("RESTRICT");
lexer.nextToken();
@@ -1771,7 +1780,7 @@ public class MySqlStatementParser extends SQLStatementParser {
stmt.setOption("CASCADE");
lexer.nextToken();
}
return stmt;
}
@@ -2009,30 +2018,30 @@ public class MySqlStatementParser extends SQLStatementParser {
}
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
}
public SQLStatement parseRename() {
MySqlRenameTableStatement stmt = new MySqlRenameTableStatement();
acceptIdentifier("RENAME");
accept(Token.TABLE);
for (;;) {
MySqlRenameTableStatement.Item item = new MySqlRenameTableStatement.Item();
item.setName(this.exprParser.name());
acceptIdentifier("TO");
item.setTo(this.exprParser.name());
stmt.getItems().add(item);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
}
break;
}
return stmt;
}
}
@@ -767,8 +767,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
if (x.getColumns().size() > 0) {
incrementIndent();
println();
print("(");
print(" (");
for (int i = 0, size = x.getColumns().size(); i < size; ++i) {
if (i != 0) {
if (i % 5 == 0) {
@@ -785,8 +784,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
if (x.getValuesList().size() != 0) {
println();
print("VALUES");
println();
print("VALUES ");
for (int i = 0, size = x.getValuesList().size(); i < size; ++i) {
if (i != 0) {
print(", ");
@@ -381,7 +381,7 @@ public class OracleExprParser extends SQLExprParser {
accept(Token.RPAREN);
}
identifierEquals("TO");
acceptIdentifier("TO");
if (identifierEquals("SECOND")) {
lexer.nextToken();
interval.setToType(OracleIntervalType.SECOND);
@@ -462,7 +462,7 @@ public class OracleExprParser extends SQLExprParser {
}
public OracleDateExpr parseDate() {
identifierEquals("DATE");
acceptIdentifier("DATE");
OracleDateExpr timestamp = new OracleDateExpr();
@@ -829,4 +829,16 @@ public class OracleExprParser extends SQLExprParser {
return column;
}
public SQLExpr exprRest(SQLExpr expr) throws ParserException {
expr = super.exprRest(expr);
if (lexer.token() == Token.COLONEQ) {
lexer.nextToken();
SQLExpr right = expr();
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Assignment, right);
}
return expr;
}
}
@@ -1138,7 +1138,7 @@ public class SQLExprParser extends SQLParser {
if (lexer.token() == token) {
lexer.nextToken();
} else {
throw new SQLParseException("syntax error, expect " + token + ", actual " + lexer.token());
throw new SQLParseException("syntax error, expect " + token + ", actual " + lexer.token() + " " + lexer.stringVal());
}
}