blob: cc731bf3f10259ebc0a906a66d0f7ec8b67041fe [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.hadoop.hive.ql.parse;
import org.antlr.runtime.tree.Tree;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.ql.QueryState;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.plan.HiveOperation;
import org.apache.hadoop.hive.ql.session.SessionState;
import java.util.HashMap;
/**
* SemanticAnalyzerFactory.
*
*/
public final class SemanticAnalyzerFactory {
static HashMap<Integer, HiveOperation> commandType = new HashMap<Integer, HiveOperation>();
static HashMap<Integer, HiveOperation[]> tablePartitionCommandType = new HashMap<Integer, HiveOperation[]>();
static {
commandType.put(HiveParser.TOK_EXPLAIN, HiveOperation.EXPLAIN);
commandType.put(HiveParser.TOK_LOAD, HiveOperation.LOAD);
commandType.put(HiveParser.TOK_EXPORT, HiveOperation.EXPORT);
commandType.put(HiveParser.TOK_IMPORT, HiveOperation.IMPORT);
commandType.put(HiveParser.TOK_CREATEDATABASE, HiveOperation.CREATEDATABASE);
commandType.put(HiveParser.TOK_DROPDATABASE, HiveOperation.DROPDATABASE);
commandType.put(HiveParser.TOK_SWITCHDATABASE, HiveOperation.SWITCHDATABASE);
commandType.put(HiveParser.TOK_CREATETABLE, HiveOperation.CREATETABLE);
commandType.put(HiveParser.TOK_TRUNCATETABLE, HiveOperation.TRUNCATETABLE);
commandType.put(HiveParser.TOK_DROPTABLE, HiveOperation.DROPTABLE);
commandType.put(HiveParser.TOK_DESCTABLE, HiveOperation.DESCTABLE);
commandType.put(HiveParser.TOK_DESCFUNCTION, HiveOperation.DESCFUNCTION);
commandType.put(HiveParser.TOK_MSCK, HiveOperation.MSCK);
commandType.put(HiveParser.TOK_ALTERTABLE_ADDCOLS, HiveOperation.ALTERTABLE_ADDCOLS);
commandType.put(HiveParser.TOK_ALTERTABLE_REPLACECOLS, HiveOperation.ALTERTABLE_REPLACECOLS);
commandType.put(HiveParser.TOK_ALTERTABLE_RENAMECOL, HiveOperation.ALTERTABLE_RENAMECOL);
commandType.put(HiveParser.TOK_ALTERTABLE_RENAME, HiveOperation.ALTERTABLE_RENAME);
commandType.put(HiveParser.TOK_ALTERTABLE_DROPPARTS, HiveOperation.ALTERTABLE_DROPPARTS);
commandType.put(HiveParser.TOK_ALTERTABLE_ADDPARTS, HiveOperation.ALTERTABLE_ADDPARTS);
commandType.put(HiveParser.TOK_ALTERTABLE_TOUCH, HiveOperation.ALTERTABLE_TOUCH);
commandType.put(HiveParser.TOK_ALTERTABLE_ARCHIVE, HiveOperation.ALTERTABLE_ARCHIVE);
commandType.put(HiveParser.TOK_ALTERTABLE_UNARCHIVE, HiveOperation.ALTERTABLE_UNARCHIVE);
commandType.put(HiveParser.TOK_ALTERTABLE_PROPERTIES, HiveOperation.ALTERTABLE_PROPERTIES);
commandType.put(HiveParser.TOK_ALTERTABLE_DROPPROPERTIES, HiveOperation.ALTERTABLE_PROPERTIES);
commandType.put(HiveParser.TOK_ALTERTABLE_EXCHANGEPARTITION,
HiveOperation.ALTERTABLE_EXCHANGEPARTITION);
commandType.put(HiveParser.TOK_ALTERTABLE_DROPCONSTRAINT, HiveOperation.ALTERTABLE_DROPCONSTRAINT);
commandType.put(HiveParser.TOK_ALTERTABLE_ADDCONSTRAINT, HiveOperation.ALTERTABLE_ADDCONSTRAINT);
commandType.put(HiveParser.TOK_SHOWDATABASES, HiveOperation.SHOWDATABASES);
commandType.put(HiveParser.TOK_SHOWTABLES, HiveOperation.SHOWTABLES);
commandType.put(HiveParser.TOK_SHOWCOLUMNS, HiveOperation.SHOWCOLUMNS);
commandType.put(HiveParser.TOK_SHOW_TABLESTATUS, HiveOperation.SHOW_TABLESTATUS);
commandType.put(HiveParser.TOK_SHOW_TBLPROPERTIES, HiveOperation.SHOW_TBLPROPERTIES);
commandType.put(HiveParser.TOK_SHOW_CREATEDATABASE, HiveOperation.SHOW_CREATEDATABASE);
commandType.put(HiveParser.TOK_SHOW_CREATETABLE, HiveOperation.SHOW_CREATETABLE);
commandType.put(HiveParser.TOK_SHOWFUNCTIONS, HiveOperation.SHOWFUNCTIONS);
commandType.put(HiveParser.TOK_SHOWINDEXES, HiveOperation.SHOWINDEXES);
commandType.put(HiveParser.TOK_SHOWPARTITIONS, HiveOperation.SHOWPARTITIONS);
commandType.put(HiveParser.TOK_SHOWLOCKS, HiveOperation.SHOWLOCKS);
commandType.put(HiveParser.TOK_SHOWDBLOCKS, HiveOperation.SHOWLOCKS);
commandType.put(HiveParser.TOK_SHOWCONF, HiveOperation.SHOWCONF);
commandType.put(HiveParser.TOK_CREATEFUNCTION, HiveOperation.CREATEFUNCTION);
commandType.put(HiveParser.TOK_DROPFUNCTION, HiveOperation.DROPFUNCTION);
commandType.put(HiveParser.TOK_RELOADFUNCTION, HiveOperation.RELOADFUNCTION);
commandType.put(HiveParser.TOK_CREATEMACRO, HiveOperation.CREATEMACRO);
commandType.put(HiveParser.TOK_DROPMACRO, HiveOperation.DROPMACRO);
commandType.put(HiveParser.TOK_CREATEVIEW, HiveOperation.CREATEVIEW);
commandType.put(HiveParser.TOK_DROPVIEW, HiveOperation.DROPVIEW);
commandType.put(HiveParser.TOK_CREATEINDEX, HiveOperation.CREATEINDEX);
commandType.put(HiveParser.TOK_DROPINDEX, HiveOperation.DROPINDEX);
commandType.put(HiveParser.TOK_ALTERINDEX_REBUILD, HiveOperation.ALTERINDEX_REBUILD);
commandType.put(HiveParser.TOK_ALTERINDEX_PROPERTIES, HiveOperation.ALTERINDEX_PROPS);
commandType.put(HiveParser.TOK_ALTERVIEW_PROPERTIES, HiveOperation.ALTERVIEW_PROPERTIES);
commandType.put(HiveParser.TOK_ALTERVIEW_DROPPROPERTIES, HiveOperation.ALTERVIEW_PROPERTIES);
commandType.put(HiveParser.TOK_ALTERVIEW_ADDPARTS, HiveOperation.ALTERTABLE_ADDPARTS);
commandType.put(HiveParser.TOK_ALTERVIEW_DROPPARTS, HiveOperation.ALTERTABLE_DROPPARTS);
commandType.put(HiveParser.TOK_ALTERVIEW_RENAME, HiveOperation.ALTERVIEW_RENAME);
commandType.put(HiveParser.TOK_ALTERVIEW, HiveOperation.ALTERVIEW_AS);
commandType.put(HiveParser.TOK_QUERY, HiveOperation.QUERY);
commandType.put(HiveParser.TOK_LOCKTABLE, HiveOperation.LOCKTABLE);
commandType.put(HiveParser.TOK_UNLOCKTABLE, HiveOperation.UNLOCKTABLE);
commandType.put(HiveParser.TOK_LOCKDB, HiveOperation.LOCKDB);
commandType.put(HiveParser.TOK_UNLOCKDB, HiveOperation.UNLOCKDB);
commandType.put(HiveParser.TOK_CREATEROLE, HiveOperation.CREATEROLE);
commandType.put(HiveParser.TOK_DROPROLE, HiveOperation.DROPROLE);
commandType.put(HiveParser.TOK_GRANT, HiveOperation.GRANT_PRIVILEGE);
commandType.put(HiveParser.TOK_REVOKE, HiveOperation.REVOKE_PRIVILEGE);
commandType.put(HiveParser.TOK_SHOW_GRANT, HiveOperation.SHOW_GRANT);
commandType.put(HiveParser.TOK_GRANT_ROLE, HiveOperation.GRANT_ROLE);
commandType.put(HiveParser.TOK_REVOKE_ROLE, HiveOperation.REVOKE_ROLE);
commandType.put(HiveParser.TOK_SHOW_ROLES, HiveOperation.SHOW_ROLES);
commandType.put(HiveParser.TOK_SHOW_SET_ROLE, HiveOperation.SHOW_ROLES);
commandType.put(HiveParser.TOK_SHOW_ROLE_PRINCIPALS, HiveOperation.SHOW_ROLE_PRINCIPALS);
commandType.put(HiveParser.TOK_SHOW_ROLE_GRANT, HiveOperation.SHOW_ROLE_GRANT);
commandType.put(HiveParser.TOK_ALTERDATABASE_PROPERTIES, HiveOperation.ALTERDATABASE);
commandType.put(HiveParser.TOK_ALTERDATABASE_OWNER, HiveOperation.ALTERDATABASE_OWNER);
commandType.put(HiveParser.TOK_DESCDATABASE, HiveOperation.DESCDATABASE);
commandType.put(HiveParser.TOK_ALTERTABLE_SKEWED, HiveOperation.ALTERTABLE_SKEWED);
commandType.put(HiveParser.TOK_ANALYZE, HiveOperation.ANALYZE_TABLE);
commandType.put(HiveParser.TOK_CACHE_METADATA, HiveOperation.CACHE_METADATA);
commandType.put(HiveParser.TOK_ALTERTABLE_PARTCOLTYPE, HiveOperation.ALTERTABLE_PARTCOLTYPE);
commandType.put(HiveParser.TOK_SHOW_COMPACTIONS, HiveOperation.SHOW_COMPACTIONS);
commandType.put(HiveParser.TOK_SHOW_TRANSACTIONS, HiveOperation.SHOW_TRANSACTIONS);
commandType.put(HiveParser.TOK_ABORT_TRANSACTIONS, HiveOperation.ABORT_TRANSACTIONS);
commandType.put(HiveParser.TOK_START_TRANSACTION, HiveOperation.START_TRANSACTION);
commandType.put(HiveParser.TOK_COMMIT, HiveOperation.COMMIT);
commandType.put(HiveParser.TOK_ROLLBACK, HiveOperation.ROLLBACK);
commandType.put(HiveParser.TOK_SET_AUTOCOMMIT, HiveOperation.SET_AUTOCOMMIT);
}
static {
tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_FILEFORMAT,
new HiveOperation[] { HiveOperation.ALTERTABLE_FILEFORMAT,
HiveOperation.ALTERPARTITION_FILEFORMAT });
tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_LOCATION,
new HiveOperation[] { HiveOperation.ALTERTABLE_LOCATION,
HiveOperation.ALTERPARTITION_LOCATION });
tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_MERGEFILES,
new HiveOperation[] {HiveOperation.ALTERTABLE_MERGEFILES,
HiveOperation.ALTERPARTITION_MERGEFILES });
tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_SERIALIZER,
new HiveOperation[] {HiveOperation.ALTERTABLE_SERIALIZER,
HiveOperation.ALTERPARTITION_SERIALIZER });
tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_SERDEPROPERTIES,
new HiveOperation[] {HiveOperation.ALTERTABLE_SERDEPROPERTIES,
HiveOperation.ALTERPARTITION_SERDEPROPERTIES });
tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_RENAMEPART,
new HiveOperation[] {null, HiveOperation.ALTERTABLE_RENAMEPART});
tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_COMPACT,
new HiveOperation[] {HiveOperation.ALTERTABLE_COMPACT, HiveOperation.ALTERTABLE_COMPACT});
tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_SKEWED_LOCATION,
new HiveOperation[] {HiveOperation.ALTERTBLPART_SKEWED_LOCATION,
HiveOperation.ALTERTBLPART_SKEWED_LOCATION });
tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_BUCKETS,
new HiveOperation[] {HiveOperation.ALTERTABLE_BUCKETNUM,
HiveOperation.ALTERPARTITION_BUCKETNUM});
tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_CLUSTER_SORT,
new HiveOperation[] {HiveOperation.ALTERTABLE_CLUSTER_SORT,
HiveOperation.ALTERTABLE_CLUSTER_SORT});
tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_UPDATECOLSTATS,
new HiveOperation[] {HiveOperation.ALTERTABLE_UPDATETABLESTATS,
HiveOperation.ALTERTABLE_UPDATEPARTSTATS});
tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_UPDATESTATS,
new HiveOperation[] {HiveOperation.ALTERTABLE_UPDATETABLESTATS,
HiveOperation.ALTERTABLE_UPDATEPARTSTATS});
}
public static BaseSemanticAnalyzer get(QueryState queryState, ASTNode tree)
throws SemanticException {
if (tree.getToken() == null) {
throw new RuntimeException("Empty Syntax Tree");
} else {
HiveOperation opType = commandType.get(tree.getType());
queryState.setCommandType(opType);
switch (tree.getType()) {
case HiveParser.TOK_EXPLAIN:
return new ExplainSemanticAnalyzer(queryState);
case HiveParser.TOK_EXPLAIN_SQ_REWRITE:
return new ExplainSQRewriteSemanticAnalyzer(queryState);
case HiveParser.TOK_LOAD:
return new LoadSemanticAnalyzer(queryState);
case HiveParser.TOK_EXPORT:
return new ExportSemanticAnalyzer(queryState);
case HiveParser.TOK_IMPORT:
return new ImportSemanticAnalyzer(queryState);
case HiveParser.TOK_ALTERTABLE: {
Tree child = tree.getChild(1);
switch (child.getType()) {
case HiveParser.TOK_ALTERTABLE_RENAME:
case HiveParser.TOK_ALTERTABLE_TOUCH:
case HiveParser.TOK_ALTERTABLE_ARCHIVE:
case HiveParser.TOK_ALTERTABLE_UNARCHIVE:
case HiveParser.TOK_ALTERTABLE_ADDCOLS:
case HiveParser.TOK_ALTERTABLE_RENAMECOL:
case HiveParser.TOK_ALTERTABLE_REPLACECOLS:
case HiveParser.TOK_ALTERTABLE_DROPPARTS:
case HiveParser.TOK_ALTERTABLE_ADDPARTS:
case HiveParser.TOK_ALTERTABLE_PARTCOLTYPE:
case HiveParser.TOK_ALTERTABLE_PROPERTIES:
case HiveParser.TOK_ALTERTABLE_DROPPROPERTIES:
case HiveParser.TOK_ALTERTABLE_EXCHANGEPARTITION:
case HiveParser.TOK_ALTERTABLE_SKEWED:
case HiveParser.TOK_ALTERTABLE_DROPCONSTRAINT:
case HiveParser.TOK_ALTERTABLE_ADDCONSTRAINT:
queryState.setCommandType(commandType.get(child.getType()));
return new DDLSemanticAnalyzer(queryState);
}
opType =
tablePartitionCommandType.get(child.getType())[tree.getChildCount() > 2 ? 1 : 0];
queryState.setCommandType(opType);
return new DDLSemanticAnalyzer(queryState);
}
case HiveParser.TOK_ALTERVIEW: {
Tree child = tree.getChild(1);
switch (child.getType()) {
case HiveParser.TOK_ALTERVIEW_PROPERTIES:
case HiveParser.TOK_ALTERVIEW_DROPPROPERTIES:
case HiveParser.TOK_ALTERVIEW_ADDPARTS:
case HiveParser.TOK_ALTERVIEW_DROPPARTS:
case HiveParser.TOK_ALTERVIEW_RENAME:
opType = commandType.get(child.getType());
queryState.setCommandType(opType);
return new DDLSemanticAnalyzer(queryState);
}
// TOK_ALTERVIEW_AS
assert child.getType() == HiveParser.TOK_QUERY;
queryState.setCommandType(HiveOperation.ALTERVIEW_AS);
return new SemanticAnalyzer(queryState);
}
case HiveParser.TOK_CREATEDATABASE:
case HiveParser.TOK_DROPDATABASE:
case HiveParser.TOK_SWITCHDATABASE:
case HiveParser.TOK_DROPTABLE:
case HiveParser.TOK_DROPVIEW:
case HiveParser.TOK_DESCDATABASE:
case HiveParser.TOK_DESCTABLE:
case HiveParser.TOK_DESCFUNCTION:
case HiveParser.TOK_MSCK:
case HiveParser.TOK_ALTERINDEX_REBUILD:
case HiveParser.TOK_ALTERINDEX_PROPERTIES:
case HiveParser.TOK_SHOWDATABASES:
case HiveParser.TOK_SHOWTABLES:
case HiveParser.TOK_SHOWCOLUMNS:
case HiveParser.TOK_SHOW_TABLESTATUS:
case HiveParser.TOK_SHOW_TBLPROPERTIES:
case HiveParser.TOK_SHOW_CREATEDATABASE:
case HiveParser.TOK_SHOW_CREATETABLE:
case HiveParser.TOK_SHOWFUNCTIONS:
case HiveParser.TOK_SHOWPARTITIONS:
case HiveParser.TOK_SHOWINDEXES:
case HiveParser.TOK_SHOWLOCKS:
case HiveParser.TOK_SHOWDBLOCKS:
case HiveParser.TOK_SHOW_COMPACTIONS:
case HiveParser.TOK_SHOW_TRANSACTIONS:
case HiveParser.TOK_ABORT_TRANSACTIONS:
case HiveParser.TOK_SHOWCONF:
case HiveParser.TOK_CREATEINDEX:
case HiveParser.TOK_DROPINDEX:
case HiveParser.TOK_ALTERTABLE_CLUSTER_SORT:
case HiveParser.TOK_LOCKTABLE:
case HiveParser.TOK_UNLOCKTABLE:
case HiveParser.TOK_LOCKDB:
case HiveParser.TOK_UNLOCKDB:
case HiveParser.TOK_CREATEROLE:
case HiveParser.TOK_DROPROLE:
case HiveParser.TOK_GRANT:
case HiveParser.TOK_REVOKE:
case HiveParser.TOK_SHOW_GRANT:
case HiveParser.TOK_GRANT_ROLE:
case HiveParser.TOK_REVOKE_ROLE:
case HiveParser.TOK_SHOW_ROLE_GRANT:
case HiveParser.TOK_SHOW_ROLE_PRINCIPALS:
case HiveParser.TOK_SHOW_ROLES:
case HiveParser.TOK_ALTERDATABASE_PROPERTIES:
case HiveParser.TOK_ALTERDATABASE_OWNER:
case HiveParser.TOK_TRUNCATETABLE:
case HiveParser.TOK_SHOW_SET_ROLE:
case HiveParser.TOK_CACHE_METADATA:
return new DDLSemanticAnalyzer(queryState);
case HiveParser.TOK_CREATEFUNCTION:
case HiveParser.TOK_DROPFUNCTION:
case HiveParser.TOK_RELOADFUNCTION:
return new FunctionSemanticAnalyzer(queryState);
case HiveParser.TOK_ANALYZE:
return new ColumnStatsSemanticAnalyzer(queryState);
case HiveParser.TOK_CREATEMACRO:
case HiveParser.TOK_DROPMACRO:
return new MacroSemanticAnalyzer(queryState);
case HiveParser.TOK_UPDATE_TABLE:
case HiveParser.TOK_DELETE_FROM:
return new UpdateDeleteSemanticAnalyzer(queryState);
case HiveParser.TOK_START_TRANSACTION:
case HiveParser.TOK_COMMIT:
case HiveParser.TOK_ROLLBACK:
case HiveParser.TOK_SET_AUTOCOMMIT:
default: {
SemanticAnalyzer semAnalyzer = HiveConf
.getBoolVar(queryState.getConf(), HiveConf.ConfVars.HIVE_CBO_ENABLED) ?
new CalcitePlanner(queryState) : new SemanticAnalyzer(queryState);
return semAnalyzer;
}
}
}
}
private SemanticAnalyzerFactory() {
// prevent instantiation
}
static HiveOperation getOperation(int hiveParserToken) {
return commandType.get(hiveParserToken);
}
}