Example usage for java.sql Connection TRANSACTION_REPEATABLE_READ

List of usage examples for java.sql Connection TRANSACTION_REPEATABLE_READ

Introduction

In this page you can find the example usage for java.sql Connection TRANSACTION_REPEATABLE_READ.

Prototype

int TRANSACTION_REPEATABLE_READ

To view the source code for java.sql Connection TRANSACTION_REPEATABLE_READ.

Click Source Link

Document

A constant indicating that dirty reads and non-repeatable reads are prevented; phantom reads can occur.

Usage

From source file:org.apache.hadoop.hive.metastore.MyXid.java

public void jdbcCreateView(Table tbl) throws AlreadyExistsException, InvalidObjectException, MetaException {
    LOG.debug("first, check the name is valid or not");
    if (!MetaStoreUtils.validateName(tbl.getTableName())
            || !MetaStoreUtils.validateColNames(tbl.getSd().getCols())
            || (tbl.getPriPartition() != null
                    && !MetaStoreUtils.validateName(tbl.getPriPartition().getParKey().getName()))
            || (tbl.getSubPartition() != null
                    && !MetaStoreUtils.validateName(tbl.getSubPartition().getParKey().getName()))) {
        LOG.error("create view error db=" + tbl.getDbName() + ", view=" + tbl.getTableName());
        throw new InvalidObjectException(tbl.getTableName() + " is not a valid object name");
    }//  w  w  w  .  j  av a 2  s .co m

    boolean success = false;

    Connection con;
    PreparedStatement ps = null;
    tbl.setDbName(tbl.getDbName().toLowerCase());
    tbl.setTableName(tbl.getTableName().toLowerCase());

    long tblID = genTblID(tbl.getDbName(), tbl.getTableName());

    try {
        con = getSegmentConnection(tbl.getDbName());
    } catch (MetaStoreConnectException e1) {
        LOG.error("create view error db=" + tbl.getDbName() + ", view=" + tbl.getTableName() + ",msg="
                + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("create view error db=" + tbl.getDbName() + ", view=" + tbl.getTableName() + ",msg="
                + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

        ps = con.prepareStatement("select tbl_id, tbl_type from TBLS where db_name=? and tbl_name=?");
        ps.setString(1, tbl.getDbName());
        ps.setString(2, tbl.getTableName());

        boolean isViewFind = false;
        String tblType = null;

        ResultSet tblSet = ps.executeQuery();

        while (tblSet.next()) {
            isViewFind = true;
            tblID = tblSet.getLong(1);
            tblType = tblSet.getString(2);
            break;
        }

        tblSet.close();
        ps.close();

        if (isViewFind && !tbl.isIsReplaceOnExit()) {
            LOG.error("view " + tbl.getDbName() + ":" + tbl.getTableName() + " has exist");
            throw new AlreadyExistsException(
                    "view " + tbl.getDbName() + ":" + tbl.getTableName() + " has exist");
        }

        if (isViewFind && tbl.isIsReplaceOnExit()) {
            if (tblType != null && !tblType.equalsIgnoreCase("VIRTUAL_VIEW")) {
                LOG.error("name conflict " + tbl.getDbName() + ":" + tbl.getTableName()
                        + " already exist, and it is not a view");
                throw new MetaException("name conflict " + tbl.getDbName() + ":" + tbl.getTableName()
                        + " already exist, and it is not a view");
            }

            ps = con.prepareStatement("update TBLS  set tbl_comment=? where tbl_id=? ");
            ps.setString(1, tbl.getParameters().get("comment"));
            ps.setLong(2, tblID);

            ps.executeUpdate();
            ps.close();

            ps = con.prepareStatement("update tdwview  set view_original_text=?, view_expanded_text=?, "
                    + "vtables=? where tbl_id=? ");

            ps.setString(1, tbl.getViewOriginalText());
            ps.setString(2, tbl.getViewExpandedText());
            ps.setString(3, tbl.getVtables().toLowerCase());
            ps.setLong(4, tblID);
            ps.executeUpdate();
            ps.close();

            ps = con.prepareStatement("delete from COLUMNS where tbl_id=?");
            ps.setLong(1, tblID);
            ps.executeUpdate();
            ps.close();

            ps = con.prepareStatement("insert into COLUMNS(column_index, tbl_id, column_name, "
                    + "type_name, comment) values(?,?,?,?,?)");

            List<FieldSchema> fieldSchemas = tbl.getSd().getCols();
            int size = fieldSchemas.size();

            for (int i = 0; i < size; i++) {
                ps.setLong(1, i);
                ps.setLong(2, tblID);
                ps.setString(3, fieldSchemas.get(i).getName().toLowerCase());
                ps.setString(4, fieldSchemas.get(i).getType());
                ps.setString(5, fieldSchemas.get(i).getComment());
                ps.addBatch();
            }
            ps.executeBatch();
            ps.close();

            Map<String, String> tblPram = new HashMap<String, String>();
            ps = con.prepareStatement(
                    "select param_key, param_value from TABLE_PARAMS where tbl_id=? and param_type='TBL'");
            ps.setLong(1, tblID);

            ResultSet paramSet = ps.executeQuery();
            while (paramSet.next()) {
                tblPram.put(paramSet.getString(1), paramSet.getString(2));
            }
            paramSet.close();
            ps.close();

            ps = con.prepareStatement("delete from TABLE_PARAMS where tbl_id=? and param_type='TBL'");
            ps.setLong(1, tblID);
            ps.executeUpdate();
            ps.close();

            tblPram.putAll(tbl.getParameters());

            ps = con.prepareStatement(
                    "insert into TABLE_PARAMS(tbl_id, param_type, param_key, param_value) values(?,?,?,?)");

            for (Entry<String, String> entry : tblPram.entrySet()) {
                ps.setLong(1, tblID);
                ps.setString(2, "TBL");
                ps.setString(3, entry.getKey());
                ps.setString(4, entry.getValue());
                ps.addBatch();
            }
            ps.executeBatch();
            ps.close();

            con.commit();
            success = true;
        } else {
            ps = con.prepareStatement("INSERT INTO TBLS(tbl_id, retention, tbl_type, db_name, "
                    + "tbl_name, tbl_owner, tbl_comment)" + " values(?,?,?,?,?,?,?)");

            StorageDescriptor sd = tbl.getSd();
            if (sd == null || sd.getSerdeInfo() == null) {
                throw new MetaException("storage descriptor of table " + tbl.getTableName() + " is null");
            }
            ps.setLong(1, tblID);
            ps.setLong(2, tbl.getRetention());
            ps.setString(3, tbl.getTableType());
            ps.setString(4, tbl.getDbName());
            ps.setString(5, tbl.getTableName());
            ps.setString(6, tbl.getOwner().toLowerCase());
            ps.setString(7, tbl.getParameters().get("comment"));

            ps.executeUpdate();
            ps.close();

            ps = con.prepareStatement(
                    "INSERT INTO COLUMNS(column_index, tbl_id, column_name, type_name, comment) "
                            + " values(?,?,?,?,?)");

            List<FieldSchema> fieldList = sd.getCols();
            int fieldSize = fieldList.size();

            for (int i = 0; i < fieldSize; i++) {
                FieldSchema field = fieldList.get(i);
                ps.setInt(1, i);
                ps.setLong(2, tblID);
                ps.setString(3, field.getName());
                ps.setString(4, field.getType());
                ps.setString(5, field.getComment());

                ps.addBatch();
            }

            ps.executeBatch();
            ps.close();

            if (tbl.getParametersSize() > 0 || sd.getParametersSize() > 0
                    || sd.getSerdeInfo().getParametersSize() > 0) {
                ps = con.prepareStatement(
                        "insert into table_params(tbl_id, param_type, param_key, param_value) "
                                + " values(?,?,?,?)");
                if (tbl.getParametersSize() > 0) {
                    for (Map.Entry<String, String> entry : tbl.getParameters().entrySet()) {
                        if (entry.getKey().equalsIgnoreCase("type")
                                || entry.getKey().equalsIgnoreCase("comment"))
                            break;
                        ps.setLong(1, tblID);
                        ps.setString(2, "TBL");
                        ps.setString(3, entry.getKey());
                        ps.setString(4, entry.getValue());

                        ps.addBatch();
                    }
                }

                if (sd.getParametersSize() > 0) {
                    for (Map.Entry<String, String> entry : sd.getParameters().entrySet()) {
                        ps.setLong(1, tblID);
                        ps.setString(2, "SD");
                        ps.setString(3, entry.getKey());
                        ps.setString(4, entry.getValue());

                        ps.addBatch();
                    }
                }

                if (sd.getSerdeInfo().getParametersSize() > 0) {
                    for (Map.Entry<String, String> entry : sd.getSerdeInfo().getParameters().entrySet()) {
                        ps.setLong(1, tblID);
                        ps.setString(2, "SERDE");
                        ps.setString(3, entry.getKey());
                        ps.setString(4, entry.getValue());

                        ps.addBatch();
                    }
                }

                ps.executeBatch();
                ps.close();
            }

            ps = con.prepareStatement(
                    "insert into tdwview(tbl_id, view_original_text, view_expanded_text, vtables) values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, tbl.getViewOriginalText());
            ps.setString(3, tbl.getViewExpandedText());
            ps.setString(4, tbl.getVtables().toLowerCase());
            ps.executeUpdate();
            ps.close();

            con.commit();
            success = true;
        }
    } catch (SQLException sqlex) {
        sqlex.printStackTrace();
        LOG.error("create view error db=" + tbl.getDbName() + ", view=" + tbl.getTableName() + ", msg="
                + sqlex.getMessage());
        throw new MetaException(sqlex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeConnection(con);
    }

    return;
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

@Override
public boolean dropTable(String dbName, String tableName, boolean deleteData)
        throws MetaException, NoSuchObjectException {
    Connection con = null;/*from   ww  w .ja  v  a 2  s.c o m*/
    Statement ps = null;

    Warehouse wh = new Warehouse(hiveConf);
    boolean success = false;
    String tblLocation = null;
    String tblType = null;
    String tblFormat = null;

    String host = null;
    String port = null;
    String db = null;
    String user = null;
    String pass = null;

    dbName = dbName.toLowerCase();
    tableName = tableName.toLowerCase();

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("drop table error, db=" + dbName + ", tbl=" + tableName + ", msg=" + e1.getMessage());
        return true;
    } catch (SQLException e1) {
        LOG.error("drop table error, db=" + dbName + ", tbl=" + tableName + ", msg=" + e1.getMessage());
        return true;
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
        ps = con.createStatement();

        String sql = "select tbl_id, tbl_type, tbl_format, tbl_location from tbls where db_name='" + dbName
                + "' and tbl_name='" + tableName + "'";

        long tblID = 0;
        boolean isTblFind = false;

        ResultSet tblSet = ps.executeQuery(sql);
        while (tblSet.next()) {
            isTblFind = true;
            tblID = tblSet.getLong(1);
            tblType = tblSet.getString(2);
            tblFormat = tblSet.getString(3);
            tblLocation = tblSet.getString(4);
            break;
        }
        tblSet.close();

        if (!isTblFind) {
            con.commit();
            success = true;
            return success;
        }

        if (tblFormat != null && tblFormat.equalsIgnoreCase("pgdata")) {
            sql = "select param_key, param_value from table_params where tbl_id=" + tblID
                    + " and param_type='SERDE'";
            ResultSet pSet = ps.executeQuery(sql);
            Map<String, String> pMap = new HashMap<String, String>();
            while (pSet.next()) {
                pMap.put(pSet.getString(1), pSet.getString(2));
            }

            pSet.close();

            host = pMap.get("ip");
            port = pMap.get("port");
            db = pMap.get("db_name");
            user = pMap.get("user_name");
            pass = pMap.get("pwd");
        }

        sql = "delete from tbls where tbl_id=" + tblID;
        ps.executeUpdate(sql);

        boolean deleteSuccess = false;
        if (deleteData && (tblLocation != null) && !tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
            Path tblPath = new Path(tblLocation);
            deleteSuccess = wh.deleteDir(tblPath, true);

            HiveConf hconf = (HiveConf) hiveConf;

            if ((!deleteSuccess) && hconf.getBoolVar(HiveConf.ConfVars.HIVE_DELETE_DIR_ERROR_THROW)) {
                throw new MetaException("can not delete hdfs path, drop table failed!");
            }
        }

        con.commit();
        success = true;
    } catch (Exception sqlex) {
        sqlex.printStackTrace();
        LOG.error("drop table error, db=" + dbName + ", tbl=" + tableName + ", msg=" + sqlex.getMessage());
        throw new MetaException(sqlex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }
        //else {
        //  if (deleteData && (tblLocation != null)
        //      && !tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
        //    Path tblPath = new Path(tblLocation);
        //    wh.deleteDir(tblPath, true);
        //  }
        //}

        closeStatement(ps);
        closeConnection(con);
    }

    if (success && tblFormat != null && tblFormat.equalsIgnoreCase("pgdata") && host != null && port != null
            && db != null && user != null && pass != null) {
        Connection conn = null;
        try {
            String sql = "drop table " + tableName;
            String url = "jdbc:postgresql://" + host + ":" + port + "/" + db;

            conn = DriverManager.getConnection(url, user, pass);
            conn.setAutoCommit(false);
            Statement s = conn.createStatement();
            s.execute(sql);
            conn.commit();
        } catch (Exception e) {
            success = false;
            throw new MetaException(e.getMessage());
        } finally {
            closeConnection(conn);
        }
    }

    success = false;
    try {
        con = getGlobalConnection();
    } catch (MetaStoreConnectException e1) {
        LOG.error("drop table error, db=" + dbName + ", tbl=" + tableName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("drop table error, db=" + dbName + ", tbl=" + tableName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

        ps = con.createStatement();
        String sql = "delete from tblpriv where db_name='" + dbName.toLowerCase() + "' and tbl_name='"
                + tableName.toLowerCase() + "'";

        ps.executeUpdate(sql);

        try {
            sql = "delete from tblsensitivity where db_name='" + dbName.toLowerCase() + "' and tbl_name='"
                    + tableName.toLowerCase() + "'";

            ps.executeUpdate(sql);
        } catch (Exception x) {

        }

        con.commit();
        success = true;
    } catch (SQLException x) {
        LOG.error("drop table error, db=" + dbName + ", tbl=" + tableName + ", msg=" + x.getMessage());
        throw new MetaException(x.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeConnection(con);
    }

    return success;
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

public void addPartition(String dbName, String tblName, AddPartitionDesc addPartitionDesc)
        throws InvalidObjectException, MetaException {
    boolean success = false;

    Connection con = null;/*from   w  ww  . ja va 2  s.  c  om*/
    PreparedStatement ps = null;
    Statement stmt = null;
    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();

    boolean isPathMaked = false;
    ArrayList<Path> pathToMake = new ArrayList<Path>();
    Warehouse wh = new Warehouse(hiveConf);

    long tblID = 0;

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                + addPartitionDesc.getLevel() + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                + addPartitionDesc.getLevel() + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
        stmt = con.createStatement();

        String tblType = null;
        boolean hasPriPart = false;
        boolean hasSubPart = false;
        String priPartKey = null;
        String subPartKey = null;
        String priPartType = null;
        String subPartType = null;

        String priKeyType = null;
        String subKeyType = null;
        ResultSet tblSet = null;
        boolean isTblFind = false;
        boolean isColFind = false;

        String tblFormat = null;
        String tblLocation = null;

        PrimitiveTypeInfo pti = null;
        ObjectInspector StringIO = null;
        ObjectInspector ValueIO = null;
        ObjectInspectorConverters.Converter converter1 = null;
        ObjectInspectorConverters.Converter converter2 = null;

        ArrayList<String> partToAdd = new ArrayList<String>();
        String sql = null;

        HiveConf hconf = (HiveConf) hiveConf;
        boolean externalPartition = hconf.getBoolVar(HiveConf.ConfVars.HIVESUPPORTEXTERNALPARTITION);

        if (addPartitionDesc.getLevel() == 0) {
            sql = "SELECT tbl_id, tbl_type, pri_part_type, pri_part_key, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName + "' and tbl_name='" + tblName + "'";

            tblSet = stmt.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                priPartKey = tblSet.getString(4);
                priPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(5);
                tblLocation = tblSet.getString(6);

                if (priPartType != null && !priPartType.isEmpty()) {
                    hasPriPart = true;
                }
                break;
            }
            tblSet.close();

            if (!isTblFind) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                        + addPartitionDesc.getLevel() + ", msg=" + "can not find table " + dbName + ":"
                        + tblName);

                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + addPartitionDesc.getLevel() + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }

                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + addPartitionDesc.getLevel() + ", msg=" + tblType
                            + " can not support alter partition");

                    throw new MetaException(tblType + " can not support alter partition");
                }
            }

            if (!hasPriPart) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                        + addPartitionDesc.getLevel() + ", msg=" + "table " + dbName + ":" + tblName
                        + " is not pri-partitioned");

                throw new MetaException("table " + dbName + ":" + tblName + " is not pri-partitioned");
            }

            sql = "SELECT type_name from COLUMNS where tbl_id=" + tblID + " and column_name='"
                    + priPartKey.toLowerCase() + "'";
            isColFind = false;
            ResultSet colSet = stmt.executeQuery(sql);
            while (colSet.next()) {
                isColFind = true;
                priKeyType = colSet.getString(1);
                break;
            }
            colSet.close();

            if (!isColFind) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                        + addPartitionDesc.getLevel() + ", msg=" + "table "
                        + "can not find partition key information " + priPartKey);

                throw new MetaException("can not find partition key information " + priPartKey);
            }

            pti = new PrimitiveTypeInfo();
            pti.setTypeName(priKeyType);
            StringIO = PrimitiveObjectInspectorFactory
                    .getPrimitiveJavaObjectInspector(PrimitiveCategory.STRING);
            ValueIO = PrimitiveObjectInspectorFactory
                    .getPrimitiveWritableObjectInspector(pti.getPrimitiveCategory());
            converter1 = ObjectInspectorConverters.getConverter(StringIO, ValueIO);
            converter2 = ObjectInspectorConverters.getConverter(StringIO, ValueIO);

            if ((addPartitionDesc.getPartType().equalsIgnoreCase("RANGE_PARTITION")
                    && !priPartType.equalsIgnoreCase("range"))
                    || (addPartitionDesc.getPartType().equalsIgnoreCase("LIST_PARTITION")
                            && !priPartType.equalsIgnoreCase("list"))) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                        + addPartitionDesc.getLevel() + ", msg=" + "can not add  a "
                        + addPartitionDesc.getPartType() + " partition, but the pri-partition type is "
                        + priPartType);

                throw new MetaException("can not add  a " + addPartitionDesc.getPartType()
                        + " partition, but the pri-partition type is " + priPartType);
            }

            LinkedHashMap<String, List<String>> partSpaces = new LinkedHashMap<String, List<String>>();
            Set<String> subPartNameSet = new TreeSet<String>();

            sql = "SELECT level, part_name, part_values from PARTITIONS where" + " tbl_id=" + tblID;// + " order by level asc";

            ResultSet partSet = stmt.executeQuery(sql);
            int partLevel = 0;

            while (partSet.next()) {
                partLevel = partSet.getInt(1);

                if (partLevel == 0) {
                    String partName = partSet.getString(2);
                    List<String> valueList = new ArrayList<String>();
                    Array spaceArray = partSet.getArray(3);

                    ResultSet priValueSet = spaceArray.getResultSet();

                    while (priValueSet.next()) {
                        valueList.add(priValueSet.getString(2));
                    }

                    partSpaces.put(partName, valueList);
                } else if (partLevel == 1) {
                    String partName = partSet.getString(2);
                    subPartNameSet.add(partName);
                }
            }
            partSet.close();

            partToAdd = new ArrayList<String>();

            LinkedHashMap<String, List<String>> addPartSpaces = (LinkedHashMap<String, List<String>>) addPartitionDesc
                    .getParSpaces();

            Iterator<String> itr = addPartSpaces.keySet().iterator();

            while (itr.hasNext()) {
                String key = itr.next().toLowerCase();
                if (partSpaces.containsKey(key)) {
                    LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + addPartitionDesc.getLevel() + ", msg=" + "table : " + tblName
                            + " have already contain a pri parititon named: " + key);

                    throw new MetaException(
                            "table : " + tblName + " have already contain a pri parititon named: " + key);
                }
                partToAdd.add(key);
            }

            Iterator<List<String>> listItr = addPartSpaces.values().iterator();

            while (listItr.hasNext()) {
                Iterator<String> valueItr = listItr.next().iterator();
                if (valueItr.hasNext()) {
                    String value = valueItr.next();

                    if (converter1.convert(value) == null) {
                        LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                                + addPartitionDesc.getLevel() + ", msg=" + "value : " + value
                                + " should be type of " + priKeyType);

                        throw new MetaException("value : " + value + " should be type of " + priKeyType);
                    }

                    Iterator<List<String>> PartValuesItr = partSpaces.values().iterator();
                    while (PartValuesItr.hasNext()) {
                        if (PartValuesItr.next().contains(value)) {
                            LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                                    + addPartitionDesc.getLevel() + ", msg=" + "table : " + tblName
                                    + " have already contain a pri partition contain value: " + value);

                            throw new MetaException("table : " + tblName
                                    + " have already contain a pri partition contain value: " + value);
                        }
                    }
                }
            }

            ps = con.prepareStatement(
                    "INSERT INTO partitions(level, tbl_id, " + " part_name, part_values) values(?,?,?,?)");

            for (Map.Entry<String, List<String>> entry : addPartSpaces.entrySet()) {
                ps.setInt(1, 0);
                ps.setLong(2, tblID);

                Array spaceArray = con.createArrayOf("varchar", entry.getValue().toArray());
                ps.setArray(4, spaceArray);
                ps.setString(3, entry.getKey());

                ps.addBatch();
            }
            ps.executeBatch();

            if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                for (String partName : partToAdd) {
                    if (tblLocation == null || tblLocation.trim().isEmpty()) {
                        pathToMake.addAll(wh.getPriPartitionPaths(dbName, tblName, partName, subPartNameSet));
                    } else {
                        pathToMake.addAll(Warehouse.getPriPartitionPaths(new Path(tblLocation), partName,
                                subPartNameSet));
                    }
                }
            } else {
                for (String partName : partToAdd) {
                    pathToMake.addAll(
                            Warehouse.getPriPartitionPaths(new Path(tblLocation), partName, subPartNameSet));
                }
            }
        } else if (addPartitionDesc.getLevel() == 1) {
            sql = "SELECT tbl_id, tbl_type, sub_part_type, sub_part_key, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName.toLowerCase() + "' and tbl_name='"
                    + tblName.toLowerCase() + "'";

            tblSet = stmt.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                subPartKey = tblSet.getString(4);
                subPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(5);
                tblLocation = tblSet.getString(6);

                if (subPartType != null && !subPartType.isEmpty()) {
                    hasSubPart = true;
                }

                break;
            }

            tblSet.close();
            if (!isTblFind) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                        + addPartitionDesc.getLevel() + ", msg=" + "can not find table " + dbName + ":"
                        + tblName);

                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + addPartitionDesc.getLevel() + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }

                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + addPartitionDesc.getLevel() + ", msg=" + tblType
                            + " can not support alter partition");

                    throw new MetaException(tblType + " can not support alter partition");
                }
            }

            if (!hasSubPart) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                        + addPartitionDesc.getLevel() + ", msg=" + "table " + dbName + ":" + tblName
                        + " is not sun-partitioned");

                throw new MetaException("table " + dbName + ":" + tblName + " is not sun-partitioned");
            }

            sql = "SELECT type_name from COLUMNS where tbl_id=" + tblID + " and column_name='"
                    + subPartKey.toLowerCase() + "'";

            isColFind = false;
            ResultSet colSet = stmt.executeQuery(sql);
            while (colSet.next()) {
                isColFind = true;
                subKeyType = colSet.getString(1);
                break;
            }

            colSet.close();

            if (!isColFind) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                        + addPartitionDesc.getLevel() + ", msg=" + "can not find partition key information "
                        + priPartKey);

                throw new MetaException("can not find partition key information " + priPartKey);
            }

            pti = new PrimitiveTypeInfo();
            pti.setTypeName(subKeyType);
            StringIO = PrimitiveObjectInspectorFactory
                    .getPrimitiveJavaObjectInspector(PrimitiveCategory.STRING);
            ValueIO = PrimitiveObjectInspectorFactory
                    .getPrimitiveWritableObjectInspector(pti.getPrimitiveCategory());
            converter1 = ObjectInspectorConverters.getConverter(StringIO, ValueIO);
            converter2 = ObjectInspectorConverters.getConverter(StringIO, ValueIO);

            if ((addPartitionDesc.getPartType().equalsIgnoreCase("RANGE_PARTITION")
                    && !subPartType.equalsIgnoreCase("range"))
                    || (addPartitionDesc.getPartType().equalsIgnoreCase("LIST_PARTITION")
                            && !subPartType.equalsIgnoreCase("list"))) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                        + addPartitionDesc.getLevel() + ", msg=" + "you can not add  a "
                        + addPartitionDesc.getPartType() + " partition, but the sub-partition type is "
                        + subPartType);

                throw new MetaException("you can not add  a " + addPartitionDesc.getPartType()
                        + " partition, but the sub-partition type is " + subPartType);
            }

            LinkedHashMap<String, List<String>> partSpaces = new LinkedHashMap<String, List<String>>();
            Set<String> partNameSet = new TreeSet<String>();

            sql = "SELECT level,  part_name, part_values from PARTITIONS where" + " tbl_id=" + tblID;// + " order by level asc";

            ResultSet partSet = stmt.executeQuery(sql);
            int partLevel = 0;

            while (partSet.next()) {
                partLevel = partSet.getInt(1);

                if (partLevel == 1) {
                    String partName = partSet.getString(2);
                    List<String> valueList = new ArrayList<String>();
                    Array spaceArray = partSet.getArray(3);

                    ResultSet priValueSet = spaceArray.getResultSet();

                    while (priValueSet.next()) {
                        valueList.add(priValueSet.getString(2));
                    }
                    partSpaces.put(partName, valueList);
                } else if (partLevel == 0) {
                    String partName = partSet.getString(2);
                    partNameSet.add(partName);
                }
            }

            partToAdd = new ArrayList<String>();

            LinkedHashMap<String, List<String>> addPartSpaces = (LinkedHashMap<String, List<String>>) addPartitionDesc
                    .getParSpaces();

            Iterator<String> itr = addPartSpaces.keySet().iterator();

            while (itr.hasNext()) {
                String key = itr.next().toLowerCase();
                if (partSpaces.containsKey(key)) {
                    LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + addPartitionDesc.getLevel() + ", msg=" + "table : " + tblName
                            + " have already contain a sub parititon named: " + key);

                    throw new MetaException(
                            "table : " + tblName + " have already contain a sub parititon named: " + key);
                }

                if (key.equalsIgnoreCase("default")) {
                    LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + addPartitionDesc.getLevel() + ", msg="
                            + "use : 'alter table tblname add default subpartition' to add default subpartition!");

                    throw new MetaException(
                            "use : 'alter table tblname add default subpartition' to add default subpartition!");
                }
                partToAdd.add(key);
            }

            Iterator<List<String>> listItr = addPartSpaces.values().iterator();

            while (listItr.hasNext()) {
                Iterator<String> valueItr = listItr.next().iterator();
                if (valueItr.hasNext()) {
                    String value = valueItr.next();

                    if (converter1.convert(value) == null) {
                        LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                                + addPartitionDesc.getLevel() + ", msg=" + "value : " + value
                                + " should be type of " + priKeyType);

                        throw new MetaException("value : " + value + " should be type of " + priKeyType);
                    }

                    Iterator<List<String>> PartValuesItr = partSpaces.values().iterator();
                    while (PartValuesItr.hasNext()) {
                        if (PartValuesItr.next().contains(value)) {
                            LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                                    + addPartitionDesc.getLevel() + ", msg=" + "table : " + tblName
                                    + " have already contain a sub partition contain value: " + value);

                            throw new MetaException("table : " + tblName
                                    + " have already contain a sub partition contain value: " + value);
                        }
                    }
                }
            }

            ps = con.prepareStatement(
                    "INSERT INTO partitions(level, tbl_id, " + " part_name, part_values) values(?,?,?,?)");

            for (Map.Entry<String, List<String>> entry : addPartSpaces.entrySet()) {
                ps.setInt(1, 1);
                ps.setLong(2, tblID);

                Array spaceArray = con.createArrayOf("varchar", entry.getValue().toArray());
                ps.setArray(4, spaceArray);
                ps.setString(3, entry.getKey());

                ps.addBatch();
            }
            ps.executeBatch();

            if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                for (String partName : partToAdd) {
                    if (tblLocation == null || tblLocation.trim().isEmpty()) {
                        pathToMake.addAll(wh.getSubPartitionPaths(dbName, tblName, partNameSet, partName));
                    } else {
                        pathToMake.addAll(
                                Warehouse.getSubPartitionPaths(new Path(tblLocation), partNameSet, partName));
                    }
                }
            } else {
                for (String partName : partToAdd) {
                    pathToMake.addAll(
                            Warehouse.getSubPartitionPaths(new Path(tblLocation), partNameSet, partName));
                }
            }
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        ex.printStackTrace();
        LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                + addPartitionDesc.getLevel() + ", msg=" + ex.getMessage());

        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }

            if (isPathMaked) {
                for (Path path : pathToMake) {
                    wh.deleteDir(path, false);
                }
            }
        }

        closeStatement(ps);
        closeConnection(con);
    }

    if (success) {
        boolean mkDirOK = false;
        List<Path> createdPath = new ArrayList<Path>();
        try {
            for (Path path : pathToMake) {
                mkDirOK = wh.mkdirs(path);
                if (!mkDirOK) {
                    break;
                }

                createdPath.add(path);
            }
        } catch (Exception x) {
            mkDirOK = false;
        }

        if (!mkDirOK) {
            dropPartitionMeta(dbName, tblID, addPartitionDesc);
            if (!createdPath.isEmpty()) {
                for (Path path : createdPath) {
                    wh.deleteDir(path, true);
                }
            }

            throw new MetaException("can not create hdfs path, add partition failed");
        }

    }
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

