improved sql parser for postgresql

This commit is contained in:
wenshao
2014-11-17 11:09:26 +08:00
parent 39bb9e2d7f
commit 06df60f95a
51 changed files with 902 additions and 199 deletions
@@ -13,21 +13,20 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.sql.dialect.mysql.ast.expr;
package com.alibaba.druid.sql.ast.expr;
import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.ast.SQLExprImpl;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class MySqlBinaryExpr extends MySqlExprImpl implements MySqlExpr, SQLLiteralExpr {
public class SQLBinaryExpr extends SQLExprImpl implements SQLLiteralExpr {
private String value;
public MySqlBinaryExpr(){
public SQLBinaryExpr(){
}
public MySqlBinaryExpr(String value){
public SQLBinaryExpr(String value){
super();
this.value = value;
}
@@ -40,12 +39,7 @@ public class MySqlBinaryExpr extends MySqlExprImpl implements MySqlExpr, SQLLite
this.value = value;
}
@Override
protected void accept0(SQLASTVisitor visitor) {
this.accept0((MySqlASTVisitor) visitor);
}
public void accept0(MySqlASTVisitor visitor) {
public void accept0(SQLASTVisitor visitor) {
visitor.visit(this);
visitor.endVisit(this);
@@ -76,7 +70,7 @@ public class MySqlBinaryExpr extends MySqlExprImpl implements MySqlExpr, SQLLite
if (getClass() != obj.getClass()) {
return false;
}
MySqlBinaryExpr other = (MySqlBinaryExpr) obj;
SQLBinaryExpr other = (SQLBinaryExpr) obj;
if (value == null) {
if (other.value != null) {
return false;
@@ -16,6 +16,7 @@
package com.alibaba.druid.sql.ast.statement;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLObjectImpl;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
@@ -23,10 +24,19 @@ public class SQLAlterTableAlterColumn extends SQLObjectImpl implements SQLAlterT
private SQLColumnDefinition column;
private boolean setNotNull;
private boolean dropNotNull;
private SQLExpr setDefault;
private boolean dropDefault;
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, column);
acceptChild(visitor, setDefault);
}
visitor.endVisit(this);
}
@@ -39,4 +49,36 @@ public class SQLAlterTableAlterColumn extends SQLObjectImpl implements SQLAlterT
this.column = column;
}
public boolean isSetNotNull() {
return setNotNull;
}
public void setSetNotNull(boolean setNotNull) {
this.setNotNull = setNotNull;
}
public boolean isDropNotNull() {
return dropNotNull;
}
public void setDropNotNull(boolean dropNotNull) {
this.dropNotNull = dropNotNull;
}
public SQLExpr getSetDefault() {
return setDefault;
}
public void setSetDefault(SQLExpr setDefault) {
this.setDefault = setDefault;
}
public boolean isDropDefault() {
return dropDefault;
}
public void setDropDefault(boolean dropDefault) {
this.dropDefault = dropDefault;
}
}
@@ -26,6 +26,8 @@ public class SQLAlterTableDropColumnItem extends SQLObjectImpl implements SQLAlt
private List<SQLName> columns = new ArrayList<SQLName>();
private boolean cascade = false;
public SQLAlterTableDropColumnItem(){
}
@@ -42,4 +44,12 @@ public class SQLAlterTableDropColumnItem extends SQLObjectImpl implements SQLAlt
return columns;
}
public boolean isCascade() {
return cascade;
}
public void setCascade(boolean cascade) {
this.cascade = cascade;
}
}
@@ -0,0 +1,28 @@
package com.alibaba.druid.sql.ast.statement;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLObjectImpl;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLAlterTableRename extends SQLObjectImpl implements SQLAlterTableItem {
protected SQLExpr to;
public SQLExpr getTo() {
return to;
}
public void setTo(SQLExpr to) {
this.to = to;
to.setParent(this);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, to);
}
visitor.endVisit(this);
}
}
@@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.SQLOrderingSpecification;
import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr;
import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
@@ -39,7 +40,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey.Match;
import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey.On;
import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey.Option;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr;
@@ -187,7 +187,7 @@ public class MySqlExprParser extends SQLExprParser {
} else if (ident.equalsIgnoreCase("b")) {
String charValue = lexer.stringVal();
lexer.nextToken();
expr = new MySqlBinaryExpr(charValue);
expr = new SQLBinaryExpr(charValue);
return primaryRest(expr);
} else if (ident.startsWith("_")) {
@@ -271,7 +271,7 @@ public class MySqlExprParser extends SQLExprParser {
String binaryString = lexer.stringVal();
if (intExpr.getNumber().intValue() == 0 && binaryString.startsWith("b")) {
lexer.nextToken();
expr = new MySqlBinaryExpr(binaryString.substring(1));
expr = new SQLBinaryExpr(binaryString.substring(1));
return primaryRest(expr);
}
@@ -22,7 +22,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr;
@@ -160,10 +159,6 @@ public interface MySqlASTVisitor extends SQLASTVisitor {
boolean visit(MySqlMatchAgainstExpr x);
void endVisit(MySqlBinaryExpr x);
boolean visit(MySqlBinaryExpr x);
void endVisit(MySqlPrepareStatement x);
boolean visit(MySqlPrepareStatement x);
@@ -22,7 +22,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr;
@@ -203,17 +202,6 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq
return true;
}
@Override
public void endVisit(MySqlBinaryExpr x) {
}
@Override
public boolean visit(MySqlBinaryExpr x) {
return true;
}
@Override
public void endVisit(MySqlPrepareStatement x) {
@@ -20,6 +20,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr;
import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr;
@@ -35,7 +36,6 @@ import com.alibaba.druid.sql.ast.expr.SQLNumberExpr;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr;
import com.alibaba.druid.sql.visitor.SQLEvalVisitor;
import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils;
import com.alibaba.druid.sql.visitor.functions.Function;
@@ -101,7 +101,8 @@ public class MySqlEvalVisitorImpl extends MySqlASTVisitorAdapter implements SQLE
return SQLEvalVisitorUtils.visit(this, x);
}
public boolean visit(MySqlBinaryExpr x) {
@Override
public boolean visit(SQLBinaryExpr x) {
return SQLEvalVisitorUtils.visit(this, x);
}
@@ -44,7 +44,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr;
@@ -776,20 +775,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
return false;
}
@Override
public void endVisit(MySqlBinaryExpr x) {
}
@Override
public boolean visit(MySqlBinaryExpr x) {
print("b'");
print(x.getValue());
print('\'');
return false;
}
@Override
public void endVisit(MySqlPrepareStatement x) {
}
@@ -37,7 +37,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr;
@@ -304,17 +303,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
return true;
}
@Override
public void endVisit(MySqlBinaryExpr x) {
}
@Override
public boolean visit(MySqlBinaryExpr x) {
return true;
}
@Override
public void endVisit(MySqlPrepareStatement x) {
@@ -1,41 +0,0 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
public class OracleAlterTableRenameTo extends OracleAlterTableItem {
private SQLExpr to;
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, to);
}
visitor.endVisit(this);
}
public SQLExpr getTo() {
return to;
}
public void setTo(SQLExpr to) {
this.to = to;
}
}
@@ -33,8 +33,6 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLDropSequenceStatement;
@@ -61,7 +59,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstain
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem;
@@ -914,27 +911,6 @@ public class OracleStatementParser extends SQLStatementParser {
return stmt;
}
private SQLAlterTableItem parseAlterTableRename() {
acceptIdentifier("RENAME");
if (lexer.token() == Token.COLUMN) {
lexer.nextToken();
SQLAlterTableRenameColumn renameColumn = new SQLAlterTableRenameColumn();
renameColumn.setColumn(this.exprParser.name());
accept(Token.TO);
renameColumn.setTo(this.exprParser.name());
return renameColumn;
}
if (lexer.token() == Token.TO) {
lexer.nextToken();
OracleAlterTableRenameTo item = new OracleAlterTableRenameTo();
item.setTo(this.exprParser.name());
return item;
}
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
}
public void parseAlterDrop(SQLAlterTableStatement stmt) {
lexer.nextToken();
if (lexer.token() == Token.CONSTRAINT) {
@@ -60,7 +60,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstain
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition;
@@ -453,10 +452,6 @@ public interface OracleASTVisitor extends SQLASTVisitor {
void endVisit(OracleAlterTableAddConstaint x);
boolean visit(OracleAlterTableRenameTo x);
void endVisit(OracleAlterTableRenameTo x);
boolean visit(OraclePrimaryKey x);
void endVisit(OraclePrimaryKey x);
@@ -68,7 +68,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstain
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition;
@@ -1021,16 +1020,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
}
@Override
public boolean visit(OracleAlterTableRenameTo x) {
return true;
}
@Override
public void endVisit(OracleAlterTableRenameTo x) {
}
@Override
public boolean visit(OracleStorageClause x) {
return true;
@@ -98,7 +98,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstain
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem;
@@ -2489,18 +2488,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
}
@Override
public boolean visit(OracleAlterTableRenameTo x) {
print("RENAME TO ");
x.getTo().accept(this);
return false;
}
@Override
public void endVisit(OracleAlterTableRenameTo x) {
}
@Override
public boolean visit(OracleStorageClause x) {
print("STORAGE (");
@@ -91,7 +91,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstain
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition;
@@ -1421,16 +1420,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
this.endVisit((SQLCreateTableStatement) x);
}
@Override
public boolean visit(OracleAlterTableRenameTo x) {
return false;
}
@Override
public void endVisit(OracleAlterTableRenameTo x) {
}
@Override
public boolean visit(OracleStorageClause x) {
return false;
@@ -0,0 +1,6 @@
package com.alibaba.druid.sql.dialect.postgresql.ast.stmt;
public class PGAlterTableAlterColumnSetNotNull {
}
@@ -17,6 +17,7 @@ package com.alibaba.druid.sql.dialect.postgresql.parser;
import com.alibaba.druid.sql.ast.SQLDataType;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr;
import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr;
@@ -216,6 +217,12 @@ public class PGExprParser extends SQLExprParser {
PGLineSegmentsExpr lseg = new PGLineSegmentsExpr();
lseg.setValue(value);
return primaryRest(lseg);
} else if (ident.equalsIgnoreCase("b") && lexer.token() == Token.LITERAL_CHARS) {
String charValue = lexer.stringVal();
lexer.nextToken();
expr = new SQLBinaryExpr(charValue);
return primaryRest(expr);
}
}
@@ -22,6 +22,8 @@ import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLCurrentOfCursorExpr;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
@@ -287,7 +289,7 @@ public class PGSQLStatementParser extends SQLStatementParser {
stmt.setWith(with);
return stmt;
}
if (lexer.token() == Token.DELETE) {
PGDeleteStatement stmt = this.parseDeleteStatement();
stmt.setWith(with);
@@ -295,4 +297,39 @@ public class PGSQLStatementParser extends SQLStatementParser {
}
throw new ParserException("TODO");
}
protected SQLAlterTableAlterColumn parseAlterColumn() {
accept(Token.COLUMN);
SQLColumnDefinition column = this.exprParser.parseColumn();
SQLAlterTableAlterColumn alterColumn = new SQLAlterTableAlterColumn();
alterColumn.setColumn(column);
if (column.getDataType() == null && column.getConstraints().size() == 0) {
if (lexer.token() == Token.SET) {
lexer.nextToken();
if (lexer.token() == Token.NOT) {
lexer.nextToken();
accept(Token.NULL);
alterColumn.setSetNotNull(true);
} else {
accept(Token.DEFAULT);
SQLExpr defaultValue = this.exprParser.expr();
alterColumn.setSetDefault(defaultValue);
}
} else if (lexer.token() == Token.DROP) {
lexer.nextToken();
if (lexer.token() == Token.NOT) {
lexer.nextToken();
accept(Token.NULL);
alterColumn.setDropNotNull(true);
} else {
accept(Token.DEFAULT);
alterColumn.setDropDefault(true);
}
}
}
return alterColumn;
}
}
@@ -20,6 +20,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
@@ -144,4 +145,9 @@ public class PGEvalVisitor extends PGASTVisitorAdapter implements SQLEvalVisitor
public boolean visit(SQLIdentifierExpr x) {
return SQLEvalVisitorUtils.visit(this, x);
}
@Override
public boolean visit(SQLBinaryExpr x) {
return SQLEvalVisitorUtils.visit(this, x);
}
}
@@ -16,6 +16,7 @@
package com.alibaba.druid.sql.dialect.postgresql.visitor;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
@@ -645,4 +646,13 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor
public void endVisit(PGLineSegmentsExpr x) {
}
@Override
public boolean visit(SQLBinaryExpr x) {
print("B'");
print(x.getValue());
print('\'');
return false;
}
}
@@ -1453,8 +1453,11 @@ public class SQLExprParser extends SQLParser {
public SQLColumnDefinition parseColumn() {
SQLColumnDefinition column = createColumnDefinition();
column.setName(name());
column.setDataType(parseDataType());
if(lexer.token() != Token.SET //
&& lexer.token() != Token.DROP) {
column.setDataType(parseDataType());
}
return parseColumnRest(column);
}
@@ -1469,7 +1472,7 @@ public class SQLExprParser extends SQLParser {
column.setDefaultExpr(bitOr());
return parseColumnRest(column);
}
if (lexer.token() == Token.NOT) {
lexer.nextToken();
accept(Token.NULL);
@@ -1698,9 +1701,12 @@ public class SQLExprParser extends SQLParser {
fk.setReferencedTableName(this.name());
accept(Token.LPAREN);
this.names(fk.getReferencedColumns());
accept(Token.RPAREN);
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
this.names(fk.getReferencedColumns(), fk);
accept(Token.RPAREN);
}
return fk;
}
@@ -39,6 +39,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableKeys;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
import com.alibaba.druid.sql.ast.statement.SQLCallStatement;
import com.alibaba.druid.sql.ast.statement.SQLCheck;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLCommentStatement;
import com.alibaba.druid.sql.ast.statement.SQLConstraint;
@@ -48,6 +49,9 @@ import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement;
import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement.TriggerEvent;
import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement.TriggerType;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn;
import com.alibaba.druid.sql.ast.statement.SQLCreateViewStatement;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLDropDatabaseStatement;
@@ -743,6 +747,22 @@ public class SQLStatementParser extends SQLParser {
} else if (lexer.token() == Token.IDENTIFIER) {
SQLAlterTableAddColumn item = parseAlterTableAddColumn();
stmt.getItems().add(item);
} else if (lexer.token() == Token.COLUMN) {
lexer.nextToken();
SQLAlterTableAddColumn item = parseAlterTableAddColumn();
stmt.getItems().add(item);
} else if (lexer.token() == Token.CHECK) {
SQLCheck check = this.exprParser.parseCheck();
SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(check);
stmt.getItems().add(item);
} else if (lexer.token() == Token.CONSTRAINT) {
SQLConstraint constraint = this.exprParser.parseConstaint();
SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(constraint);
stmt.getItems().add(item);
} else if (lexer.token() == Token.FOREIGN) {
SQLConstraint constraint = this.exprParser.parseForeignKey();
SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(constraint);
stmt.getItems().add(item);
} else {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
}
@@ -774,10 +794,7 @@ public class SQLStatementParser extends SQLParser {
} else if (lexer.token() == Token.ALTER) {
lexer.nextToken();
if (lexer.token() == Token.COLUMN) {
lexer.nextToken();
SQLColumnDefinition column = this.exprParser.parseColumn();
SQLAlterTableAlterColumn alterColumn = new SQLAlterTableAlterColumn();
alterColumn.setColumn(column);
SQLAlterTableAlterColumn alterColumn = parseAlterColumn();
stmt.getItems().add(alterColumn);
} else {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
@@ -792,6 +809,8 @@ public class SQLStatementParser extends SQLParser {
addCheck.setWithNoCheck(true);
addCheck.setConstraint(check);
stmt.getItems().add(addCheck);
} else if (identifierEquals("RENAME")) {
stmt.getItems().add(parseAlterTableRename());
} else {
break;
}
@@ -801,6 +820,37 @@ public class SQLStatementParser extends SQLParser {
}
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
}
protected SQLAlterTableItem parseAlterTableRename() {
acceptIdentifier("RENAME");
if (lexer.token() == Token.COLUMN) {
lexer.nextToken();
SQLAlterTableRenameColumn renameColumn = new SQLAlterTableRenameColumn();
renameColumn.setColumn(this.exprParser.name());
accept(Token.TO);
renameColumn.setTo(this.exprParser.name());
return renameColumn;
}
if (lexer.token() == Token.TO) {
lexer.nextToken();
SQLAlterTableRename item = new SQLAlterTableRename();
item.setTo(this.exprParser.name());
return item;
}
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
}
protected SQLAlterTableAlterColumn parseAlterColumn() {
lexer.nextToken();
SQLColumnDefinition column = this.exprParser.parseColumn();
SQLAlterTableAlterColumn alterColumn = new SQLAlterTableAlterColumn();
alterColumn.setColumn(column);
return alterColumn;
}
public void parseAlterDrop(SQLAlterTableStatement stmt) {
lexer.nextToken();
@@ -814,6 +864,12 @@ public class SQLStatementParser extends SQLParser {
lexer.nextToken();
SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem();
this.exprParser.names(item.getColumns());
if(lexer.token == Token.CASCADE) {
item.setCascade(true);
lexer.nextToken();
}
stmt.getItems().add(item);
} else {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
@@ -39,6 +39,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr;
import com.alibaba.druid.sql.ast.expr.SQLAllExpr;
import com.alibaba.druid.sql.ast.expr.SQLAnyExpr;
import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr;
@@ -80,6 +81,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPrimaryKey;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableKeys;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
@@ -1391,6 +1393,10 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
public boolean visit(SQLAlterTableDropColumnItem x) {
print("DROP COLUMN ");
this.printAndAccept(x.getColumns(), ", ");
if (x.isCascade()) {
print(" CASCADE");
}
return false;
}
@@ -1576,6 +1582,21 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
public boolean visit(SQLAlterTableAlterColumn x) {
print("ALTER COLUMN ");
x.getColumn().accept(this);
if (x.isSetNotNull()) { // postgresql
print(" SET NOT NULL");
}
if (x.isDropNotNull()) { // postgresql
print(" DROP NOT NULL");
}
if (x.getSetDefault() != null) { // postgresql
print(" SET DEFAULT ");
x.getSetDefault().accept(this);
}
if (x.isDropDefault()) { // postgresql
print(" DROP DEFAULT");
}
return false;
}
@@ -1746,9 +1767,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
print(" REFERENCES ");
x.getReferencedTableName().accept(this);
print(" (");
printAndAccept(x.getReferencedColumns(), ", ");
print(")");
if (x.getReferencedColumns().size() > 0) {
print(" (");
printAndAccept(x.getReferencedColumns(), ", ");
print(")");
}
return false;
}
@@ -2073,4 +2096,20 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
return false;
}
@Override
public boolean visit(SQLBinaryExpr x) {
print("b'");
print(x.getValue());
print('\'');
return false;
}
@Override
public boolean visit(SQLAlterTableRename x) {
print("RENAME TO ");
x.getTo().accept(this);
return false;
}
}
@@ -25,6 +25,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr;
import com.alibaba.druid.sql.ast.expr.SQLAllExpr;
import com.alibaba.druid.sql.ast.expr.SQLAnyExpr;
import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr;
import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
@@ -64,6 +65,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPrimaryKey;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableKeys;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
@@ -555,4 +557,12 @@ public interface SQLASTVisitor {
boolean visit(SQLRevokeStatement x);
void endVisit(SQLBinaryExpr x);
boolean visit(SQLBinaryExpr x);
void endVisit(SQLAlterTableRename x);
boolean visit(SQLAlterTableRename x);
}
@@ -26,6 +26,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr;
import com.alibaba.druid.sql.ast.expr.SQLAllExpr;
import com.alibaba.druid.sql.ast.expr.SQLAnyExpr;
import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr;
import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
@@ -65,6 +66,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPrimaryKey;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableKeys;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
@@ -1086,4 +1088,24 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor {
return true;
}
@Override
public void endVisit(SQLBinaryExpr x) {
}
@Override
public boolean visit(SQLBinaryExpr x) {
return true;
}
@Override
public void endVisit(SQLAlterTableRename x) {
}
@Override
public boolean visit(SQLAlterTableRename x) {
return true;
}
}
@@ -20,6 +20,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr;
import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
@@ -151,4 +152,8 @@ public class SQLEvalVisitorImpl extends SQLASTVisitorAdapter implements SQLEvalV
return false;
}
@Override
public boolean visit(SQLBinaryExpr x) {
return SQLEvalVisitorUtils.visit(this, x);
}
}
@@ -19,6 +19,7 @@ import com.alibaba.druid.DruidRuntimeException;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr;
import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
@@ -39,7 +40,6 @@ import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.db2.visitor.DB2EvalVisitor;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlEvalVisitorImpl;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleEvalVisitor;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGEvalVisitor;
@@ -582,7 +582,7 @@ public class SQLEvalVisitorUtils {
return true;
}
public static boolean visit(SQLEvalVisitor visitor, MySqlBinaryExpr x) {
public static boolean visit(SQLEvalVisitor visitor, SQLBinaryExpr x) {
String text = x.getValue();
long[] words = new long[text.length() / 64 + 1];
@@ -45,6 +45,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropForeignKey;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLCallStatement;
import com.alibaba.druid.sql.ast.statement.SQLCheck;
@@ -1269,7 +1270,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
@Override
public boolean visit(SQLForeignKeyImpl x) {
for (SQLName column : x.getReferencedColumns()) {
for (SQLName column : x.getReferencingColumns()) {
column.accept(this);
}
@@ -1350,4 +1351,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
public boolean visit(SQLDropProcedureStatement x) {
return false;
}
@Override
public boolean visit(SQLAlterTableRename x) {
return false;
}
}