/* * 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.dialect.postgresql.visitor; import java.util.Map; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGBoxExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCidrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCircleExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGExtractExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGInetExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGIntervalExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGLineSegmentsExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGMacAddrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPointExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPolygonExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGTypeCastExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGFunctionTableSource; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGInsertStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.FetchClause; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.ForClause; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.WindowClause; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGShowStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGUpdateStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGValuesQuery; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.stat.TableStat.Mode; import com.alibaba.druid.util.JdbcUtils; public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisitor { @Override public String getDbType() { return JdbcUtils.POSTGRESQL; } @Override public void endVisit(WindowClause x) { } @Override public boolean visit(WindowClause x) { return true; } @Override public void endVisit(FetchClause x) { } @Override public boolean visit(FetchClause x) { return true; } @Override public void endVisit(ForClause x) { } @Override public boolean visit(ForClause x) { return true; } @Override public void endVisit(PGWithQuery x) { } @Override public boolean visit(PGWithQuery x) { x.getQuery().accept(this); Map<String, String> aliasMap = getAliasMap(); if (aliasMap != null) { String alias = null; if (x.getName() != null) { alias = x.getName().toString(); } if (alias != null) { aliasMap.put(alias, null); addSubQuery(alias, x.getQuery()); } } return false; } @Override public void endVisit(PGWithClause x) { } @Override public boolean visit(PGWithClause x) { return true; } @Override public void endVisit(PGDeleteStatement x) { } @Override public boolean visit(PGDeleteStatement x) { if (x.getWith() != null) { x.getWith().accept(this); } setAliasMap(); for (SQLName name : x.getUsing()) { String ident = name.toString(); TableStat stat = getTableStat(ident); stat.incrementSelectCount(); Map<String, String> aliasMap = getAliasMap(); if (aliasMap != null) { aliasMap.put(ident, ident); } } x.putAttribute("_original_use_mode", getMode()); setMode(x, Mode.Delete); String ident = ((SQLIdentifierExpr) x.getTableName()).getName(); setCurrentTable(ident); TableStat stat = getTableStat(ident, x.getAlias()); stat.incrementDeleteCount(); accept(x.getWhere()); return false; } @Override public void endVisit(PGInsertStatement x) { } @Override public boolean visit(PGInsertStatement x) { setAliasMap(); if (x.getWith() != null) { x.getWith().accept(this); } x.putAttribute("_original_use_mode", getMode()); setMode(x, Mode.Insert); String originalTable = getCurrentTable(); if (x.getTableName() instanceof SQLName) { String ident = ((SQLName) x.getTableName()).toString(); setCurrentTable(ident); x.putAttribute("_old_local_", originalTable); TableStat stat = getTableStat(ident); stat.incrementInsertCount(); Map<String, String> aliasMap = getAliasMap(); if (aliasMap != null) { if (x.getAlias() != null) { aliasMap.put(x.getAlias(), ident); } aliasMap.put(ident, ident); } } accept(x.getColumns()); accept(x.getQuery()); return false; } @Override public void endVisit(PGSelectStatement x) { } @Override public boolean visit(PGSelectStatement x) { if (x.getWith() != null) { x.getWith().accept(this); } return visit((SQLSelectStatement) x); } @Override public void endVisit(PGUpdateStatement x) { } @Override public boolean visit(PGUpdateStatement x) { Map<String, String> oldAliasMap = getAliasMap(); setAliasMap(); if (x.getWith() != null) { x.getWith().accept(this); } String ident = x.getTableName().toString(); setCurrentTable(ident); TableStat stat = getTableStat(ident); stat.incrementUpdateCount(); accept(x.getFrom()); Map<String, String> aliasMap = getAliasMap(); aliasMap.put(ident, ident); accept(x.getItems()); accept(x.getWhere()); setAliasMap(oldAliasMap); return false; } @Override public void endVisit(PGSelectQueryBlock x) { } @Override public boolean visit(PGSelectQueryBlock x) { return this.visit((SQLSelectQueryBlock) x); } @Override public void endVisit(PGFunctionTableSource x) { } @Override public boolean visit(PGFunctionTableSource x) { return true; } @Override public boolean visit(PGTypeCastExpr x) { x.getExpr().accept(this); return false; } @Override public void endVisit(PGTypeCastExpr x) { } @Override public void endVisit(PGValuesQuery x) { } @Override public boolean visit(PGValuesQuery x) { return true; } @Override public void endVisit(PGExtractExpr x) { } @Override public boolean visit(PGExtractExpr x) { return true; } @Override public void endVisit(PGBoxExpr x) { } @Override public boolean visit(PGBoxExpr x) { return true; } @Override public void endVisit(PGPointExpr x) { } @Override public boolean visit(PGMacAddrExpr x) { return true; } @Override public void endVisit(PGMacAddrExpr x) { } @Override public boolean visit(PGInetExpr x) { return true; } @Override public void endVisit(PGInetExpr x) { } @Override public boolean visit(PGCidrExpr x) { return true; } @Override public void endVisit(PGCidrExpr x) { } @Override public boolean visit(PGPolygonExpr x) { return true; } @Override public void endVisit(PGPolygonExpr x) { } @Override public boolean visit(PGCircleExpr x) { return true; } @Override public void endVisit(PGCircleExpr x) { } @Override public boolean visit(PGLineSegmentsExpr x) { return true; } @Override public void endVisit(PGIntervalExpr x) { } @Override public boolean visit(PGIntervalExpr x) { return true; } @Override public void endVisit(PGLineSegmentsExpr x) { } @Override public boolean visit(PGPointExpr x) { return true; } @Override public void endVisit(PGShowStatement x) { } @Override public boolean visit(PGShowStatement x) { return false; } }