public void dropPartition(String dbName, String tblName, DropPartitionDesc dropPartitionDesc)
        throws InvalidObjectException, MetaException {
    Connection con = null;/*  ww w  .j  ava 2  s. co  m*/
    Statement ps = null;
    PreparedStatement pss = null;
    boolean success = false;

    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();

    ArrayList<Path> pathToDel = null;
    Warehouse wh = new Warehouse(hiveConf);
    List<String> existsParts = new ArrayList<String>();

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("drop partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                + dropPartitionDesc.getLevel() + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("drop partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                + dropPartitionDesc.getLevel() + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
        ps = con.createStatement();

        String tblType = null;
        boolean hasPriPart = false;
        boolean hasSubPart = false;
        String priPartType = null;
        String subPartType = null;

        long tblID = 0;
        ResultSet tblSet = null;
        boolean isTblFind = false;

        String tblFormat = null;
        String tblLocation = null;

        ResultSet partSet = null;
        String sql = null;

        HiveConf hconf = (HiveConf) hiveConf;
        boolean externalPartition = hconf.getBoolVar(HiveConf.ConfVars.HIVESUPPORTEXTERNALPARTITION);

        if (dropPartitionDesc.getLevel() == 0) {
            sql = "SELECT tbl_id, tbl_type, pri_part_type, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName + "' and tbl_name='" + tblName + "'";

            tblSet = ps.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                priPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(4);
                tblLocation = tblSet.getString(5);

                if (priPartType != null && !priPartType.isEmpty()) {
                    hasPriPart = true;
                }
                break;
            }

            tblSet.close();

            if (!isTblFind) {
                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("drop partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + dropPartitionDesc.getLevel() + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }

                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    throw new MetaException(tblType + " can not support alter partition");
                }
            }

            if (!hasPriPart) {
                throw new MetaException("table " + dbName + ":" + tblName + " is not pri-partitioned");
            }

            List<String> delPartName = dropPartitionDesc.getPartNames();
            ResultSet ret = null;

            for (String del : delPartName) {
                sql = "delete from partitions where tbl_id=" + tblID + " and part_name='" + del
                        + "' and level=0 returning part_name";

                ret = ps.executeQuery(sql);
                while (ret.next()) {
                    existsParts.add(del);
                    break;
                }
                ret.close();
            }

            //pss = con
            //    .prepareStatement("delete from partitions where tbl_id=? and part_name=? and level=0 returing part_name");
            //for (String del : delPartName) {
            //  pss.setLong(1, tblID);
            //  pss.setString(2, del);
            //  pss.addBatch();
            //}
            //pss.executeBatch();

            pathToDel = new ArrayList<Path>();

            if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                for (String del : existsParts) {
                    if (tblLocation == null || tblLocation.trim().isEmpty()) {
                        pathToDel.add(wh.getPartitionPath(dbName, tblName, del));
                    } else {
                        pathToDel.add(Warehouse.getPartitionPath(new Path(tblLocation), del));
                    }
                }
            } else {
                //for (String del : existsParts) {
                //    pathToDel.add(Warehouse.getPartitionPath(new Path(tblLocation),  del));
                //}          
            }

        } else if (dropPartitionDesc.getLevel() == 1) {
            sql = "SELECT tbl_id, tbl_type, sub_part_type, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName + "' and tbl_name='" + tblName + "'";

            tblSet = ps.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                subPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(4);
                tblLocation = tblSet.getString(5);

                if (subPartType != null && !subPartType.isEmpty()) {
                    hasSubPart = true;
                }
                break;
            }

            tblSet.close();

            if (!isTblFind) {
                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("drop partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + dropPartitionDesc.getLevel() + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }

                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    throw new MetaException(tblType + " can not support alter partition");
                }
            }

            if (!hasSubPart) {
                throw new MetaException("table " + dbName + ":" + tblName + " is not sub-partitioned");
            }

            Set<String> priPartNameSet = new TreeSet<String>();

            List<String> delSubPartName = dropPartitionDesc.getPartNames();

            sql = "SELECT level, part_name from PARTITIONS where" + " tbl_id=" + tblID + " order by level asc";

            partSet = ps.executeQuery(sql);
            int partLevel = 0;

            while (partSet.next()) {
                partLevel = partSet.getInt(1);
                if (partLevel == 0) {
                    String partName = partSet.getString(2);
                    priPartNameSet.add(partName);
                }
            }

            partSet.close();

            //pss = con
            //    .prepareStatement("delete from partitions where tbl_id=? and part_name=? and level=1");
            //for (String del : delSubPartName) {
            //  pss.setLong(1, tblID);
            //  pss.setString(2, del);
            //  pss.addBatch();
            // }
            // pss.executeBatch();

            ResultSet ret = null;

            for (String del : delSubPartName) {
                sql = "delete from partitions where tbl_id=" + tblID + " and part_name='" + del
                        + "' and level=1 returning part_name";

                ret = ps.executeQuery(sql);
                while (ret.next()) {
                    existsParts.add(del);
                    break;
                }
                ret.close();
            }

            pathToDel = new ArrayList<Path>();

            if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                for (String str : existsParts) {
                    if (tblLocation == null || tblLocation.trim().isEmpty()) {
                        pathToDel.addAll(wh.getSubPartitionPaths(dbName, tblName, priPartNameSet, str));
                    } else {
                        pathToDel.addAll(
                                Warehouse.getSubPartitionPaths(new Path(tblLocation), priPartNameSet, str));
                    }
                }
            } else {
                //for (String str : existsParts) {
                //    pathToDel.addAll(Warehouse.getSubPartitionPaths(new Path(tblLocation),
                //        priPartNameSet, str));
                //}
            }
        }

        if (pathToDel != null && !pathToDel.isEmpty()) {
            for (Path path : pathToDel) {
                wh.deleteDirThrowExp(path, true);
            }
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        ex.printStackTrace();
        LOG.error("drop partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                + dropPartitionDesc.getLevel() + ", msg=" + ex.getMessage());
        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeStatement(pss);
        closeConnection(con);
    }

    //if (success) {
    //  for (Path path : pathToDel) {
    //    wh.deleteDir(path, true);
    //  }
    //} else {
    //  return;
    //}
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

@Override
public void addDefaultPartition(String dbName, String tblName, int level)
        throws InvalidObjectException, MetaException {
    boolean success = false;

    Connection con = null;/*from  www  . j a va2  s .co  m*/
    Statement ps = null;
    PreparedStatement pss = null;

    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();

    boolean isPathMaked = false;
    ArrayList<Path> pathToMake = new ArrayList<Path>();
    Warehouse wh = new Warehouse(hiveConf);
    long tblID = 0;

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
        ps = con.createStatement();

        String tblType = null;
        boolean hasPriPart = false;
        boolean hasSubPart = false;
        String priPartKey = null;
        String subPartKey = null;
        String priPartType = null;
        String subPartType = null;

        String tblFormat = null;
        String tblLocation = null;

        String priKeyType = null;
        String subKeyType = null;
        ResultSet tblSet = null;
        boolean isTblFind = false;

        ArrayList<String> partToAdd = new ArrayList<String>();
        String sql = null;

        HiveConf hconf = (HiveConf) hiveConf;
        boolean externalPartition = hconf.getBoolVar(HiveConf.ConfVars.HIVESUPPORTEXTERNALPARTITION);

        if (level == 0) {
            sql = "SELECT tbl_id, tbl_type, pri_part_type, pri_part_key, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName + "' and tbl_name='" + tblName + "'";

            tblSet = ps.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                priPartKey = tblSet.getString(4);
                priPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(5);
                tblLocation = tblSet.getString(6);

                if (priPartType != null && !priPartType.isEmpty()) {
                    hasPriPart = true;
                }
                break;
            }

            tblSet.close();

            if (!isTblFind) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                        + ", msg=" + "can not find table " + dbName + ":" + tblName);

                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + level + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }

                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + level + ", msg=" + tblType + " can not support alter partition");

                    throw new MetaException(tblType + " can not support alter partition");
                }
            }

            if (!hasPriPart) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                        + ", msg=" + "table " + dbName + ":" + tblName + " is not pri-partitioned");

                throw new MetaException("table " + dbName + ":" + tblName + " is not pri-partitioned");
            }

            List<String> partNames = new ArrayList<String>();
            Set<String> subPartNameSet = new TreeSet<String>();

            sql = "SELECT level, part_name from PARTITIONS where" + " tbl_id=" + tblID + " order by level asc";

            ResultSet partSet = ps.executeQuery(sql);
            int partLevel = 0;

            while (partSet.next()) {
                partLevel = partSet.getInt(1);

                if (partLevel == 0) {
                    String partName = partSet.getString(2);
                    partNames.add(partName);
                } else if (partLevel == 1) {
                    String partName = partSet.getString(2);
                    subPartNameSet.add(partName);
                }
            }
            partSet.close();

            if (partNames.contains("default")) {
                LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                        + ", msg=" + "table : " + tblName
                        + " have already contain a pri parititon named: default");

                throw new MetaException(
                        "table : " + tblName + " have already contain a pri parititon named: default");
            }

            pss = con.prepareStatement(
                    "INSERT INTO partitions(level, tbl_id, " + " part_name, part_values) values(?,?,?,?)");

            pss.setInt(1, 0);

            pss.setLong(2, tblID);
            pss.setString(3, "default");

            Array spaceArray = con.createArrayOf("varchar", new ArrayList<String>().toArray());
            pss.setArray(4, spaceArray);

            pss.executeUpdate();

            if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                if (tblLocation == null || tblLocation.trim().isEmpty()) {
                    pathToMake.addAll(wh.getPriPartitionPaths(dbName, tblName, "default", subPartNameSet));
                } else {
                    pathToMake.addAll(
                            Warehouse.getPriPartitionPaths(new Path(tblLocation), "default", subPartNameSet));
                }
            } else {
                pathToMake.addAll(
                        Warehouse.getPriPartitionPaths(new Path(tblLocation), "default", subPartNameSet));
            }
        } else if (level == 1) {
            sql = "SELECT tbl_id, tbl_type, sub_part_type, sub_part_key, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName.toLowerCase() + "' and tbl_name='"
                    + tblName.toLowerCase() + "'";

            tblSet = ps.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                subPartKey = tblSet.getString(4);
                subPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(5);
                tblLocation = tblSet.getString(6);

                if (subPartType != null && !subPartType.isEmpty()) {
                    hasSubPart = true;
                }

                break;
            }

            tblSet.close();

            if (!isTblFind) {
                LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                        + ", msg=" + "can not find table " + dbName + ":" + tblName);

                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + level + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }
                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + level + ", msg=" + tblType + " can not support alter partition");

                    throw new MetaException(tblType + " can not support alter partition");
                }
            }

            if (!hasSubPart) {
                LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                        + ", msg=" + "table " + dbName + ":" + tblName + " is not sun-partitioned");

                throw new MetaException("table " + dbName + ":" + tblName + " is not sun-partitioned");
            }

            List<String> partNames = new ArrayList<String>();
            Set<String> partNameSet = new TreeSet<String>();

            sql = "SELECT level,  part_name from PARTITIONS where" + " tbl_id=" + tblID + " order by level asc";
            ResultSet partSet = ps.executeQuery(sql);
            int partLevel = 0;

            while (partSet.next()) {
                partLevel = partSet.getInt(1);

                if (partLevel == 1) {
                    String partName = partSet.getString(2);
                    partNames.add(partName);
                } else if (partLevel == 0) {
                    String partName = partSet.getString(2);
                    partNameSet.add(partName);
                }
            }

            partSet.close();

            if (partNames.contains("default")) {
                LOG.error("add default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                        + ", msg=" + "table : " + tblName
                        + " have already contain a sub parititon named: default");

                throw new MetaException(
                        "table : " + tblName + " have already contain a sub parititon named: default");
            }

            pss = con.prepareStatement(
                    "INSERT INTO partitions(level, tbl_id, " + " part_name, part_values) values(?,?,?,?)");

            pss.setInt(1, 1);
            pss.setLong(2, tblID);
            pss.setString(3, "default");

            Array spaceArray = con.createArrayOf("varchar", new ArrayList<String>().toArray());
            pss.setArray(4, spaceArray);

            pss.executeUpdate();

            if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                if (tblLocation == null || tblLocation.trim().isEmpty()) {
                    pathToMake.addAll(wh.getSubPartitionPaths(dbName, tblName, partNameSet, "default"));
                } else {
                    pathToMake.addAll(
                            Warehouse.getSubPartitionPaths(new Path(tblLocation), partNameSet, "default"));
                }
            } else {
                pathToMake
                        .addAll(Warehouse.getSubPartitionPaths(new Path(tblLocation), partNameSet, "default"));
            }
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        LOG.error("add partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level + ", msg="
                + ex.getMessage());

        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }

            if (isPathMaked) {
                for (Path path : pathToMake) {
                    wh.deleteDir(path, false);
                }
            }
        }

        closeStatement(ps);
        closeStatement(pss);
        closeConnection(con);
    }

    if (success) {
        boolean mkDirOK = false;
        List<Path> createdPath = new ArrayList<Path>();
        try {
            for (Path path : pathToMake) {
                mkDirOK = wh.mkdirs(path);
                if (!mkDirOK) {
                    break;
                }

                createdPath.add(path);
            }
        } catch (Exception x) {
            mkDirOK = false;
        }

        if (!mkDirOK) {
            dropPartitionMeta(dbName, tblID, "default", level);
            if (!createdPath.isEmpty()) {
                for (Path path : createdPath) {
                    wh.deleteDir(path, true);
                }
            }
        }

    }

}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

