/** * 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.metastore; import java.sql.SQLException; import java.sql.SQLTransactionRollbackException; /** Database product infered via JDBC. */ public enum DatabaseProduct { DERBY, MYSQL, POSTGRES, ORACLE, SQLSERVER, OTHER; /** * Determine the database product type * @param conn database connection * @return database product type */ public static DatabaseProduct determineDatabaseProduct(String productName) throws SQLException { if (productName == null) { return OTHER; } productName = productName.toLowerCase(); if (productName.contains("derby")) { return DERBY; } else if (productName.contains("microsoft sql server")) { return SQLSERVER; } else if (productName.contains("mysql")) { return MYSQL; } else if (productName.contains("oracle")) { return ORACLE; } else if (productName.contains("postgresql")) { return POSTGRES; } else { return OTHER; } } public static boolean isDeadlock(DatabaseProduct dbProduct, SQLException e) { return e instanceof SQLTransactionRollbackException || ((dbProduct == MYSQL || dbProduct == POSTGRES || dbProduct == SQLSERVER) && e.getSQLState().equals("40001")) || (dbProduct == POSTGRES && e.getSQLState().equals("40P01")) || (dbProduct == ORACLE && (e.getMessage().contains("deadlock detected") || e.getMessage().contains("can't serialize access for this transaction"))); } /** * Whether the RDBMS has restrictions on IN list size (explicit, or poor perf-based). */ public static boolean needsInBatching(DatabaseProduct dbType) { return dbType == ORACLE || dbType == SQLSERVER; } /** * Whether the RDBMS has a bug in join and filter operation order described in DERBY-6358. */ public static boolean hasJoinOperationOrderBug(DatabaseProduct dbType) { return dbType == DERBY || dbType == ORACLE; } };