From d5a198a39f7c60851b6980bdf5658d0a56a03626 Mon Sep 17 00:00:00 2001 From: "shaojin.wensj" Date: Sun, 12 Jul 2015 16:20:28 +0800 Subject: [PATCH] improved sql parser odps support --- .../statement/SQLAlterTableAddPartition.java | 34 +++ .../SQLAlterTableDisableLifecycle.java | 24 ++ .../statement/SQLAlterTableDropPartition.java | 44 +++ .../SQLAlterTableEnableLifecycle.java | 24 ++ .../SQLAlterTableRenamePartition.java | 40 +++ .../statement/SQLAlterTableSetComment.java | 30 ++ .../statement/SQLAlterTableSetLifecycle.java | 30 ++ .../sql/ast/statement/SQLAlterTableTouch.java | 25 ++ .../SQLAlterViewRenameStatement.java | 42 +++ .../ast/statement/SQLDescribeStatement.java | 23 ++ .../ast/statement/MySqlDescribeStatement.java | 19 +- .../odps/ast/OdpsAddStatisticStatement.java | 43 +++ .../odps/ast/OdpsAnalyzeTableStatement.java | 44 +++ .../sql/dialect/odps/ast/OdpsObjectImpl.java | 20 ++ .../ast/OdpsRemoveStatisticStatement.java | 44 +++ .../odps/ast/OdpsSelectQueryBlock.java | 22 ++ .../dialect/odps/ast/OdpsStatisticClause.java | 102 +++++++ .../sql/dialect/odps/parser/OdpsLexer.java | 1 + .../dialect/odps/parser/OdpsSelectParser.java | 4 + .../odps/parser/OdpsStatementParser.java | 92 ++++++ .../dialect/odps/visitor/OdpsASTVisitor.java | 40 +++ .../odps/visitor/OdpsASTVisitorAdapter.java | 94 +++++++ .../odps/visitor/OdpsOutputVisitor.java | 133 +++++++++ .../odps/visitor/OdpsSchemaStatVisitor.java | 93 +++++++ .../druid/sql/parser/SQLStatementParser.java | 261 ++++++++++++++---- .../sql/visitor/SQLASTOutputVisitor.java | 106 +++++++ .../druid/sql/visitor/SQLASTVisitor.java | 45 +++ .../sql/visitor/SQLASTVisitorAdapter.java | 99 +++++++ .../bvt/sql/odps/OdpsAddStatisticTest.java | 45 +++ .../odps/OdpsAlterTableAddPartitionTest.java | 17 ++ .../odps/OdpsAlterTableDisableLifecycle.java | 25 ++ .../odps/OdpsAlterTableDropPartitionTest.java | 24 ++ .../odps/OdpsAlterTableEnableLifecycle.java | 25 ++ .../OdpsAlterTableRenamePartitionTest.java | 18 ++ .../odps/OdpsAlterTableSetCommentTest.java | 17 ++ .../sql/odps/OdpsAlterTableSetLifecycle.java | 17 ++ .../bvt/sql/odps/OdpsAlterTableTouchTest.java | 24 ++ .../druid/bvt/sql/odps/OdpsAlterViewTest.java | 16 ++ .../bvt/sql/odps/OdpsAnalyzeTableTest.java | 20 ++ .../druid/bvt/sql/odps/OdpsDropViewTest.java | 33 +++ .../druid/bvt/sql/odps/OdpsIfTest.java | 16 ++ .../bvt/sql/odps/OdpsRemoveStatisticTest.java | 45 +++ .../bvt/sql/odps/OdpsSelectTest_mapjoin.java | 42 +++ 43 files changed, 1906 insertions(+), 56 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddPartition.java create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDisableLifecycle.java create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropPartition.java create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableEnableLifecycle.java create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableRenamePartition.java create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableSetComment.java create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableSetLifecycle.java create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableTouch.java create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterViewRenameStatement.java create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLDescribeStatement.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsAddStatisticStatement.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsAnalyzeTableStatement.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsObjectImpl.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsRemoveStatisticStatement.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsStatisticClause.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAddStatisticTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableAddPartitionTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableDisableLifecycle.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableDropPartitionTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableEnableLifecycle.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableRenamePartitionTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableSetCommentTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableSetLifecycle.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableTouchTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterViewTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAnalyzeTableTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsDropViewTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsIfTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsRemoveStatisticTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_mapjoin.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddPartition.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddPartition.java new file mode 100644 index 0000000000..9041f28678 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddPartition.java @@ -0,0 +1,34 @@ +package com.alibaba.druid.sql.ast.statement; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLAlterTableAddPartition extends SQLObjectImpl implements SQLAlterTableItem { + + private boolean ifNotExists = false; + + private final List partition = new ArrayList(4); + + public List getPartition() { + return partition; + } + + public boolean isIfNotExists() { + return ifNotExists; + } + + public void setIfNotExists(boolean ifNotExists) { + this.ifNotExists = ifNotExists; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, partition); + } + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDisableLifecycle.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDisableLifecycle.java new file mode 100644 index 0000000000..132414196a --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDisableLifecycle.java @@ -0,0 +1,24 @@ +package com.alibaba.druid.sql.ast.statement; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLAlterTableDisableLifecycle extends SQLObjectImpl implements SQLAlterTableItem { + + private final List partition = new ArrayList(4); + + public List getPartition() { + return partition; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, partition); + } + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropPartition.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropPartition.java new file mode 100644 index 0000000000..c0483584d5 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropPartition.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.sql.ast.statement; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLAlterTableDropPartition extends SQLObjectImpl implements SQLAlterTableItem { + + private boolean ifNotExists = false; + + private boolean purge; + + private final List partition = new ArrayList(4); + + public List getPartition() { + return partition; + } + + public boolean isIfNotExists() { + return ifNotExists; + } + + public void setIfNotExists(boolean ifNotExists) { + this.ifNotExists = ifNotExists; + } + + public boolean isPurge() { + return purge; + } + + public void setPurge(boolean purge) { + this.purge = purge; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, partition); + } + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableEnableLifecycle.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableEnableLifecycle.java new file mode 100644 index 0000000000..b96800d099 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableEnableLifecycle.java @@ -0,0 +1,24 @@ +package com.alibaba.druid.sql.ast.statement; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLAlterTableEnableLifecycle extends SQLObjectImpl implements SQLAlterTableItem { + + private final List partition = new ArrayList(4); + + public List getPartition() { + return partition; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, partition); + } + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableRenamePartition.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableRenamePartition.java new file mode 100644 index 0000000000..8f863237b0 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableRenamePartition.java @@ -0,0 +1,40 @@ +package com.alibaba.druid.sql.ast.statement; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLAlterTableRenamePartition extends SQLObjectImpl implements SQLAlterTableItem { + + private boolean ifNotExists = false; + + private final List partition = new ArrayList(4); + private final List to = new ArrayList(4); + + public List getPartition() { + return partition; + } + + public boolean isIfNotExists() { + return ifNotExists; + } + + public void setIfNotExists(boolean ifNotExists) { + this.ifNotExists = ifNotExists; + } + + public List getTo() { + return to; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, partition); + acceptChild(visitor, to); + } + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableSetComment.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableSetComment.java new file mode 100644 index 0000000000..6a3f517438 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableSetComment.java @@ -0,0 +1,30 @@ +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 SQLAlterTableSetComment extends SQLObjectImpl implements SQLAlterTableItem { + + private SQLExpr comment; + + public SQLExpr getComment() { + return comment; + } + + public void setComment(SQLExpr comment) { + if (comment != null) { + comment.setParent(this); + } + this.comment = comment; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, comment); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableSetLifecycle.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableSetLifecycle.java new file mode 100644 index 0000000000..0cae3a23c6 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableSetLifecycle.java @@ -0,0 +1,30 @@ +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 SQLAlterTableSetLifecycle extends SQLObjectImpl implements SQLAlterTableItem { + + private SQLExpr lifecycle; + + public SQLExpr getLifecycle() { + return lifecycle; + } + + public void setLifecycle(SQLExpr comment) { + if (comment != null) { + comment.setParent(this); + } + this.lifecycle = comment; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, lifecycle); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableTouch.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableTouch.java new file mode 100644 index 0000000000..63ef2ab1cf --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableTouch.java @@ -0,0 +1,25 @@ +package com.alibaba.druid.sql.ast.statement; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLAlterTableTouch extends SQLObjectImpl implements SQLAlterTableItem { + + private final List partition = new ArrayList(4); + + public List getPartition() { + return partition; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterViewRenameStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterViewRenameStatement.java new file mode 100644 index 0000000000..878ed4e013 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterViewRenameStatement.java @@ -0,0 +1,42 @@ +package com.alibaba.druid.sql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLAlterViewRenameStatement extends SQLStatementImpl { + + private SQLName name; + private SQLName to; + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + if (name != null) { + name.setParent(this); + } + this.name = name; + } + + public SQLName getTo() { + return to; + } + + public void setTo(SQLName to) { + if (to != null) { + to.setParent(this); + } + this.to = to; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, to); + } + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDescribeStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDescribeStatement.java new file mode 100644 index 0000000000..96ddf17583 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDescribeStatement.java @@ -0,0 +1,23 @@ +package com.alibaba.druid.sql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLDescribeStatement extends SQLStatementImpl { + + protected SQLName object; + + public SQLName getObject() { + return object; + } + + public void setObject(SQLName object) { + this.object = object; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + throw new UnsupportedOperationException(this.getClass().getName()); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDescribeStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDescribeStatement.java index 4a060a4281..27a9bd2be1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDescribeStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDescribeStatement.java @@ -16,11 +16,11 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLDescribeStatement; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class MySqlDescribeStatement extends MySqlStatementImpl { - - private SQLName object; +public class MySqlDescribeStatement extends SQLDescribeStatement implements MySqlStatement { private SQLName colName; @@ -32,12 +32,13 @@ public class MySqlDescribeStatement extends MySqlStatementImpl { visitor.endVisit(this); } - public SQLName getObject() { - return object; - } - - public void setObject(SQLName object) { - this.object = object; + @Override + public void accept0(SQLASTVisitor visitor) { + if (visitor instanceof MySqlASTVisitor) { + accept0((MySqlASTVisitor) visitor); + } else { + throw new IllegalArgumentException("not support visitor type : " + visitor.getClass().getName()); + } } public SQLName getColName() { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsAddStatisticStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsAddStatisticStatement.java new file mode 100644 index 0000000000..4794d5798e --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsAddStatisticStatement.java @@ -0,0 +1,43 @@ +package com.alibaba.druid.sql.dialect.odps.ast; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; + +public class OdpsAddStatisticStatement extends OdpsStatementImpl { + + private SQLExprTableSource table; + + private OdpsStatisticClause statisticClause; + + @Override + protected void accept0(OdpsASTVisitor visitor) { + if (visitor.visit(this)) { + this.acceptChild(visitor, table); + } + visitor.endVisit(this); + } + + public SQLExprTableSource getTable() { + return table; + } + + public void setTable(SQLExprTableSource table) { + if (table != null) { + table.setParent(table); + } + this.table = table; + } + + public void setTable(SQLName table) { + this.setTable(new SQLExprTableSource(table)); + } + + public OdpsStatisticClause getStatisticClause() { + return statisticClause; + } + + public void setStatisticClause(OdpsStatisticClause statisticClause) { + this.statisticClause = statisticClause; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsAnalyzeTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsAnalyzeTableStatement.java new file mode 100644 index 0000000000..4677949812 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsAnalyzeTableStatement.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.sql.dialect.odps.ast; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLAssignItem; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; + +public class OdpsAnalyzeTableStatement extends OdpsStatementImpl { + + private SQLExprTableSource table; + private List partition = new ArrayList(); + + @Override + protected void accept0(OdpsASTVisitor visitor) { + if (visitor.visit(this)) { + this.acceptChild(visitor, table); + this.acceptChild(visitor, partition); + } + visitor.endVisit(this); + } + + public SQLExprTableSource getTable() { + return table; + } + + public void setTable(SQLExprTableSource table) { + if (table != null) { + table.setParent(table); + } + this.table = table; + } + + public void setTable(SQLName table) { + this.setTable(new SQLExprTableSource(table)); + } + + public List getPartition() { + return partition; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsObjectImpl.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsObjectImpl.java new file mode 100644 index 0000000000..1dfa0e261c --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsObjectImpl.java @@ -0,0 +1,20 @@ +package com.alibaba.druid.sql.dialect.odps.ast; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public abstract class OdpsObjectImpl extends SQLObjectImpl { + @Override + protected void accept0(SQLASTVisitor visitor) { + accept0((OdpsASTVisitor) visitor); + } + + protected abstract void accept0(OdpsASTVisitor visitor); + + public String toString() { + return SQLUtils.toOdpsString(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsRemoveStatisticStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsRemoveStatisticStatement.java new file mode 100644 index 0000000000..592fbd4c86 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsRemoveStatisticStatement.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.sql.dialect.odps.ast; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; + +public class OdpsRemoveStatisticStatement extends OdpsStatementImpl { + + private SQLExprTableSource table; + + private OdpsStatisticClause statisticClause; + + @Override + protected void accept0(OdpsASTVisitor visitor) { + if (visitor.visit(this)) { + this.acceptChild(visitor, table); + } + visitor.endVisit(this); + } + + public SQLExprTableSource getTable() { + return table; + } + + public void setTable(SQLExprTableSource table) { + if (table != null) { + table.setParent(table); + } + this.table = table; + } + + public void setTable(SQLName table) { + this.setTable(new SQLExprTableSource(table)); + } + + public OdpsStatisticClause getStatisticClause() { + return statisticClause; + } + + public void setStatisticClause(OdpsStatisticClause statisticClause) { + this.statisticClause = statisticClause; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsSelectQueryBlock.java index 8adfa9c2b8..71b139cae5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsSelectQueryBlock.java @@ -15,7 +15,11 @@ */ package com.alibaba.druid.sql.dialect.odps.ast; +import java.util.ArrayList; +import java.util.List; + import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLHint; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; @@ -26,6 +30,8 @@ public class OdpsSelectQueryBlock extends SQLSelectQueryBlock { private SQLOrderBy orderBy; private SQLExpr limit; + + protected List hints; public OdpsSelectQueryBlock(){ @@ -69,6 +75,21 @@ public class OdpsSelectQueryBlock extends SQLSelectQueryBlock { } else if (!limit.equals(other.limit)) return false; return true; } + + public List getHintsDirect() { + return hints; + } + + public List getHints() { + if (hints == null) { + hints = new ArrayList(2); + } + return hints; + } + + public void setHints(List hints) { + this.hints = hints; + } @Override protected void accept0(SQLASTVisitor visitor) { @@ -82,6 +103,7 @@ public class OdpsSelectQueryBlock extends SQLSelectQueryBlock { public void accept0(OdpsASTVisitor visitor) { if (visitor.visit(this)) { + acceptChild(visitor, this.hints); acceptChild(visitor, this.selectList); acceptChild(visitor, this.from); acceptChild(visitor, this.where); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsStatisticClause.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsStatisticClause.java new file mode 100644 index 0000000000..d1254f1982 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsStatisticClause.java @@ -0,0 +1,102 @@ +package com.alibaba.druid.sql.dialect.odps.ast; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; + +public abstract class OdpsStatisticClause extends OdpsObjectImpl { + + public static abstract class ColumnStatisticClause extends OdpsStatisticClause { + + protected SQLName column; + + public SQLName getColumn() { + return column; + } + + public void setColumn(SQLName column) { + if (column != null) { + column.setParent(this); + } + this.column = column; + } + + } + + public static class NullValue extends ColumnStatisticClause { + @Override + protected void accept0(OdpsASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, column); + } + visitor.endVisit(this); + } + } + + public static class ColumnSum extends ColumnStatisticClause { + @Override + protected void accept0(OdpsASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, column); + } + visitor.endVisit(this); + } + } + + public static class ColumnMin extends ColumnStatisticClause { + @Override + protected void accept0(OdpsASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, column); + } + visitor.endVisit(this); + } + } + + public static class ColumnMax extends ColumnStatisticClause { + @Override + protected void accept0(OdpsASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, column); + } + visitor.endVisit(this); + } + } + + public static class ExpressionCondition extends OdpsStatisticClause { + + private SQLExpr expr; + + public SQLExpr getExpr() { + return expr; + } + + public void setExpr(SQLExpr expr) { + if (expr != null) { + expr.setParent(this); + } + this.expr = expr; + } + + @Override + protected void accept0(OdpsASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, expr); + } + visitor.endVisit(this); + } + } + + public static class TableCount extends OdpsStatisticClause { + + @Override + protected void accept0(OdpsASTVisitor visitor) { + if (visitor.visit(this)) { + + } + visitor.endVisit(this); + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java index 0cadf77166..c8e8d6ecf5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java @@ -43,6 +43,7 @@ public class OdpsLexer extends Lexer { map.put("OVERWRITE", Token.OVERWRITE); map.put("OVER", Token.OVER); map.put("LIMIT", Token.LIMIT); + map.put("IF", Token.IF); DEFAULT_ODPS_KEYWORDS = new Keywords(map); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java index ab5a222dec..0cf938bc47 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java @@ -47,6 +47,10 @@ public class OdpsSelectParser extends SQLSelectParser { } accept(Token.SELECT); + + if (lexer.token() == Token.HINT) { + this.exprParser.parseHints(queryBlock.getHints()); + } if (lexer.token() == Token.COMMENT) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java index 42d8251e4a..aeb0321f8b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java @@ -28,11 +28,15 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSetStatement; import com.alibaba.druid.sql.ast.statement.SQLShowTablesStatement; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsAddStatisticStatement; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsAnalyzeTableStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsert; import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsertStatement; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt; import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLCreateTableParser; import com.alibaba.druid.sql.parser.SQLExprParser; @@ -73,9 +77,97 @@ public class OdpsStatementParser extends SQLStatementParser { statementList.add(stmt); return true; } + + if (identifierEquals("ANALYZE")) { + lexer.nextToken(); + accept(Token.TABLE); + + OdpsAnalyzeTableStatement stmt = new OdpsAnalyzeTableStatement(); + + SQLName table = this.exprParser.name(); + stmt.setTable(table); + + if (lexer.token() == Token.PARTITION) { + lexer.nextToken(); + + accept(Token.LPAREN); + parseAssignItems(stmt.getPartition(), stmt); + accept(Token.RPAREN); + } + + accept(Token.COMPUTE); + acceptIdentifier("STATISTICS"); + + statementList.add(stmt); + return true; + } + + if (identifierEquals("ADD")) { + lexer.nextToken(); + + if (identifierEquals("STATISTIC")) { + lexer.nextToken(); + OdpsAddStatisticStatement stmt = new OdpsAddStatisticStatement(); + stmt.setTable(this.exprParser.name()); + stmt.setStatisticClause(parseStaticClause()); + statementList.add(stmt); + return true; + } + + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } + + if (identifierEquals("REMOVE")) { + lexer.nextToken(); + + if (identifierEquals("STATISTIC")) { + lexer.nextToken(); + OdpsRemoveStatisticStatement stmt = new OdpsRemoveStatisticStatement(); + stmt.setTable(this.exprParser.name()); + stmt.setStatisticClause(parseStaticClause()); + statementList.add(stmt); + return true; + } + + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } return false; } + protected OdpsStatisticClause parseStaticClause() { + if (identifierEquals("TABLE_COUNT")) { + lexer.nextToken(); + return new OdpsStatisticClause.TableCount(); + } else if (identifierEquals("NULL_VALUE")) { + lexer.nextToken(); + OdpsStatisticClause.NullValue null_value = new OdpsStatisticClause.NullValue(); + null_value.setColumn(this.exprParser.name()); + return null_value; + } else if (identifierEquals("COLUMN_SUM")) { + lexer.nextToken(); + OdpsStatisticClause.ColumnSum column_sum = new OdpsStatisticClause.ColumnSum(); + column_sum.setColumn(this.exprParser.name()); + return column_sum; + } else if (identifierEquals("COLUMN_MAX")) { + lexer.nextToken(); + OdpsStatisticClause.ColumnMax column_max = new OdpsStatisticClause.ColumnMax(); + column_max.setColumn(this.exprParser.name()); + return column_max; + } else if (identifierEquals("COLUMN_MIN")) { + lexer.nextToken(); + OdpsStatisticClause.ColumnMin column_min = new OdpsStatisticClause.ColumnMin(); + column_min.setColumn(this.exprParser.name()); + return column_min; + } else if (identifierEquals("EXPRESSION_CONDITION")) { + lexer.nextToken(); + OdpsStatisticClause.ExpressionCondition expr_condition = new OdpsStatisticClause.ExpressionCondition(); + expr_condition.setExpr(this.exprParser.expr()); + return expr_condition; + } else { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } + } + public SQLStatement parseInsert() { OdpsInsertStatement stmt = new OdpsInsertStatement(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java index 9297cda28f..8d373f5c32 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java @@ -15,13 +15,17 @@ */ package com.alibaba.druid.sql.dialect.odps.visitor; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsAddStatisticStatement; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsAnalyzeTableStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsCreateTableStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsert; import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsertStatement; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock; import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt; import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause; import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -58,4 +62,40 @@ public interface OdpsASTVisitor extends SQLASTVisitor { void endVisit(OdpsSelectQueryBlock x); boolean visit(OdpsSelectQueryBlock x); + + void endVisit(OdpsAnalyzeTableStatement x); + + boolean visit(OdpsAnalyzeTableStatement x); + + void endVisit(OdpsAddStatisticStatement x); + + boolean visit(OdpsAddStatisticStatement x); + + void endVisit(OdpsRemoveStatisticStatement x); + + boolean visit(OdpsRemoveStatisticStatement x); + + void endVisit(OdpsStatisticClause.TableCount x); + + boolean visit(OdpsStatisticClause.TableCount x); + + void endVisit(OdpsStatisticClause.ExpressionCondition x); + + boolean visit(OdpsStatisticClause.ExpressionCondition x); + + void endVisit(OdpsStatisticClause.NullValue x); + + boolean visit(OdpsStatisticClause.NullValue x); + + void endVisit(OdpsStatisticClause.ColumnSum x); + + boolean visit(OdpsStatisticClause.ColumnSum x); + + void endVisit(OdpsStatisticClause.ColumnMax x); + + boolean visit(OdpsStatisticClause.ColumnMax x); + + void endVisit(OdpsStatisticClause.ColumnMin x); + + boolean visit(OdpsStatisticClause.ColumnMin x); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitorAdapter.java index 9b4a110c31..70bc2676fd 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitorAdapter.java @@ -15,13 +15,17 @@ */ package com.alibaba.druid.sql.dialect.odps.visitor; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsAddStatisticStatement; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsAnalyzeTableStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsCreateTableStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsert; import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsertStatement; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock; import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt; import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause; import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem; import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; @@ -107,5 +111,95 @@ public class OdpsASTVisitorAdapter extends SQLASTVisitorAdapter implements OdpsA public boolean visit(OdpsSelectQueryBlock x) { return true; } + + @Override + public void endVisit(OdpsAnalyzeTableStatement x) { + + } + + @Override + public boolean visit(OdpsAnalyzeTableStatement x) { + return true; + } + + @Override + public void endVisit(OdpsAddStatisticStatement x) { + + } + + @Override + public boolean visit(OdpsAddStatisticStatement x) { + return true; + } + + @Override + public void endVisit(OdpsRemoveStatisticStatement x) { + + } + + @Override + public boolean visit(OdpsRemoveStatisticStatement x) { + return true; + } + + @Override + public void endVisit(OdpsStatisticClause.TableCount x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.TableCount x) { + return true; + } + + @Override + public void endVisit(OdpsStatisticClause.ExpressionCondition x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.ExpressionCondition x) { + return true; + } + + @Override + public void endVisit(OdpsStatisticClause.NullValue x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.NullValue x) { + return true; + } + + @Override + public void endVisit(OdpsStatisticClause.ColumnSum x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.ColumnSum x) { + return true; + } + + @Override + public void endVisit(OdpsStatisticClause.ColumnMax x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.ColumnMax x) { + return true; + } + + @Override + public void endVisit(OdpsStatisticClause.ColumnMin x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.ColumnMin x) { + return true; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java index e36c39dd94..943ea29faf 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.dialect.odps.visitor; import java.util.List; +import com.alibaba.druid.sql.ast.SQLHint; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLSetQuantifier; import com.alibaba.druid.sql.ast.SQLStatement; @@ -28,13 +29,17 @@ import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsAddStatisticStatement; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsAnalyzeTableStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsCreateTableStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsert; import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsertStatement; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock; import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt; import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause; import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; @@ -395,6 +400,12 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis print("SELECT "); + List hints= x.getHintsDirect(); + if (hints != null) { + printAndAccept(hints, " "); + print(' '); + } + if (SQLSetQuantifier.ALL == x.getDistionOption()) { print("ALL "); } else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) { @@ -457,4 +468,126 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis return false; } + + @Override + public void endVisit(OdpsAnalyzeTableStatement x) { + + } + + @Override + public boolean visit(OdpsAnalyzeTableStatement x) { + print("ANALYZE TABLE "); + x.getTable().accept(this); + + if (x.getPartition().size() > 0) { + print(" PARTITION ("); + printAndAccept(x.getPartition(), ", "); + print(")"); + } + + print(" COMPUTE STATISTICS"); + + return false; + } + + @Override + public void endVisit(OdpsAddStatisticStatement x) { + + } + + @Override + public boolean visit(OdpsAddStatisticStatement x) { + print("ADD STATISTIC "); + x.getTable().accept(this); + print(" "); + x.getStatisticClause().accept(this); + + return false; + } + + @Override + public void endVisit(OdpsRemoveStatisticStatement x) { + + } + + @Override + public boolean visit(OdpsRemoveStatisticStatement x) { + print("REMOVE STATISTIC "); + x.getTable().accept(this); + print(" "); + x.getStatisticClause().accept(this); + + return false; + } + + @Override + public void endVisit(OdpsStatisticClause.TableCount x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.TableCount x) { + print("TABLE_COUNT"); + return false; + } + + @Override + public void endVisit(OdpsStatisticClause.ExpressionCondition x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.ExpressionCondition x) { + print("EXPRESSION_CONDITION "); + x.getExpr().accept(this); + return false; + } + + @Override + public void endVisit(OdpsStatisticClause.NullValue x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.NullValue x) { + print("NULL_VALUE "); + x.getColumn().accept(this); + return false; + } + + @Override + public void endVisit(OdpsStatisticClause.ColumnSum x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.ColumnSum x) { + print("COLUMN_SUM "); + x.getColumn().accept(this); + return false; + } + + @Override + public void endVisit(OdpsStatisticClause.ColumnMax x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.ColumnMax x) { + print("COLUMN_MAX "); + x.getColumn().accept(this); + return false; + } + + @Override + public void endVisit(OdpsStatisticClause.ColumnMin x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.ColumnMin x) { + print("COLUMN_MIN "); + x.getColumn().accept(this); + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java index 9d85e02264..22bb86d69e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java @@ -17,13 +17,17 @@ package com.alibaba.druid.sql.dialect.odps.visitor; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsAddStatisticStatement; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsAnalyzeTableStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsCreateTableStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsert; import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsertStatement; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock; import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement; import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt; import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt; +import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause; import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; @@ -111,5 +115,94 @@ public class OdpsSchemaStatVisitor extends SchemaStatVisitor implements OdpsASTV public boolean visit(OdpsSelectQueryBlock x) { return this.visit((SQLSelectQueryBlock) x); } + + @Override + public void endVisit(OdpsAnalyzeTableStatement x) { + + } + + @Override + public boolean visit(OdpsAnalyzeTableStatement x) { + return true; + } + @Override + public void endVisit(OdpsAddStatisticStatement x) { + + } + + @Override + public boolean visit(OdpsAddStatisticStatement x) { + return true; + } + + @Override + public void endVisit(OdpsRemoveStatisticStatement x) { + + } + + @Override + public boolean visit(OdpsRemoveStatisticStatement x) { + return true; + } + + @Override + public void endVisit(OdpsStatisticClause.TableCount x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.TableCount x) { + return true; + } + + @Override + public void endVisit(OdpsStatisticClause.ExpressionCondition x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.ExpressionCondition x) { + return true; + } + + @Override + public void endVisit(OdpsStatisticClause.NullValue x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.NullValue x) { + return true; + } + + @Override + public void endVisit(OdpsStatisticClause.ColumnSum x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.ColumnSum x) { + return true; + } + + @Override + public void endVisit(OdpsStatisticClause.ColumnMax x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.ColumnMax x) { + return true; + } + + @Override + public void endVisit(OdpsStatisticClause.ColumnMin x) { + + } + + @Override + public boolean visit(OdpsStatisticClause.ColumnMin x) { + return true; + } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 48924b9b9f..b70ed071bd 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -29,17 +29,26 @@ import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPartition; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableKeys; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableLifecycle; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPartition; import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableKeys; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableLifecycle; 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.SQLAlterTableRenamePartition; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableSetComment; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableSetLifecycle; import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableTouch; +import com.alibaba.druid.sql.ast.statement.SQLAlterViewRenameStatement; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLCheck; @@ -88,16 +97,16 @@ import com.alibaba.druid.sql.dialect.odps.parser.OdpsSelectParser; public class SQLStatementParser extends SQLParser { - protected SQLExprParser exprParser; + protected SQLExprParser exprParser; - protected boolean parseCompleteValues = true; + protected boolean parseCompleteValues = true; + + protected int parseValuesSize = 3; + + protected List comments; + + protected CommentCallback commentCallBack = new CommentCallback(); - protected int parseValuesSize = 3; - - protected List comments; - - protected CommentCallback commentCallBack = new CommentCallback(); - public SQLStatementParser(String sql){ this(sql, null); } @@ -105,20 +114,20 @@ public class SQLStatementParser extends SQLParser { public SQLStatementParser(String sql, String dbType){ this(new SQLExprParser(sql, dbType)); } - + public SQLStatementParser(SQLExprParser exprParser){ super(exprParser.getLexer(), exprParser.getDbType()); this.exprParser = exprParser; } - + protected SQLStatementParser(Lexer lexer, String dbType){ super(lexer, dbType); } - + public boolean isKeepComments() { return lexer.isKeepComments(); } - + public void setKeepComments(boolean keepComments) { this.lexer.setKeepComments(keepComments); } @@ -143,9 +152,9 @@ public class SQLStatementParser extends SQLParser { comments = this.comments; this.comments = null; } - + int size_original = statementList.size(); - + for (;;) { boolean isFirstStmt = statementList.size() == size_original + 1; if (isFirstStmt && comments != null && lexer.isKeepComments()) { @@ -155,13 +164,13 @@ public class SQLStatementParser extends SQLParser { } comments = null; } - + if (max != -1) { if (statementList.size() >= max) { return; } } - + if (lexer.token() == Token.EOF) { return; } @@ -286,7 +295,7 @@ public class SQLStatementParser extends SQLParser { statementList.add(stmt); continue; } - + if (lexer.token() == Token.REVOKE) { SQLStatement stmt = parseRevoke(); statementList.add(stmt); @@ -394,7 +403,7 @@ public class SQLStatementParser extends SQLParser { public SQLStatement parseShow() { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } - + public SQLUseStatement parseUse() { accept(Token.USE); SQLUseStatement stmt = new SQLUseStatement(getDbType()); @@ -427,7 +436,7 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); stmt.setObjectType(SQLObjectType.DATABASE); } - + if (stmt.getObjectType() != null && lexer.token() == Token.COLONCOLON) { lexer.nextToken(); // sql server } @@ -682,7 +691,7 @@ public class SQLStatementParser extends SQLParser { } else if (identifierEquals("SUPER")) { lexer.nextToken(); privilege = "SUPER"; - + } else if (identifierEquals("CONTROL")) { // sqlserver lexer.nextToken(); privilege = "CONTROL"; @@ -709,12 +718,12 @@ public class SQLStatementParser extends SQLParser { break; } } - + public SQLRevokeStatement parseRevoke() { accept(Token.REVOKE); - + SQLRevokeStatement stmt = new SQLRevokeStatement(getDbType()); - + parsePrivileages(stmt.getPrivileges(), stmt); if (lexer.token() == Token.ON) { @@ -780,6 +789,15 @@ public class SQLStatementParser extends SQLParser { } else if (identifierEquals("ADD")) { lexer.nextToken(); + boolean ifNotExists = false; + + if (lexer.token() == Token.IF) { + lexer.nextToken(); + accept(Token.NOT); + accept(Token.EXISTS); + ifNotExists = true; + } + if (lexer.token() == Token.PRIMARY) { SQLPrimaryKey primaryKey = this.exprParser.parsePrimaryKey(); SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(primaryKey); @@ -803,6 +821,19 @@ public class SQLStatementParser extends SQLParser { SQLConstraint constraint = this.exprParser.parseForeignKey(); SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(constraint); stmt.getItems().add(item); + } else if (lexer.token() == Token.PARTITION) { + lexer.nextToken(); + SQLAlterTableAddPartition addPartition = new SQLAlterTableAddPartition(); + + addPartition.setIfNotExists(ifNotExists); + + accept(Token.LPAREN); + + parseAssignItems(addPartition.getPartition(), addPartition); + + accept(Token.RPAREN); + + stmt.getItems().add(addPartition); } else { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } @@ -814,6 +845,10 @@ public class SQLStatementParser extends SQLParser { SQLAlterTableDisableConstraint item = new SQLAlterTableDisableConstraint(); item.setConstraintName(this.exprParser.name()); stmt.getItems().add(item); + } else if (identifierEquals("LIFECYCLE")) { + lexer.nextToken(); + SQLAlterTableDisableLifecycle item = new SQLAlterTableDisableLifecycle(); + stmt.getItems().add(item); } else { acceptIdentifier("KEYS"); SQLAlterTableDisableKeys item = new SQLAlterTableDisableKeys(); @@ -826,6 +861,10 @@ public class SQLStatementParser extends SQLParser { SQLAlterTableEnableConstraint item = new SQLAlterTableEnableConstraint(); item.setConstraintName(this.exprParser.name()); stmt.getItems().add(item); + } else if (identifierEquals("LIFECYCLE")) { + lexer.nextToken(); + SQLAlterTableEnableLifecycle item = new SQLAlterTableEnableLifecycle(); + stmt.getItems().add(item); } else { acceptIdentifier("KEYS"); SQLAlterTableEnableKeys item = new SQLAlterTableEnableKeys(); @@ -854,16 +893,117 @@ public class SQLStatementParser extends SQLParser { stmt.getItems().add(addCheck); } else if (identifierEquals("RENAME")) { stmt.getItems().add(parseAlterTableRename()); + } else if (lexer.token() == Token.SET) { + lexer.nextToken(); + + if (lexer.token() == Token.COMMENT) { + lexer.nextToken(); + SQLAlterTableSetComment setComment = new SQLAlterTableSetComment(); + setComment.setComment(this.exprParser.primary()); + stmt.getItems().add(setComment); + } else if (identifierEquals("LIFECYCLE")) { + lexer.nextToken(); + SQLAlterTableSetLifecycle setLifecycle = new SQLAlterTableSetLifecycle(); + setLifecycle.setLifecycle(this.exprParser.primary()); + stmt.getItems().add(setLifecycle); + } else { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } + } else if (lexer.token() == Token.PARTITION) { + lexer.nextToken(); + + SQLAlterTableRenamePartition renamePartition = new SQLAlterTableRenamePartition(); + + accept(Token.LPAREN); + + parseAssignItems(renamePartition.getPartition(), renamePartition); + + accept(Token.RPAREN); + + if (lexer.token() == Token.ENABLE) { + lexer.nextToken(); + if(identifierEquals("LIFECYCLE")) { + lexer.nextToken(); + } + + SQLAlterTableEnableLifecycle enableLifeCycle = new SQLAlterTableEnableLifecycle(); + for (SQLAssignItem condition : renamePartition.getPartition()) { + enableLifeCycle.getPartition().add(condition); + condition.setParent(enableLifeCycle); + } + stmt.getItems().add(enableLifeCycle); + + continue; + } + + if (lexer.token() == Token.DISABLE) { + lexer.nextToken(); + if(identifierEquals("LIFECYCLE")) { + lexer.nextToken(); + } + + SQLAlterTableDisableLifecycle disableLifeCycle = new SQLAlterTableDisableLifecycle(); + for (SQLAssignItem condition : renamePartition.getPartition()) { + disableLifeCycle.getPartition().add(condition); + condition.setParent(disableLifeCycle); + } + stmt.getItems().add(disableLifeCycle); + + continue; + } + + acceptIdentifier("RENAME"); + accept(Token.TO); + accept(Token.PARTITION); + + accept(Token.LPAREN); + + parseAssignItems(renamePartition.getTo(), renamePartition); + + accept(Token.RPAREN); + + stmt.getItems().add(renamePartition); + } else if(identifierEquals("TOUCH")) { + lexer.nextToken(); + SQLAlterTableTouch item = new SQLAlterTableTouch(); + + if (lexer.token() == Token.PARTITION) { + lexer.nextToken(); + + accept(Token.LPAREN); + parseAssignItems(item.getPartition(), item); + accept(Token.RPAREN); + } + + stmt.getItems().add(item); } else { break; } } return stmt; + } else if (lexer.token() == Token.VIEW) { + lexer.nextToken(); + SQLName viewName = this.exprParser.name(); + + if (identifierEquals("RENAME")) { + lexer.nextToken(); + accept(Token.TO); + + SQLAlterViewRenameStatement stmt = new SQLAlterViewRenameStatement(); + stmt.setName(viewName); + + SQLName newName = this.exprParser.name(); + + stmt.setTo(newName); + + return stmt; + } + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } - + protected SQLAlterTableItem parseAlterTableRename() { acceptIdentifier("RENAME"); @@ -875,21 +1015,21 @@ public class SQLStatementParser extends SQLParser { 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; @@ -898,6 +1038,15 @@ public class SQLStatementParser extends SQLParser { public void parseAlterDrop(SQLAlterTableStatement stmt) { lexer.nextToken(); + boolean ifNotExists = false; + + if (lexer.token() == Token.IF) { + lexer.nextToken(); + accept(Token.NOT); + accept(Token.EXISTS); + ifNotExists = true; + } + if (lexer.token() == Token.CONSTRAINT) { lexer.nextToken(); SQLAlterTableDropConstraint item = new SQLAlterTableDropConstraint(); @@ -907,23 +1056,41 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); this.exprParser.names(item.getColumns()); - - if(lexer.token == Token.CASCADE) { + + if (lexer.token == Token.CASCADE) { item.setCascade(true); lexer.nextToken(); } - + stmt.getItems().add(item); } else if (lexer.token() == Token.LITERAL_ALIAS) { SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); this.exprParser.names(item.getColumns()); - - if(lexer.token == Token.CASCADE) { + + if (lexer.token == Token.CASCADE) { item.setCascade(true); lexer.nextToken(); } - + stmt.getItems().add(item); + } else if (lexer.token() == Token.PARTITION) { + lexer.nextToken(); + SQLAlterTableDropPartition dropPartition = new SQLAlterTableDropPartition(); + + dropPartition.setIfNotExists(ifNotExists); + + accept(Token.LPAREN); + + parseAssignItems(dropPartition.getPartition(), dropPartition); + + accept(Token.RPAREN); + + if (identifierEquals("PURGE")) { + lexer.nextToken(); + dropPartition.setPurge(true); + } + + stmt.getItems().add(dropPartition); } else { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } @@ -1385,7 +1552,7 @@ public class SQLStatementParser extends SQLParser { lexer.reset(markBp, markChar, Token.CREATE); return parseCreateProcedure(); } - + if (lexer.token() == Token.VIEW) { lexer.reset(markBp, markChar, Token.CREATE); return parseCreateView(); @@ -1468,7 +1635,7 @@ public class SQLStatementParser extends SQLParser { } List body = this.parseStatementList(); - if(body == null || body.isEmpty()) { + if (body == null || body.isEmpty()) { throw new ParserException("syntax error"); } stmt.setBody(body.get(0)); @@ -1646,7 +1813,7 @@ public class SQLStatementParser extends SQLParser { } this.accept(Token.VIEW); - + if (lexer.token() == Token.IF || identifierEquals("IF")) { lexer.nextToken(); accept(Token.NOT); @@ -1658,30 +1825,30 @@ public class SQLStatementParser extends SQLParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - + for (;;) { SQLCreateViewStatement.Column column = new SQLCreateViewStatement.Column(); SQLExpr expr = this.exprParser.expr(); column.setExpr(expr); - + if (lexer.token() == Token.COMMENT) { lexer.nextToken(); - column.setComment((SQLCharExpr) exprParser.primary()); + column.setComment((SQLCharExpr) exprParser.primary()); } - + column.setParent(createView); createView.getColumns().add(column); - + if (lexer.token() == Token.COMMA) { lexer.nextToken(); } else { break; } } - + accept(Token.RPAREN); } - + if (lexer.token() == Token.COMMENT) { lexer.nextToken(); SQLCharExpr comment = (SQLCharExpr) exprParser.primary(); @@ -1821,18 +1988,18 @@ public class SQLStatementParser extends SQLParser { public void setParseValuesSize(int parseValuesSize) { this.parseValuesSize = parseValuesSize; } - + class CommentCallback implements Lexer.CommentHandler { @Override public boolean handle(Token lastToken, String comment) { addComment(comment); - + return true; } - + } - + void addComment(String comment) { if (comments == null) { comments = new ArrayList(); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index e8666f2a83..ea384b981c 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -70,20 +70,29 @@ import com.alibaba.druid.sql.ast.statement.NotNullConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPartition; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableKeys; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableLifecycle; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropForeignKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPartition; 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.SQLAlterTableEnableLifecycle; 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.SQLAlterTableRenamePartition; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableSetComment; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableSetLifecycle; import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableTouch; +import com.alibaba.druid.sql.ast.statement.SQLAlterViewRenameStatement; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; @@ -2207,4 +2216,101 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab } } } + + @Override + public boolean visit(SQLAlterViewRenameStatement x) { + print("ALTER VIEW "); + x.getName().accept(this); + print(" RENAME TO "); + x.getTo().accept(this); + return false; + } + + @Override + public boolean visit(SQLAlterTableAddPartition x) { + print("ADD "); + if (x.isIfNotExists()) { + print("IF NOT EXISTS "); + } + print("PARTITION ("); + printAndAccept(x.getPartition(), ", "); + print(")"); + return false; + } + + @Override + public boolean visit(SQLAlterTableDropPartition x) { + print("DROP "); + if (x.isIfNotExists()) { + print("IF NOT EXISTS "); + } + print("PARTITION ("); + printAndAccept(x.getPartition(), ", "); + print(")"); + + if (x.isPurge()) { + print(" PURGE"); + } + return false; + } + + @Override + public boolean visit(SQLAlterTableRenamePartition x) { + print("PARTITION ("); + printAndAccept(x.getPartition(), ", "); + print(") RENAME TO PARTITION("); + printAndAccept(x.getTo(), ", "); + print(")"); + return false; + } + + @Override + public boolean visit(SQLAlterTableSetComment x) { + print("SET COMMENT "); + x.getComment().accept(this); + return false; + } + + @Override + public boolean visit(SQLAlterTableSetLifecycle x) { + print("SET LIFECYCLE "); + x.getLifecycle().accept(this); + return false; + } + + @Override + public boolean visit(SQLAlterTableEnableLifecycle x) { + if (x.getPartition().size() != 0) { + print("PARTITION ("); + printAndAccept(x.getPartition(), ", "); + print(") "); + } + + print("ENABLE LIFECYCLE"); + return false; + } + + @Override + public boolean visit(SQLAlterTableDisableLifecycle x) { + if (x.getPartition().size() != 0) { + print("PARTITION ("); + printAndAccept(x.getPartition(), ", "); + print(") "); + } + + print("DISABLE LIFECYCLE"); + return false; + } + + @Override + public boolean visit(SQLAlterTableTouch x) { + print("TOUCH"); + if (x.getPartition().size() != 0) { + print(" PARTITION ("); + printAndAccept(x.getPartition(), ", "); + print(")"); + } + return false; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index ab0b3fe040..44f9613daf 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -55,19 +55,28 @@ import com.alibaba.druid.sql.ast.statement.NotNullConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPartition; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableKeys; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableLifecycle; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropForeignKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPartition; 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.SQLAlterTableEnableLifecycle; import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename; import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenamePartition; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableSetComment; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableSetLifecycle; import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableTouch; +import com.alibaba.druid.sql.ast.statement.SQLAlterViewRenameStatement; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; @@ -570,8 +579,44 @@ public interface SQLASTVisitor { boolean visit(SQLAlterTableRename x); + void endVisit(SQLAlterViewRenameStatement x); + + boolean visit(SQLAlterViewRenameStatement x); + void endVisit(SQLShowTablesStatement x); boolean visit(SQLShowTablesStatement x); + void endVisit(SQLAlterTableAddPartition x); + + boolean visit(SQLAlterTableAddPartition x); + + void endVisit(SQLAlterTableDropPartition x); + + boolean visit(SQLAlterTableDropPartition x); + + void endVisit(SQLAlterTableRenamePartition x); + + boolean visit(SQLAlterTableRenamePartition x); + + void endVisit(SQLAlterTableSetComment x); + + boolean visit(SQLAlterTableSetComment x); + + void endVisit(SQLAlterTableSetLifecycle x); + + boolean visit(SQLAlterTableSetLifecycle x); + + void endVisit(SQLAlterTableEnableLifecycle x); + + boolean visit(SQLAlterTableEnableLifecycle x); + + void endVisit(SQLAlterTableDisableLifecycle x); + + boolean visit(SQLAlterTableDisableLifecycle x); + + void endVisit(SQLAlterTableTouch x); + + boolean visit(SQLAlterTableTouch x); + } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index 77c3b3d1c8..ed662fabf3 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -56,19 +56,28 @@ import com.alibaba.druid.sql.ast.statement.NotNullConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPartition; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableKeys; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableLifecycle; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropForeignKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPartition; 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.SQLAlterTableEnableLifecycle; import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename; import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenamePartition; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableSetComment; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableSetLifecycle; import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableTouch; +import com.alibaba.druid.sql.ast.statement.SQLAlterViewRenameStatement; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; @@ -1116,6 +1125,16 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { return true; } + @Override + public void endVisit(SQLAlterViewRenameStatement x) { + + } + + @Override + public boolean visit(SQLAlterViewRenameStatement x) { + return true; + } + @Override public void endVisit(SQLShowTablesStatement x) { @@ -1126,4 +1145,84 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { return true; } + @Override + public void endVisit(SQLAlterTableAddPartition x) { + + } + + @Override + public boolean visit(SQLAlterTableAddPartition x) { + return true; + } + + @Override + public void endVisit(SQLAlterTableDropPartition x) { + + } + + @Override + public boolean visit(SQLAlterTableDropPartition x) { + return true; + } + + @Override + public void endVisit(SQLAlterTableRenamePartition x) { + + } + + @Override + public boolean visit(SQLAlterTableRenamePartition x) { + return true; + } + + @Override + public void endVisit(SQLAlterTableSetComment x) { + + } + + @Override + public boolean visit(SQLAlterTableSetComment x) { + return true; + } + + @Override + public void endVisit(SQLAlterTableSetLifecycle x) { + + } + + @Override + public boolean visit(SQLAlterTableSetLifecycle x) { + return true; + } + + @Override + public void endVisit(SQLAlterTableEnableLifecycle x) { + + } + + @Override + public boolean visit(SQLAlterTableEnableLifecycle x) { + return true; + } + + @Override + public void endVisit(SQLAlterTableDisableLifecycle x) { + + } + + @Override + public boolean visit(SQLAlterTableDisableLifecycle x) { + return true; + } + + @Override + public void endVisit(SQLAlterTableTouch x) { + + } + + @Override + public boolean visit(SQLAlterTableTouch x) { + return true; + } + } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAddStatisticTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAddStatisticTest.java new file mode 100644 index 0000000000..937ea11cfc --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAddStatisticTest.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsAddStatisticTest extends TestCase { + public void test_table_count() throws Exception { + String sql = "add statistic tbl_shop table_count;"; + Assert.assertEquals("ADD STATISTIC tbl_shop TABLE_COUNT" + + "\n;", SQLUtils.formatOdps(sql)); + } + + public void test_null_value() throws Exception { + String sql = "add statistic tbl_shop null_value shop_name;"; + Assert.assertEquals("ADD STATISTIC tbl_shop NULL_VALUE shop_name" + + "\n;", SQLUtils.formatOdps(sql)); + } + + public void test_column_sum() throws Exception { + String sql = "add statistic tbl_shop column_sum shop_name;"; + Assert.assertEquals("ADD STATISTIC tbl_shop COLUMN_SUM shop_name" + + "\n;", SQLUtils.formatOdps(sql)); + } + + public void test_column_max() throws Exception { + String sql = "add statistic tbl_shop column_max shop_name;"; + Assert.assertEquals("ADD STATISTIC tbl_shop COLUMN_MAX shop_name" + + "\n;", SQLUtils.formatOdps(sql)); + } + + public void test_column_min() throws Exception { + String sql = "add statistic tbl_shop column_min shop_name;"; + Assert.assertEquals("ADD STATISTIC tbl_shop COLUMN_MIN shop_name" + + "\n;", SQLUtils.formatOdps(sql)); + } + + public void test_expression_condition() throws Exception { + String sql = "add statistic tbl_shop expression_condition tbl_shop='hangzhou';"; + Assert.assertEquals("ADD STATISTIC tbl_shop EXPRESSION_CONDITION tbl_shop = 'hangzhou'" + + "\n;", SQLUtils.formatOdps(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableAddPartitionTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableAddPartitionTest.java new file mode 100644 index 0000000000..02749ced8f --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableAddPartitionTest.java @@ -0,0 +1,17 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsAlterTableAddPartitionTest extends TestCase { + + public void test_if() throws Exception { + String sql = "alter table sale_detail add if not exists partition (sale_date='201312', region='hangzhou');"; + Assert.assertEquals("ALTER TABLE sale_detail" // + + "\n\tADD IF NOT EXISTS PARTITION (sale_date = '201312', region = 'hangzhou')" + + "\n;", SQLUtils.formatOdps(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableDisableLifecycle.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableDisableLifecycle.java new file mode 100644 index 0000000000..a1dc909162 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableDisableLifecycle.java @@ -0,0 +1,25 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsAlterTableDisableLifecycle extends TestCase { + + public void test_no_partition() throws Exception { + String sql = "ALTER TABLE trans DISABLE LIFECYCLE;"; + Assert.assertEquals("ALTER TABLE trans" // + + "\n\tDISABLE LIFECYCLE" // + + "\n;", SQLUtils.formatOdps(sql)); + } + + + public void test_has_partition() throws Exception { + String sql = "ALTER TABLE trans PARTITION(dt='20141111') DISABLE LIFECYCLE;"; + Assert.assertEquals("ALTER TABLE trans" + + "\n\tPARTITION (dt = '20141111') DISABLE LIFECYCLE" + + "\n;", SQLUtils.formatOdps(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableDropPartitionTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableDropPartitionTest.java new file mode 100644 index 0000000000..86caf43e97 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableDropPartitionTest.java @@ -0,0 +1,24 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsAlterTableDropPartitionTest extends TestCase { + + public void test_if() throws Exception { + String sql = "alter table sale_detail drop if not exists partition (sale_date='201312', region='hangzhou');"; + Assert.assertEquals("ALTER TABLE sale_detail" // + + "\n\tDROP IF NOT EXISTS PARTITION (sale_date = '201312', region = 'hangzhou')" + + "\n;", SQLUtils.formatOdps(sql)); + } + + public void test_purge() throws Exception { + String sql = "alter table my_log drop partition (ds='20150618') purge;"; + Assert.assertEquals("ALTER TABLE my_log" + + "\n\tDROP PARTITION (ds = '20150618') PURGE" + + "\n;", SQLUtils.formatOdps(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableEnableLifecycle.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableEnableLifecycle.java new file mode 100644 index 0000000000..51afefe1bf --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableEnableLifecycle.java @@ -0,0 +1,25 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsAlterTableEnableLifecycle extends TestCase { + + public void test_no_partition() throws Exception { + String sql = "ALTER TABLE trans ENABLE LIFECYCLE;"; + Assert.assertEquals("ALTER TABLE trans" // + + "\n\tENABLE LIFECYCLE" // + + "\n;", SQLUtils.formatOdps(sql)); + } + + + public void test_has_partition() throws Exception { + String sql = "ALTER TABLE trans PARTITION(dt='20141111') ENABLE LIFECYCLE;"; + Assert.assertEquals("ALTER TABLE trans" + + "\n\tPARTITION (dt = '20141111') ENABLE LIFECYCLE" + + "\n;", SQLUtils.formatOdps(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableRenamePartitionTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableRenamePartitionTest.java new file mode 100644 index 0000000000..5f601806fb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableRenamePartitionTest.java @@ -0,0 +1,18 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsAlterTableRenamePartitionTest extends TestCase { + + public void test_if() throws Exception { + String sql = "alter table sale_detail partition (sale_date='201312', region='hangzhou')" + + "\nrename to partition(sale_date='201313', region='hangzhou');"; + Assert.assertEquals("ALTER TABLE sale_detail" + + "\n\tPARTITION (sale_date = '201312', region = 'hangzhou') RENAME TO PARTITION(sale_date = '201313', region = 'hangzhou')" + + "\n;", SQLUtils.formatOdps(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableSetCommentTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableSetCommentTest.java new file mode 100644 index 0000000000..39b5fc2692 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableSetCommentTest.java @@ -0,0 +1,17 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsAlterTableSetCommentTest extends TestCase { + + public void test_if() throws Exception { + String sql = "alter table sale_detail set comment 'new coments for table sale_detail';"; + Assert.assertEquals("ALTER TABLE sale_detail" // + + "\n\tSET COMMENT 'new coments for table sale_detail'" // + + "\n;", SQLUtils.formatOdps(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableSetLifecycle.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableSetLifecycle.java new file mode 100644 index 0000000000..f4ea839ec8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableSetLifecycle.java @@ -0,0 +1,17 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsAlterTableSetLifecycle extends TestCase { + + public void test_if() throws Exception { + String sql = "alter table test_lifecycle set lifecycle 50;"; + Assert.assertEquals("ALTER TABLE test_lifecycle" // + + "\n\tSET LIFECYCLE 50" // + + "\n;", SQLUtils.formatOdps(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableTouchTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableTouchTest.java new file mode 100644 index 0000000000..3bbe069f60 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterTableTouchTest.java @@ -0,0 +1,24 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsAlterTableTouchTest extends TestCase { + + public void test_touch() throws Exception { + String sql = "alter table test_lifecycle touch;"; + Assert.assertEquals("ALTER TABLE test_lifecycle" // + + "\n\tTOUCH" // + + "\n;", SQLUtils.formatOdps(sql)); + } + + public void test_touch_partition() throws Exception { + String sql = "alter table test_lifecycle touch PARTITION (dt='20141111');"; + Assert.assertEquals("ALTER TABLE test_lifecycle" // + + "\n\tTOUCH PARTITION (dt = '20141111')" // + + "\n;", SQLUtils.formatOdps(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterViewTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterViewTest.java new file mode 100644 index 0000000000..58da36c37a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAlterViewTest.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsAlterViewTest extends TestCase { + + public void test_if() throws Exception { + String sql = "alter view view_name rename to new_view_name;"; + Assert.assertEquals("ALTER VIEW view_name RENAME TO new_view_name" + + "\n;", SQLUtils.formatOdps(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAnalyzeTableTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAnalyzeTableTest.java new file mode 100644 index 0000000000..b1070f8968 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsAnalyzeTableTest.java @@ -0,0 +1,20 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsAnalyzeTableTest extends TestCase { + public void test_0() throws Exception { + String sql = "analyze table t partition(pt='1') compute statistics"; + Assert.assertEquals("ANALYZE TABLE t PARTITION (pt = '1') COMPUTE STATISTICS", SQLUtils.formatOdps(sql)); + } + + public void test_no_partition() throws Exception { + String sql = "analyze table t compute statistics"; + Assert.assertEquals("ANALYZE TABLE t COMPUTE STATISTICS", SQLUtils.formatOdps(sql)); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsDropViewTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsDropViewTest.java new file mode 100644 index 0000000000..0923ee5a71 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsDropViewTest.java @@ -0,0 +1,33 @@ +/* + * 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.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsDropViewTest extends TestCase { + + public void test_column_comment() throws Exception { + String sql = "drop view if exists view_name;"; + Assert.assertEquals("DROP VIEW IF EXISTS view_name" // + + "\n;", SQLUtils.formatOdps(sql)); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsIfTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsIfTest.java new file mode 100644 index 0000000000..28ec943d85 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsIfTest.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsIfTest extends TestCase { + + public void test_if() throws Exception { + String sql = "select sum(if(a > 0, 1, 0)) from t1"; + Assert.assertEquals("SELECT SUM(if(a > 0, 1, 0))" // + + "\nFROM t1", SQLUtils.formatOdps(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsRemoveStatisticTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsRemoveStatisticTest.java new file mode 100644 index 0000000000..f29728dc99 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsRemoveStatisticTest.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsRemoveStatisticTest extends TestCase { + public void test_table_count() throws Exception { + String sql = "remove statistic tbl_shop table_count;"; + Assert.assertEquals("REMOVE STATISTIC tbl_shop TABLE_COUNT" + + "\n;", SQLUtils.formatOdps(sql)); + } + + public void test_null_value() throws Exception { + String sql = "remove statistic tbl_shop null_value shop_name;"; + Assert.assertEquals("REMOVE STATISTIC tbl_shop NULL_VALUE shop_name" + + "\n;", SQLUtils.formatOdps(sql)); + } + + public void test_column_sum() throws Exception { + String sql = "remove statistic tbl_shop column_sum shop_name;"; + Assert.assertEquals("REMOVE STATISTIC tbl_shop COLUMN_SUM shop_name" + + "\n;", SQLUtils.formatOdps(sql)); + } + + public void test_column_max() throws Exception { + String sql = "remove statistic tbl_shop column_max shop_name;"; + Assert.assertEquals("REMOVE STATISTIC tbl_shop COLUMN_MAX shop_name" + + "\n;", SQLUtils.formatOdps(sql)); + } + + public void test_column_min() throws Exception { + String sql = "remove statistic tbl_shop column_min shop_name;"; + Assert.assertEquals("REMOVE STATISTIC tbl_shop COLUMN_MIN shop_name" + + "\n;", SQLUtils.formatOdps(sql)); + } + + public void test_expression_condition() throws Exception { + String sql = "remove statistic tbl_shop expression_condition tbl_shop='hangzhou';"; + Assert.assertEquals("REMOVE STATISTIC tbl_shop EXPRESSION_CONDITION tbl_shop = 'hangzhou'" + + "\n;", SQLUtils.formatOdps(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_mapjoin.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_mapjoin.java new file mode 100644 index 0000000000..d61263211c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest_mapjoin.java @@ -0,0 +1,42 @@ +/* + * 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.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsSelectTest_mapjoin extends TestCase { + + public void test_column_comment() throws Exception { + String sql = " select /* + mapjoin(a) */" + + "\na.shop_name," + + "\nb.customer_id," + + "\nb.total_price" + + "\nfrom shop a join sale_detail b" + + "\non a.shop_name = b.shop_name;"; + Assert.assertEquals("SELECT /*+ mapjoin(a) */ a.shop_name, " + + "\n\tb.customer_id, " + + "\n\tb.total_price" + + "\nFROM shop a" + + "\nJOIN sale_detail b ON a.shop_name = b.shop_name" + + "\n;", SQLUtils.formatOdps(sql)); + } + + +}