@Override
public void dropDefaultPartition(String dbName, String tblName, int level)
        throws InvalidObjectException, MetaException {
    Connection con = null;//from   w w  w.j  a va  2 s. c  o  m
    Statement ps = null;
    boolean success = false;

    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();

    ArrayList<Path> pathToDel = null;
    Warehouse wh = new Warehouse(hiveConf);

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("drop default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("drop default partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level
                + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
        ps = con.createStatement();

        String tblType = null;
        boolean hasPriPart = false;
        boolean hasSubPart = false;
        String priPartType = null;
        String subPartType = null;

        long tblID = 0;
        ResultSet tblSet = null;
        boolean isTblFind = false;

        String tblFormat = null;
        String tblLocation = null;

        ResultSet partSet = null;

        String sql = null;

        HiveConf hconf = (HiveConf) hiveConf;
        boolean externalPartition = hconf.getBoolVar(HiveConf.ConfVars.HIVESUPPORTEXTERNALPARTITION);

        if (level == 0) {
            sql = "SELECT tbl_id, tbl_type, pri_part_type, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName + "' and tbl_name='" + tblName + "'";

            tblSet = ps.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                priPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(4);
                tblLocation = tblSet.getString(5);

                if (priPartType != null && !priPartType.isEmpty()) {
                    hasPriPart = true;
                }
                break;
            }

            tblSet.close();

            if (!isTblFind) {
                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("drop default partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + level + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }
                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    throw new MetaException(tblType + " can not support alter partition");
                }
            }

            if (!hasPriPart) {
                throw new MetaException("table " + dbName + ":" + tblName + " is not pri-partitioned");
            }

            sql = "delete from partitions where tbl_id=" + tblID
                    + " and part_name='default' and level=0 returning 'default'";
            ResultSet ret = ps.executeQuery(sql);
            while (ret.next()) {
                pathToDel = new ArrayList<Path>();
                if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                    if (tblLocation == null || tblLocation.trim().isEmpty()) {
                        pathToDel.add(wh.getPartitionPath(dbName, tblName, "default"));
                    } else {
                        pathToDel.add(Warehouse.getPartitionPath(new Path(tblLocation), "default"));
                    }
                } else {
                    //pathToDel.add(Warehouse.getPartitionPath(new Path(tblLocation), "default"));
                }
                break;
            }
            ret.close();

            //ps.executeUpdate(sql);
            //pathToDel = new ArrayList<Path>();

            //pathToDel.add(wh.getPartitionPath(dbName, tblName, "default"));
        } else if (level == 1) {
            sql = "SELECT tbl_id, tbl_type, sub_part_type, tbl_format, tbl_location"
                    + " from TBLS where db_name='" + dbName + "' and tbl_name='" + tblName + "'";

            tblSet = ps.executeQuery(sql);
            isTblFind = false;

            while (tblSet.next()) {
                isTblFind = true;
                tblID = tblSet.getLong(1);
                tblType = tblSet.getString(2);
                subPartType = tblSet.getString(3);
                tblFormat = tblSet.getString(4);
                tblLocation = tblSet.getString(5);

                if (subPartType != null && !subPartType.isEmpty()) {
                    hasSubPart = true;
                }
                break;
            }

            tblSet.close();

            if (!isTblFind) {
                throw new MetaException("can not find table " + dbName + ":" + tblName);
            }

            if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
                if (tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat != null
                        && tblFormat.equalsIgnoreCase("pgdata")) {
                    LOG.error("drop default partition error, db=" + dbName + ", tbl=" + tblName + ", level="
                            + level + ", msg=" + tblType + ":" + tblFormat
                            + " can not support alter partition");
                    throw new MetaException(tblType + ":" + tblFormat + " can not support alter partition");
                }
                if (externalPartition && tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                        && (tblFormat == null || !tblFormat.equalsIgnoreCase("pgdata"))) {
                } else {
                    throw new MetaException(tblType + "can not support alter partition");
                }
            }

            if (!hasSubPart) {
                throw new MetaException("table " + dbName + ":" + tblName + " is not sub-partitioned");
            }

            Set<String> priPartNameSet = new TreeSet<String>();

            sql = "SELECT level, part_name from PARTITIONS where" + " tbl_id=" + tblID
                    + " and level=0 order by level asc";

            partSet = ps.executeQuery(sql);
            int partLevel = 0;

            while (partSet.next()) {
                partLevel = partSet.getInt(1);
                if (partLevel == 0) {
                    String partName = partSet.getString(2);
                    priPartNameSet.add(partName);
                }
            }

            partSet.close();

            sql = "delete from partitions where tbl_id=" + tblID
                    + " and part_name='default' and level=1 return 'default'";

            ResultSet ret = ps.executeQuery(sql);
            while (ret.next()) {
                pathToDel = new ArrayList<Path>();
                if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")) {
                    if (tblLocation == null || tblLocation.trim().isEmpty()) {
                        pathToDel.addAll(wh.getSubPartitionPaths(dbName, tblName, priPartNameSet, "default"));
                    } else {
                        pathToDel.addAll(Warehouse.getSubPartitionPaths(new Path(tblLocation), priPartNameSet,
                                "default"));
                    }
                } else {
                    //pathToDel.addAll(Warehouse.getSubPartitionPaths(new Path(tblLocation),
                    //        priPartNameSet, "default"));
                }
                break;
            }
            ret.close();

            //ps.executeUpdate(sql);

            //pathToDel = new ArrayList<Path>();
            //pathToDel.addAll(wh.getSubPartitionPaths(dbName, tblName,
            //    priPartNameSet, "default"));
        }

        if (pathToDel != null && !pathToDel.isEmpty()) {
            for (Path path : pathToDel) {
                wh.deleteDirThrowExp(path, true);
            }
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        ex.printStackTrace();
        LOG.error("drop partition error, db=" + dbName + ", tbl=" + tblName + ", level=" + level + ", msg="
                + ex.getMessage());
        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeConnection(con);
    }

    //if (success) {
    //  for (Path path : pathToDel) {
    //    wh.deleteDir(path, true);
    //  }
    //} else {
    //  return;
    //}
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

