private WriteType determineAlterTableWriteType(Table tab, AlterTableDesc desc, AlterTableTypes op) { boolean convertingToAcid = false; if(desc != null && desc.getProps() != null && Boolean.parseBoolean(desc.getProps().get(hive_metastoreConstants.TABLE_IS_TRANSACTIONAL))) { convertingToAcid = true; } if(!AcidUtils.isTransactionalTable(tab) && convertingToAcid) { //non-acid to transactional conversion (property itself) must be mutexed to prevent concurrent writes. // See HIVE-16688 for use cases. return WriteType.DDL_EXCLUSIVE; } return WriteEntity.determineAlterTableWriteType(op); } private void addInputsOutputsAlterTable(String tableName, Map<String, String> partSpec,
@Override public boolean mayNeedWriteId() { switch (getOp()) { case ADDPROPS: { return isExplicitStatsUpdate || AcidUtils.isToInsertOnlyTable(null, getProps()) || (AcidUtils.isTransactionalTable(getProps()) && !isFullAcidConversion); } case DROPPROPS: return isExplicitStatsUpdate; // The check for the following ones is performed before setting AlterTableDesc into the acid field. // These need write ID and stuff because they invalidate column stats. case RENAMECOLUMN: case RENAME: case REPLACECOLS: case ADDCOLS: case ALTERLOCATION: case UPDATECOLUMNS: return true; // RENAMEPARTITION is handled in RenamePartitionDesc default: return false; } }
private List<Task<?>> alterTableDropProps(AlterTableDesc alterTbl, Table tbl, Partition part, EnvironmentContext environmentContext) throws HiveException { if (StatsSetupConst.USER.equals(environmentContext.getProperties() .get(StatsSetupConst.STATS_GENERATED))) { // drop a stats parameter, which triggers recompute stats update automatically environmentContext.getProperties().remove(StatsSetupConst.DO_NOT_UPDATE_STATS); } List<Task<?>> result = null; if (part == null) { Set<String> removedSet = alterTbl.getProps().keySet(); boolean isFromMmTable = AcidUtils.isInsertOnlyTable(tbl.getParameters()), isRemoved = AcidUtils.isRemovedInsertOnlyTable(removedSet); if (isFromMmTable && isRemoved) { throw new HiveException("Cannot convert an ACID table to non-ACID"); } // Check if external table property being removed if (removedSet.contains("EXTERNAL") && tbl.getTableType() == TableType.EXTERNAL_TABLE) { tbl.setTableType(TableType.MANAGED_TABLE); } } Iterator<String> keyItr = alterTbl.getProps().keySet().iterator(); while (keyItr.hasNext()) { if (part != null) { part.getTPartition().getParameters().remove(keyItr.next()); } else { tbl.getTTable().getParameters().remove(keyItr.next()); } } return result; }
part.getTPartition().getParameters().putAll(alterTbl.getProps()); } else { boolean isFromMmTable = AcidUtils.isInsertOnlyTable(tbl.getParameters()); Boolean isToMmTable = AcidUtils.isToInsertOnlyTable(tbl, alterTbl.getProps()); if (isToMmTable != null) { if (!isFromMmTable && isToMmTable) { String externalProp = alterTbl.getProps().get("EXTERNAL"); if (externalProp != null) { if (Boolean.parseBoolean(externalProp) && tbl.getTableType() == TableType.MANAGED_TABLE) { tbl.getTTable().getParameters().putAll(alterTbl.getProps());
for (String currKey : desc.getProps().keySet()) { if (!tableParams.containsKey(currKey)) { String errorMsg =
for (String currKey : desc.getProps().keySet()) { if (!tableParams.containsKey(currKey)) { String errorMsg =
part.getTPartition().getParameters().putAll(alterTbl.getProps()); } else { tbl.getTTable().getParameters().putAll(alterTbl.getProps()); Iterator<String> keyItr = alterTbl.getProps().keySet().iterator(); if (StatsSetupConst.USER.equals(environmentContext.getProperties() .get(StatsSetupConst.STATS_GENERATED))) { sd.getSerdeInfo().getParameters().putAll(alterTbl.getProps()); } else if (alterTbl.getOp() == AlterTableDesc.AlterTableTypes.ADDSERDE) { StorageDescriptor sd = retrieveStorageDescriptor(tbl, part); if ((alterTbl.getProps() != null) && (alterTbl.getProps().size() > 0)) { sd.getSerdeInfo().getParameters().putAll(alterTbl.getProps());
} else if (alterTbl.getOp() == AlterTableDesc.AlterTableTypes.ADDSERDEPROPS) { StorageDescriptor sd = retrieveStorageDescriptor(tbl, part); sd.getSerdeInfo().getParameters().putAll(alterTbl.getProps()); } else if (alterTbl.getOp() == AlterTableDesc.AlterTableTypes.ADDSERDE) { StorageDescriptor sd = retrieveStorageDescriptor(tbl, part); if ((alterTbl.getProps() != null) && (alterTbl.getProps().size() > 0)) { sd.getSerdeInfo().getParameters().putAll(alterTbl.getProps());
for (String currKey : desc.getProps().keySet()) { if (!tableParams.containsKey(currKey)) { String errorMsg =
tbl.getTTable().getParameters().putAll(alterTbl.getProps()); } else if (alterTbl.getOp() == AlterTableDesc.AlterTableTypes.DROPPROPS) { Iterator<String> keyItr = alterTbl.getProps().keySet().iterator(); while (keyItr.hasNext()) { tbl.getTTable().getParameters().remove(keyItr.next()); sd.getSerdeInfo().getParameters().putAll(alterTbl.getProps()); } else if (alterTbl.getOp() == AlterTableDesc.AlterTableTypes.ADDSERDE) { StorageDescriptor sd = (part == null ? tbl.getTTable().getSd() : part.getTPartition().getSd()); String serdeName = alterTbl.getSerdeName(); sd.getSerdeInfo().setSerializationLib(serdeName); if ((alterTbl.getProps() != null) && (alterTbl.getProps().size() > 0)) { sd.getSerdeInfo().getParameters().putAll(alterTbl.getProps());
tbl.getTTable().getParameters().putAll(alterTbl.getProps()); } else if (alterTbl.getOp() == AlterTableDesc.AlterTableTypes.ADDSERDEPROPS) { if (part != null) { part.getTPartition().getSd().getSerdeInfo().getParameters().putAll( alterTbl.getProps()); } else { tbl.getTTable().getSd().getSerdeInfo().getParameters().putAll( alterTbl.getProps()); if (part != null) { part.getTPartition().getSd().getSerdeInfo().setSerializationLib(serdeName); if ((alterTbl.getProps() != null) && (alterTbl.getProps().size() > 0)) { part.getTPartition().getSd().getSerdeInfo().getParameters().putAll( alterTbl.getProps()); if ((alterTbl.getProps() != null) && (alterTbl.getProps().size() > 0)) { tbl.getTTable().getSd().getSerdeInfo().getParameters().putAll( alterTbl.getProps());