improved create oracle createMaterializedView support. for issue #2211

This commit is contained in:
wenshao
2017-12-25 22:24:48 +08:00
parent 15f3fb0669
commit 2b1339c633
13 changed files with 394 additions and 17 deletions
@@ -17,6 +17,7 @@ package com.alibaba.druid.sql.ast.statement;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.SQLPartitionBy;
import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSegmentAttributes;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
@@ -56,6 +57,7 @@ public class SQLCreateMaterializedViewStatement extends SQLStatementImpl impleme
private Integer pctthreshold;
private Boolean logging;
private Boolean cache;
protected SQLName tablespace;
protected SQLObject storage;
@@ -65,6 +67,10 @@ public class SQLCreateMaterializedViewStatement extends SQLStatementImpl impleme
private Boolean enableQueryRewrite;
private SQLPartitionBy partitionBy;
private boolean withRowId;
public SQLName getName() {
return name;
}
@@ -285,11 +291,39 @@ public class SQLCreateMaterializedViewStatement extends SQLStatementImpl impleme
this.enableQueryRewrite = enableQueryRewrite;
}
public Boolean getCache() {
return cache;
}
public void setCache(Boolean cache) {
this.cache = cache;
}
public SQLPartitionBy getPartitionBy() {
return partitionBy;
}
public void setPartitionBy(SQLPartitionBy x) {
if (x != null) {
x.setParent(this);
}
this.partitionBy = x;
}
public boolean isWithRowId() {
return withRowId;
}
public void setWithRowId(boolean withRowId) {
this.withRowId = withRowId;
}
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, name);
acceptChild(visitor, columns);
acceptChild(visitor, partitionBy);
acceptChild(visitor, query);
}
visitor.endVisit(this);
@@ -0,0 +1,75 @@
/*
* Copyright 1999-2017 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.ast.statement;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import java.util.ArrayList;
import java.util.List;
public class SQLDropMaterializedViewStatement extends SQLStatementImpl implements SQLDropStatement {
private SQLExpr name;
private boolean ifExists;
public SQLDropMaterializedViewStatement() {
}
public SQLDropMaterializedViewStatement(String dbType) {
super (dbType);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, name);
}
visitor.endVisit(this);
}
public SQLExpr getName() {
return name;
}
public void setName(SQLExpr x) {
if (x != null) {
x.setParent(this);
}
this.name = x;
}
public boolean isIfExists() {
return ifExists;
}
public void setIfExists(boolean ifExists) {
this.ifExists = ifExists;
}
@Override
public List<SQLObject> getChildren() {
List<SQLObject> children = new ArrayList<SQLObject>();
if (name != null) {
children.add(name);
}
return children;
}
}
@@ -203,7 +203,7 @@ public class OracleCreateTableParser extends SQLCreateTableParser {
stmt.setPartitioning(partitionByHash);
continue;
} else if (lexer.identifierEquals("LIST")) {
SQLPartitionByList partitionByList = partitionByList();
SQLPartitionByList partitionByList = this.getExprParser().partitionByList();
this.getExprParser().partitionClauseRest(partitionByList);
stmt.setPartitioning(partitionByList);
continue;
@@ -329,19 +329,6 @@ public class OracleCreateTableParser extends SQLCreateTableParser {
stmt.setOrganization(organization);
}
protected SQLPartitionByList partitionByList() {
acceptIdentifier("LIST");
SQLPartitionByList partitionByList = new SQLPartitionByList();
accept(Token.LPAREN);
partitionByList.addColumn(this.exprParser.expr());
accept(Token.RPAREN);
this.getExprParser().parsePartitionByRest(partitionByList);
return partitionByList;
}
protected void parseCreateTableSupplementalLogingProps(SQLCreateTableStatement stmt) {
acceptIdentifier("SUPPLEMENTAL");
acceptIdentifier("LOG");
@@ -1632,6 +1632,57 @@ public class OracleExprParser extends SQLExprParser {
}
}
protected SQLPartitionBy parsePartitionBy() {
lexer.nextToken();
accept(Token.BY);
SQLPartitionBy partitionBy;
if (lexer.identifierEquals("RANGE")) {
return this.partitionByRange();
} else if (lexer.identifierEquals("HASH")) {
SQLPartitionByHash partitionByHash = this.partitionByHash();
this.partitionClauseRest(partitionByHash);
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
for (;;) {
SQLPartition partition = this.parsePartition();
partitionByHash.addPartition(partition);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
} else if (lexer.token() == Token.RPAREN) {
lexer.nextToken();
break;
}
throw new ParserException("TODO : " + lexer.info());
}
}
return partitionByHash;
} else if (lexer.identifierEquals("LIST")) {
SQLPartitionByList partitionByList = partitionByList();
this.partitionClauseRest(partitionByList);
return partitionByList;
} else {
throw new ParserException("TODO : " + lexer.info());
}
}
protected SQLPartitionByList partitionByList() {
acceptIdentifier("LIST");
SQLPartitionByList partitionByList = new SQLPartitionByList();
accept(Token.LPAREN);
partitionByList.addColumn(this.expr());
accept(Token.RPAREN);
this.parsePartitionByRest(partitionByList);
return partitionByList;
}
protected SQLPartitionByRange partitionByRange() {
acceptIdentifier("RANGE");
accept(Token.LPAREN);
@@ -606,6 +606,15 @@ public class OracleStatementParser extends SQLStatementParser {
continue;
}
if (lexer.identifierEquals(FnvHash.Constants.MATERIALIZED)) {
lexer.reset(savePoint);
SQLStatement stmt = parseDropMaterializedView();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
throw new ParserException("TODO : " + lexer.info());
}
@@ -711,6 +720,21 @@ public class OracleStatementParser extends SQLStatementParser {
return stmt;
}
public SQLStatement parseDropMaterializedView() {
if (lexer.token() == Token.DROP) {
lexer.nextToken();
}
SQLDropMaterializedViewStatement stmt = new SQLDropMaterializedViewStatement();
stmt.setDbType(dbType);
acceptIdentifier("MATERIALIZED");
accept(Token.VIEW);
stmt.setName(this.exprParser.name());
return stmt;
}
public SQLStatement parseDropSynonym() {
if (lexer.token() == Token.DROP) {
lexer.nextToken();
@@ -3085,6 +3085,14 @@ public class SQLExprParser extends SQLParser {
return expr;
}
protected SQLPartition parsePartition() {
throw new ParserException("TODO");
}
protected SQLPartitionBy parsePartitionBy() {
throw new ParserException("TODO");
}
public SQLPartitionValue parsePartitionValues() {
if (lexer.token != Token.VALUES) {
@@ -2141,6 +2141,11 @@ public class SQLStatementParser extends SQLParser {
SQLCreateMaterializedViewStatement stmt = new SQLCreateMaterializedViewStatement();
stmt.setName(this.exprParser.name());
if (lexer.token == Token.PARTITION) {
SQLPartitionBy partitionBy = this.exprParser.parsePartitionBy();
stmt.setPartitionBy(partitionBy);
}
for (;;) {
if (exprParser instanceof OracleExprParser) {
((OracleExprParser) exprParser).parseSegmentAttributes(stmt);
@@ -2172,23 +2177,33 @@ public class SQLStatementParser extends SQLParser {
break;
}
}
} else if (lexer.identifierEquals("BUILD")) {
} else if (lexer.identifierEquals(FnvHash.Constants.BUILD)) {
lexer.nextToken();
if (lexer.identifierEquals("IMMEDIATE") || lexer.token == Token.IMMEDIATE) {
lexer.nextToken();
stmt.setBuildImmediate(true);
} else {
acceptIdentifier("DEFERRED");
accept(Token.DEFERRED);
stmt.setBuildDeferred(true);
}
} else if (lexer.identifierEquals("PARALLEL")) {
} else if (lexer.identifierEquals(FnvHash.Constants.PARALLEL)) {
lexer.nextToken();
stmt.setParallel(true);
if (lexer.token == Token.LITERAL_INT) {
stmt.setParallelValue(lexer.integerValue().intValue());
lexer.nextToken();
}
} else if (lexer.identifierEquals(FnvHash.Constants.NOCACHE) || lexer.token == Token.NOCACHE) {
lexer.nextToken();
stmt.setCache(false);
} else if (lexer.identifierEquals(FnvHash.Constants.NOPARALLEL)) {
lexer.nextToken();
stmt.setParallel(false);
} else if (lexer.token == Token.WITH) {
lexer.nextToken();
acceptIdentifier("ROWID");
stmt.setWithRowId(true);
} else {
break;
}
@@ -2208,6 +2223,7 @@ public class SQLStatementParser extends SQLParser {
return stmt;
}
public SQLStatement parseCreateDbLink() {
throw new ParserException("TODO " + lexer.token);
}
@@ -2300,6 +2300,18 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
return false;
}
public boolean visit(SQLDropMaterializedViewStatement x) {
print0(ucase ? "DROP VIEW " : "drop view ");
if (x.isIfExists()) {
print0(ucase ? "IF EXISTS " : "if exists ");
}
x.getName().accept(this);
return false;
}
public boolean visit(SQLDropEventStatement x) {
print0(ucase ? "DROP EVENT " : "drop event ");
@@ -5684,9 +5696,22 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
public boolean visit(SQLCreateMaterializedViewStatement x) {
print0(ucase ? "CREATE MATERIALIZED VIEW " : "create materialized view ");
x.getName().accept(this);
SQLPartitionBy partitionBy = x.getPartitionBy();
if (partitionBy != null) {
println();
partitionBy.accept(this);
}
this.printOracleSegmentAttributes(x);
println();
Boolean cache = x.getCache();
if (cache != null) {
print(cache ? "CACHE" : "NOCACHE");
println();
}
Boolean parallel = x.getParallel();
if (parallel != null) {
if (parallel) {
@@ -811,6 +811,10 @@ public interface SQLASTVisitor {
boolean visit(SQLStructDataType x);
void endVisit(SQLStructDataType x);
boolean visit(SQLStructDataType.Field x);
void endVisit(SQLStructDataType.Field x);
boolean visit(SQLDropMaterializedViewStatement x);
void endVisit(SQLDropMaterializedViewStatement x);
}
@@ -1914,6 +1914,16 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor {
}
@Override
public boolean visit(SQLDropMaterializedViewStatement x) {
return true;
}
@Override
public void endVisit(SQLDropMaterializedViewStatement x) {
}
public final boolean isEnabled(VisitorFeature feature) {
return VisitorFeature.isEnabled(this.features, feature);
}
@@ -0,0 +1,27 @@
/*
* Copyright 1999-2017 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.support.metrics;
import com.alibaba.druid.stat.DruidDataSourceStatManager;
import java.util.concurrent.Callable;
public class MetricCollector {
public void collect() throws Exception {
}
}
@@ -625,5 +625,9 @@ public final class FnvHash {
long INHERITS = fnv1a_64_lower("INHERITS");
long DELIMITED = fnv1a_64_lower("DELIMITED");
long TABLES = fnv1a_64_lower("TABLES");
long PARALLEL = fnv1a_64_lower("PARALLEL");
long BUILD = fnv1a_64_lower("BUILD");
long NOCACHE = fnv1a_64_lower("NOCACHE");
long NOPARALLEL = fnv1a_64_lower("NOPARALLEL");
}
}