public void renameTableNoDistributeTrans(String dbName, String tblName, String modifyUser, String newName)
        throws InvalidOperationException, MetaException {
    if (!MetaStoreUtils.validateName(newName)) {
        throw new InvalidOperationException(newName + " is not a valid object name");
    }/*from w  ww.  j av  a 2 s  .  c  om*/

    if (tblName.equals(newName)) {
        return;
    }

    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();
    modifyUser = modifyUser.toLowerCase();
    newName = newName.toLowerCase();

    Connection con = null;
    PreparedStatement ps = null;
    String newLocation = null;
    String oldLocation = null;
    String serdeLib = null;
    String tblType = null;
    boolean isMoved = false;
    Path newPath = null;
    Path oldPath = null;
    FileSystem oldFs = null;
    FileSystem newFs = null;
    boolean success = false;

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("rename table error, db=" + dbName + ", tbl=" + tblName + ", newName=" + newName + ", msg="
                + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("rename table error, db=" + dbName + ", tbl=" + tblName + ", newName=" + newName + ", msg="
                + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

        ps = con.prepareStatement(
                "select tbl_id, tbl_type, tbl_location, serde_lib from TBLS where db_name=? and tbl_name=?");
        ps.setString(1, dbName);
        ps.setString(2, tblName);

        boolean isTblFind = false;
        long tblID = 0;
        ResultSet tblSet = ps.executeQuery();

        while (tblSet.next()) {
            isTblFind = true;
            tblID = tblSet.getLong(1);
            tblType = tblSet.getString(2);
            oldLocation = tblSet.getString(3);
            serdeLib = tblSet.getString(4);
            break;
        }
        tblSet.close();
        ps.close();

        if (!isTblFind) {
            throw new MetaException("can not find table " + dbName + ":" + tblName);
        }

        if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) {
            throw new MetaException("only manage table can rename ");
        }

        if (serdeLib.equals(ProtobufSerDe.class.getName())) {
            throw new MetaException(
                    "Renaming table is not supported for protobuf table. SerDe may be incompatible");
        }

        Map<String, String> tblParamMap = new HashMap<String, String>();
        ps = con.prepareStatement(
                "select param_key, param_value from table_params where tbl_id=? and param_type='TBL'");
        ps.setLong(1, tblID);
        ResultSet paramSet = ps.executeQuery();
        while (paramSet.next()) {
            tblParamMap.put(paramSet.getString(1), paramSet.getString(2));
        }
        paramSet.close();
        ps.close();
        boolean containTime = false;
        boolean contailUser = false;
        if (tblParamMap.containsKey("last_modified_time"))
            containTime = true;
        if (tblParamMap.containsKey("last_modified_by"))
            contailUser = true;

        if (containTime && contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();
            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (!containTime && !contailUser) {
            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (containTime && !contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");

            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        }

        Warehouse wh = new Warehouse(hiveConf);
        //      newLocation = wh.getDefaultTablePath(dbName, newName).toString();
        newLocation = oldLocation.substring(0, oldLocation.length() - tblName.length()) + newName;

        ps = con.prepareStatement("update tbls set tbl_name=?, tbl_location=? where tbl_id=?");
        ps.setString(1, newName.toLowerCase());
        ps.setString(2, newLocation);
        ps.setLong(3, tblID);

        ps.executeUpdate();
        ps.close();

        oldPath = new Path(oldLocation);
        oldFs = wh.getFs(oldPath);
        newPath = new Path(newLocation);
        newFs = wh.getFs(newPath);

        if (oldFs != newFs) {
            throw new InvalidOperationException(
                    "table new location " + oldFs + " is on a different file system than the old location "
                            + newFs + ". This operation is not supported");
        }

        try {
            oldFs.exists(oldPath);
            if (newFs.exists(newPath)) {
                throw new InvalidOperationException("New location for this table " + dbName + "." + tblName
                        + " already exists : " + newPath);
            }

        } catch (IOException e) {

            throw new InvalidOperationException(
                    "Unable to access new location " + newPath + " for table " + dbName + "." + tblName);
        }

        try {
            if (oldFs.exists(oldPath)) {
                oldFs.rename(oldPath, newPath);
            }
            isMoved = true;
        } catch (IOException e) {
            throw new InvalidOperationException(
                    "Unable to access old location " + oldPath + " for table " + dbName + "." + tblName);

        }

        if (isMoved) {
            try {
                if (oldFs.exists(oldPath)) {
                    oldFs.rename(newPath, oldPath);
                }

            } catch (IOException e) {
                throw new InvalidOperationException(
                        "Unable to access old location " + oldPath + " for table " + dbName + "." + tblName);

            }
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }

            //if (isMoved) {
            //  try {
            //    if (oldFs.exists(oldPath)) {
            //      oldFs.rename(newPath, oldPath);
            //    }

            //  } catch (IOException e) {
            //    throw new InvalidOperationException(
            //        "Unable to access old location " + oldPath + " for table "
            //            + dbName + "." + tblName);

            //  }
            //}
        }

        closeStatement(ps);
        closeConnection(con);
    }

    success = false;
    Statement stmt = null;
    try {
        con = getGlobalConnection();
    } catch (MetaStoreConnectException e1) {
        LOG.error("rename table error, db=" + dbName + ", tbl=" + tblName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("rename table error, db=" + dbName + ", tbl=" + tblName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
        stmt = con.createStatement();

        String sql = "update tblpriv set tbl_name='" + newName + "' where db_name='" + dbName
                + "' and tbl_name='" + tblName + "'";

        stmt.executeUpdate(sql);

        try {
            sql = "update tblsensitivity set tbl_name='" + newName + "' where db_name='" + dbName
                    + "' and tbl_name='" + tblName + "'";

            stmt.executeUpdate(sql);
        } catch (Exception x) {

        }

        con.commit();
        success = true;
    } catch (SQLException x) {
        LOG.error("rename table error, db=" + dbName + ", tbl=" + tblName + ", msg=" + x.getMessage());
        throw new MetaException(x.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(stmt);
        closeConnection(con);
    }

    return;
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

@Override
public void addCols(String dbName, String tblName, String modifyUser, List<FieldSchema> newCols)
        throws InvalidOperationException, MetaException, InvalidObjectException {
    if (!MetaStoreUtils.validateColNames(newCols)) {
        throw new InvalidObjectException("new add columns name is not valid object");
    }/*w w  w .j  av a2  s.com*/

    Connection con = null;
    PreparedStatement ps = null;
    boolean success = false;

    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("add column error, db=" + dbName + ", tbl=" + tblName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("add column error, db=" + dbName + ", tbl=" + tblName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

        ps = con.prepareStatement("select tbl_id, tbl_type, tbl_format, serde_lib"
                + "  from tbls where tbls.db_name=? and tbls.tbl_name=? ");

        ps.setString(1, dbName);
        ps.setString(2, tblName);

        String tblType = null;
        String serdeLib = null;
        String tblFormat = null;

        boolean isTblFind = false;
        long tblID = 0;

        ResultSet tblSet = ps.executeQuery();
        while (tblSet.next()) {
            isTblFind = true;
            tblID = tblSet.getLong(1);
            tblType = tblSet.getString(2);
            tblFormat = tblSet.getString(3);
            serdeLib = tblSet.getString(4);
        }

        tblSet.close();
        ps.close();

        if (!isTblFind) {
            LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
            throw new MetaException("can not find table " + dbName + ":" + tblName);
        }

        if (tblFormat == null || tblFormat.isEmpty()) {
            tblFormat = "text";
        }

        if (tblType.equalsIgnoreCase("VITURAL_VIEW")) {
            LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
            throw new InvalidOperationException("view can not add cloumns");
        }

        if (tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                && !HiveConf.getBoolVar(hiveConf, ConfVars.ALTERSCHEMAACTIVATEEXTTABLE)) {
            LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
            throw new InvalidOperationException("can not add columns for a extenal table ");
        }

        if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat.equalsIgnoreCase("text")
                && (!HiveConf.getBoolVar(hiveConf, ConfVars.ALTERSCHEMAACTIVATETXTTABLE))) {
            LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
            throw new InvalidOperationException("can not add columns for a text format table ");
        }

        if (serdeLib != null && serdeLib.equals(ProtobufSerDe.class.getName())) {
            LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
            throw new InvalidOperationException("can not add columns for a pb table ");
        }

        if (tblFormat != null
                && (tblFormat.equalsIgnoreCase("column") || tblFormat.equalsIgnoreCase("format"))) {
            for (FieldSchema field : newCols) {
                if (field.getType().equals(Constants.BOOLEAN_TYPE_NAME)) {
                    LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
                    throw new InvalidOperationException(
                            "format file or column file not support boolean type rightnow");
                }
            }
        }

        Map<String, String> tblParamMap = new HashMap<String, String>();
        ps = con.prepareStatement(
                "select param_key, param_value from table_params where tbl_id=? and param_type='TBL'");
        ps.setLong(1, tblID);
        ResultSet paramSet = ps.executeQuery();
        while (paramSet.next()) {
            tblParamMap.put(paramSet.getString(1), paramSet.getString(2));
        }
        paramSet.close();
        ps.close();
        boolean containTime = false;
        boolean contailUser = false;
        if (tblParamMap.containsKey("last_modified_time"))
            containTime = true;
        if (tblParamMap.containsKey("last_modified_by"))
            contailUser = true;

        if (containTime && contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();
            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (!containTime && !contailUser) {
            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (containTime && !contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");

            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        }

        if (serdeLib != null && serdeLib.equals("org.apache.hadoop.hive.serde.thrift.columnsetSerDe")) {
            ps = con.prepareStatement("delete from columns where tbl_id=?");
            ps.setLong(1, tblID);
            ps.executeUpdate();

            ps = con.prepareStatement(
                    "insert into columns(column_index, tbl_id, column_name, type_name, comment)"
                            + " values(?,?,?,?,?)");
            long index = 0;

            for (FieldSchema field : newCols) {
                ps.setLong(1, index);
                ps.setLong(2, tblID);
                ps.setString(3, field.getName().toLowerCase());
                ps.setString(4, field.getType());
                ps.setString(5, field.getComment());

                ps.addBatch();
                index++;
            }
            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("update tbls set serde_lib=? where tbl_id=?");
            ps.setString(1, LazySimpleSerDe.class.getName());
            ps.setLong(2, tblID);
            ps.executeUpdate();
            ps.close();
        } else {
            Map<String, Long> colNameMap = new HashMap<String, Long>();
            long maxColIndex = 0;

            ps = con.prepareStatement("select column_name, column_index from "
                    + "columns where tbl_id=? order by column_index asc");
            ps.setLong(1, tblID);

            ResultSet colSet = ps.executeQuery();
            while (colSet.next()) {
                maxColIndex = colSet.getLong(2);
                colNameMap.put(colSet.getString(1), maxColIndex);
            }

            colSet.close();
            ps.close();

            ps = con.prepareStatement(
                    "insert into columns(column_index, tbl_id, column_name, type_name, comment)"
                            + " values(?,?,?,?,?)");

            for (FieldSchema field : newCols) {
                if (colNameMap.containsKey(field.getName())) {
                    LOG.error("add column error, db=" + dbName + ", tbl=" + tblName);
                    throw new MetaException("column name conflict, conflict column name is " + field.getName());
                }

                ps.setLong(1, maxColIndex + 1);
                ps.setLong(2, tblID);
                ps.setString(3, field.getName().toLowerCase());
                ps.setString(4, field.getType());
                ps.setString(5, field.getComment());

                maxColIndex++;
                ps.addBatch();
            }

            ps.executeBatch();
            ps.close();
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeConnection(con);
    }
    return;
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

@Override
public void renameCols(String dbName, String tblName, RenameColDesc renameColDesc)
        throws InvalidOperationException, MetaException, InvalidObjectException {
    if (!MetaStoreUtils.validateName(renameColDesc.getNewName())) {
        throw new InvalidObjectException("new column name is not valid object " + renameColDesc.getNewName());
    }/* ww  w. jav a 2 s  . co  m*/

    Connection con = null;
    PreparedStatement ps = null;
    boolean success = false;

    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                + renameColDesc.getNewName() + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                + renameColDesc.getNewName() + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

        ps = con.prepareStatement("select tbl_id, tbl_type, tbl_format ,pri_part_key "
                + ", sub_part_key, serde_lib from tbls where db_name=? and tbl_name=?");

        ps.setString(1, dbName);
        ps.setString(2, tblName);

        String tblType = null;
        String serdeLib = null;
        String tblFormat = null;
        boolean isPriPart = false;
        boolean isSubPart = false;
        String priPartKey = null;
        String subPartKey = null;

        boolean isTblFind = false;
        long tblID = 0;

        ResultSet tblSet = ps.executeQuery();

        while (tblSet.next()) {
            isTblFind = true;
            tblID = tblSet.getLong(1);
            tblType = tblSet.getString(2);
            tblFormat = tblSet.getString(3);
            priPartKey = tblSet.getString(4);
            subPartKey = tblSet.getString(5);
            serdeLib = tblSet.getString(6);

            isPriPart = priPartKey != null;
            isSubPart = subPartKey != null;
        }

        tblSet.close();
        ps.close();

        if (!isTblFind) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("can not find table " + dbName + ":" + tblName);
        }

        if (tblFormat == null || tblFormat.isEmpty()) {
            tblFormat = "text";
        }

        if (tblType.equalsIgnoreCase("VITURAL_VIEW")) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("view can not rename a column");
        }

        if (tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                && !HiveConf.getBoolVar(hiveConf, ConfVars.ALTERSCHEMAACTIVATEEXTTABLE)) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("can not rename columns for a extenal table ");
        }

        if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE") && tblFormat.equalsIgnoreCase("text")
                && (!HiveConf.getBoolVar(hiveConf, ConfVars.ALTERSCHEMAACTIVATETXTTABLE))) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("can not rename columns for a text format table ");
        } else if (serdeLib.equals(ProtobufSerDe.class.getName())) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("can not rename columns for a pb table ");
        } else if ((isPriPart && renameColDesc.getOldName().equalsIgnoreCase(priPartKey))
                || (isSubPart && renameColDesc.getOldName().equalsIgnoreCase(subPartKey))) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("partition key can not be altered  ");
        }

        String modifyUser = renameColDesc.getUser();
        Map<String, String> tblParamMap = new HashMap<String, String>();
        ps = con.prepareStatement(
                "select param_key, param_value from table_params where tbl_id=? and param_type='TBL'");
        ps.setLong(1, tblID);
        ResultSet paramSet = ps.executeQuery();
        while (paramSet.next()) {
            tblParamMap.put(paramSet.getString(1), paramSet.getString(2));
        }
        paramSet.close();
        ps.close();
        boolean containTime = false;
        boolean contailUser = false;
        if (tblParamMap.containsKey("last_modified_time"))
            containTime = true;
        if (tblParamMap.containsKey("last_modified_by"))
            contailUser = true;

        if (containTime && contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();
            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (!containTime && !contailUser) {
            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (containTime && !contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");

            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        }

        List<FieldSchema> oldCols = new ArrayList<FieldSchema>();

        String oldName = renameColDesc.getOldName();
        String newName = renameColDesc.getNewName();
        String type = renameColDesc.getType();
        String comment = renameColDesc.getComment();

        boolean colFind = false;

        Map<String, Long> colNameMap = new HashMap<String, Long>();

        long maxColIndex = 0;

        ps = con.prepareStatement("select column_index, column_name, type_name from "
                + "columns where tbl_id=? order by column_index asc");

        ps.setLong(1, tblID);

        ResultSet colSet = ps.executeQuery();

        while (colSet.next()) {
            FieldSchema field = new FieldSchema();
            field.setName(colSet.getString(2));
            field.setType(colSet.getString(3));
            oldCols.add(field);

            maxColIndex = colSet.getLong(1);
            colNameMap.put(colSet.getString(2), maxColIndex);
        }

        colSet.close();
        ps.close();

        Iterator<FieldSchema> iterOldCols = oldCols.iterator();
        while (iterOldCols.hasNext()) {
            FieldSchema col = iterOldCols.next();
            String oldColName = col.getName();

            if (oldColName.equalsIgnoreCase(newName) && !oldColName.equalsIgnoreCase(oldName)) {
                LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                        + renameColDesc.getNewName());
                throw new MetaException("column " + newName + " is exists");
            }

            if (oldColName.equalsIgnoreCase(oldName)) {
                if (!checktype(col, type)) {
                    LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                            + renameColDesc.getNewName());
                    throw new MetaException("column type " + col.getType() + " can not convert to " + type);
                }

                colFind = true;
            }
        }

        if (!colFind) {
            LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                    + renameColDesc.getNewName());
            throw new MetaException("can not find column " + oldName);
        }

        if (type == null) {
            if (comment == null) {
                ps = con.prepareStatement(
                        "update columns set column_name=? " + " where tbl_id=? and column_name=?");
                ps.setString(1, newName.toLowerCase());
                ps.setLong(2, tblID);
                ps.setString(3, oldName);

                ps.executeUpdate();
                ps.close();
            } else {
                ps = con.prepareStatement(
                        "update columns set column_name=?, comment=? " + " where tbl_id=? and column_name=?");
                ps.setString(1, newName.toLowerCase());
                ps.setString(2, comment);
                ps.setLong(3, tblID);
                ps.setString(4, oldName);

                ps.executeUpdate();
                ps.close();
            }
        } else {
            if (comment == null) {
                ps = con.prepareStatement(
                        "update columns set column_name=?, type_name=? " + " where tbl_id=? and column_name=?");
                ps.setString(1, newName);
                ps.setString(2, type);
                ps.setLong(3, tblID);
                ps.setString(4, oldName);

                ps.executeUpdate();
                ps.close();
            } else {
                ps = con.prepareStatement("update columns set column_name=?, type_name=?, comment=? "
                        + " where tbl_id=? and column_name=?");
                ps.setString(1, newName);
                ps.setString(2, type);
                ps.setString(3, comment);
                ps.setLong(4, tblID);
                ps.setString(5, oldName);

                ps.executeUpdate();
                ps.close();
            }
        }

        con.commit();
        success = true;
    } catch (SQLException ex) {
        LOG.error("rename column error, db=" + dbName + ", tbl=" + tblName + ", newname="
                + renameColDesc.getNewName() + ", msg=" + ex.getMessage());
        ex.printStackTrace();
        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeConnection(con);
    }
    return;
}

From source file:org.apache.hadoop.hive.metastore.MyXid.java

@Override
public void replaceCols(String dbName, String tblName, String modifyUser, List<FieldSchema> newCols)
        throws InvalidOperationException, MetaException {
    Connection con = null;// w  w  w . j  a va  2  s. co m
    PreparedStatement ps = null;
    boolean success = false;
    dbName = dbName.toLowerCase();
    tblName = tblName.toLowerCase();

    try {
        con = getSegmentConnection(dbName);
    } catch (MetaStoreConnectException e1) {
        LOG.error("replace column error, db=" + dbName + ", tbl=" + tblName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    } catch (SQLException e1) {
        LOG.error("replace column error, db=" + dbName + ", tbl=" + tblName + ", msg=" + e1.getMessage());
        throw new MetaException(e1.getMessage());
    }

    try {
        con.setAutoCommit(false);
        con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

        ps = con.prepareStatement("select tbl_id, tbl_type, tbl_format, pri_part_type, serde_lib"
                + " from tbls where db_name=? and tbl_name=?");

        ps.setString(1, dbName);
        ps.setString(2, tblName);

        String tblType = null;
        String serdeLib = null;
        String tblFormat = null;
        String priPartType = null;
        boolean isPriPart = false;
        boolean isTblFind = false;
        long tblID = 0;

        ResultSet tblSet = ps.executeQuery();
        while (tblSet.next()) {
            isTblFind = true;
            tblID = tblSet.getLong(1);
            tblType = tblSet.getString(2);
            tblFormat = tblSet.getString(3);
            priPartType = tblSet.getString(4);
            serdeLib = tblSet.getString(5);

            isPriPart = priPartType != null;
        }

        tblSet.close();
        ps.close();

        if (!isTblFind) {
            throw new MetaException("can not find table " + dbName + ":" + tblName);
        }

        if (tblType.equalsIgnoreCase("VITURAL_VIEW")) {
            throw new MetaException("view can not replace column ");
        }

        if (!HiveConf.getBoolVar(hiveConf, ConfVars.ALTERSCHEMAACTIVATEREPLACE)) {
            throw new MetaException("replace columns is not supported rightnow");
        }

        if (tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                && !HiveConf.getBoolVar(hiveConf, ConfVars.ALTERSCHEMAACTIVATEEXTTABLE)) {
            throw new MetaException("can not replace columns for a extenal table ");
        }

        if (!tblType.equalsIgnoreCase("EXTERNAL_TABLE")
                && (tblFormat != null && tblFormat.equalsIgnoreCase("text"))
                && (!HiveConf.getBoolVar(hiveConf, ConfVars.ALTERSCHEMAACTIVATETXTTABLE))) {
            throw new MetaException("can not replace columns for a text format table ");
        }

        if (!serdeLib.equals(MetadataTypedColumnsetSerDe.class.getName())
                && !serdeLib.equals(LazySimpleSerDe.class.getName())
                && !serdeLib.equals(ColumnarSerDe.class.getName())
                && !serdeLib.equals(DynamicSerDe.class.getName())
                && !serdeLib.equals(ProtobufSerDe.class.getName())) {
            throw new MetaException(
                    "Replace columns is not supported for this table. SerDe may be incompatible.");
        }

        if (serdeLib.equals("org.apache.hadoop.hive.serde.thrift.columnsetSerDe")) {
            ps = con.prepareStatement("update tbls set serde_lib=? where tbl_id=?");
            ps.setString(1, LazySimpleSerDe.class.getName());
            ps.setLong(2, tblID);
            ps.executeUpdate();
        }

        Map<String, String> tblParamMap = new HashMap<String, String>();
        ps = con.prepareStatement(
                "select param_key, param_value from table_params where tbl_id=? and param_type='TBL'");
        ps.setLong(1, tblID);
        ResultSet paramSet = ps.executeQuery();
        while (paramSet.next()) {
            tblParamMap.put(paramSet.getString(1), paramSet.getString(2));
        }
        paramSet.close();
        ps.close();
        boolean containTime = false;
        boolean contailUser = false;
        if (tblParamMap.containsKey("last_modified_time"))
            containTime = true;
        if (tblParamMap.containsKey("last_modified_by"))
            contailUser = true;

        if (containTime && contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();
            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (!containTime && !contailUser) {
            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else if (containTime && !contailUser) {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");
            ps.setString(1, String.valueOf(System.currentTimeMillis() / 1000));
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_time");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");

            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_by");
            ps.setString(4, modifyUser);

            ps.addBatch();

            ps.executeBatch();
            ps.close();
        } else {
            ps = con.prepareStatement(
                    "update table_params set param_value=? where tbl_id=? and param_type='TBL' and param_key=?");

            ps.setString(1, modifyUser);
            ps.setLong(2, tblID);
            ps.setString(3, "last_modified_by");
            ps.addBatch();

            ps.executeBatch();
            ps.close();

            ps = con.prepareStatement("insert into table_params(tbl_id, param_type, param_key, param_value) "
                    + " values(?,?,?,?)");
            ps.setLong(1, tblID);
            ps.setString(2, "TBL");
            ps.setString(3, "last_modified_time");
            ps.setString(4, String.valueOf(System.currentTimeMillis() / 1000));
            ps.addBatch();

            ps.executeBatch();
            ps.close();
        }

        ps = con.prepareStatement("delete from columns where tbl_id=?");
        ps.setLong(1, tblID);
        ps.executeUpdate();
        ps.close();

        ps = con.prepareStatement("insert into columns(column_index, tbl_id, column_name "
                + ",type_name, comment) values(?,?,?,?,?)");
        long index = 0;

        for (FieldSchema field : newCols) {
            ps.setLong(1, index);
            ps.setLong(2, tblID);
            ps.setString(3, field.getName().toLowerCase());
            ps.setString(4, field.getType());
            ps.setString(5, field.getComment());

            ps.addBatch();
            index++;
        }

        ps.executeBatch();
        ps.close();

        con.commit();
        success = true;
    } catch (SQLException ex) {
        ex.printStackTrace();
        LOG.error("replace column error, db=" + dbName + ", tbl=" + tblName + ", msg=" + ex.getMessage());
        throw new MetaException(ex.getMessage());
    } finally {
        if (!success) {
            try {
                con.rollback();
            } catch (SQLException e) {
            }
        }

        closeStatement(ps);
        closeConnection(con);
    }
    return;
}