in phoenix-core-client/src/main/java/org/apache/phoenix/schema/MetaDataClient.java [6008:6228]
private boolean evaluateStmtProperties(MetaProperties metaProperties,
MetaPropertiesEvaluated metaPropertiesEvaluated,
PTable table, String schemaName, String tableName,
MutableBoolean areWeIntroducingTTLAtThisLevel)
throws SQLException {
boolean changingPhoenixTableProperty = false;
if (metaProperties.getImmutableRowsProp() != null) {
if (metaProperties.getImmutableRowsProp().booleanValue() != table.isImmutableRows()) {
if (table.getImmutableStorageScheme() != ImmutableStorageScheme.ONE_CELL_PER_COLUMN) {
throw new SQLExceptionInfo.Builder(SQLExceptionCode.CANNOT_ALTER_IMMUTABLE_ROWS_PROPERTY)
.setSchemaName(schemaName).setTableName(tableName).build().buildException();
}
metaPropertiesEvaluated.setIsImmutableRows(metaProperties.getImmutableRowsProp());
changingPhoenixTableProperty = true;
}
}
if (metaProperties.getImmutableRowsProp() != null && table.getType() != INDEX) {
if (metaProperties.getImmutableRowsProp().booleanValue() != table.isImmutableRows()) {
metaPropertiesEvaluated.setIsImmutableRows(metaProperties.getImmutableRowsProp());
changingPhoenixTableProperty = true;
}
}
if (metaProperties.getMultiTenantProp() != null) {
if (metaProperties.getMultiTenantProp().booleanValue() != table.isMultiTenant()) {
metaPropertiesEvaluated.setMultiTenant(metaProperties.getMultiTenantProp());
changingPhoenixTableProperty = true;
}
}
if (metaProperties.getDisableWALProp() != null) {
if (metaProperties.getDisableWALProp().booleanValue() != table.isWALDisabled()) {
metaPropertiesEvaluated.setDisableWAL(metaProperties.getDisableWALProp());
changingPhoenixTableProperty = true;
}
}
if (metaProperties.getUpdateCacheFrequencyProp() != null) {
// See PHOENIX-4891
if (table.getType() == PTableType.INDEX) {
throw new SQLExceptionInfo.Builder(
SQLExceptionCode.CANNOT_SET_OR_ALTER_UPDATE_CACHE_FREQ_FOR_INDEX)
.build()
.buildException();
}
if (metaProperties.getUpdateCacheFrequencyProp().longValue() != table.getUpdateCacheFrequency()) {
metaPropertiesEvaluated.setUpdateCacheFrequency(metaProperties.getUpdateCacheFrequencyProp());
changingPhoenixTableProperty = true;
}
}
if (metaProperties.getAppendOnlySchemaProp() !=null) {
if (metaProperties.getAppendOnlySchemaProp() != table.isAppendOnlySchema()) {
metaPropertiesEvaluated.setAppendOnlySchema(metaProperties.getAppendOnlySchemaProp());
changingPhoenixTableProperty = true;
}
}
if (metaProperties.getColumnEncodedBytesProp() != null) {
if (metaProperties.getColumnEncodedBytesProp() != table.getEncodingScheme()) {
// Transform is needed, so we will not be setting it here. We set the boolean to increment sequence num
changingPhoenixTableProperty = true;
}
}
if (metaProperties.getImmutableStorageSchemeProp()!=null) {
if (metaProperties.getImmutableStorageSchemeProp() != table.getImmutableStorageScheme()) {
// Transform is needed, so we will not be setting it here. We set the boolean to increment sequence num
changingPhoenixTableProperty = true;
}
}
// Get immutableStorageScheme and encoding and check compatibility
ImmutableStorageScheme immutableStorageScheme = table.getImmutableStorageScheme();
if (metaProperties.getImmutableStorageSchemeProp() != null) {
immutableStorageScheme = metaProperties.getImmutableStorageSchemeProp();
}
QualifierEncodingScheme encodingScheme = table.getEncodingScheme();
if (metaProperties.getColumnEncodedBytesProp() != null) {
encodingScheme = metaProperties.getColumnEncodedBytesProp();
}
if (immutableStorageScheme == SINGLE_CELL_ARRAY_WITH_OFFSETS && encodingScheme == NON_ENCODED_QUALIFIERS) {
// encoding scheme is set as non-encoded on purpose, so we should fail
throw new SQLExceptionInfo.Builder(SQLExceptionCode.INVALID_IMMUTABLE_STORAGE_SCHEME_AND_COLUMN_QUALIFIER_BYTES)
.setSchemaName(schemaName).setTableName(tableName).build().buildException();
}
if (metaProperties.getGuidePostWidth() == null || metaProperties.getGuidePostWidth() >= 0) {
metaPropertiesEvaluated.setGuidePostWidth(metaProperties.getGuidePostWidth());
changingPhoenixTableProperty = true;
}
if (metaProperties.getStoreNullsProp() != null) {
if (metaProperties.getStoreNullsProp().booleanValue() != table.getStoreNulls()) {
metaPropertiesEvaluated.setStoreNulls(metaProperties.getStoreNullsProp());
changingPhoenixTableProperty = true;
}
}
if (metaProperties.getUseStatsForParallelizationProp() != null
&& (table.useStatsForParallelization() == null
|| (metaProperties.getUseStatsForParallelizationProp().booleanValue() != table
.useStatsForParallelization()))) {
metaPropertiesEvaluated.setUseStatsForParallelization(metaProperties.getUseStatsForParallelizationProp());
changingPhoenixTableProperty = true;
}
if (metaProperties.getIsTransactionalProp() != null) {
if (metaProperties.getIsTransactionalProp().booleanValue() != table.isTransactional()) {
metaPropertiesEvaluated.setIsTransactional(metaProperties.getIsTransactionalProp());
// Note: Going from transactional to non transactional used to be not supportable because
// it would have required rewriting the cell timestamps and doing a major compaction to
// remove Tephra specific delete markers. After PHOENIX-6627, Tephra has been removed.
// For now we continue to reject the request.
if (!metaPropertiesEvaluated.getIsTransactional()) {
throw new SQLExceptionInfo.Builder(SQLExceptionCode.TX_MAY_NOT_SWITCH_TO_NON_TX)
.setSchemaName(schemaName).setTableName(tableName).build().buildException();
}
// cannot create a transactional table if transactions are disabled
boolean transactionsEnabled = connection.getQueryServices().getProps().getBoolean(
QueryServices.TRANSACTIONS_ENABLED,
QueryServicesOptions.DEFAULT_TRANSACTIONS_ENABLED);
if (!transactionsEnabled) {
throw new SQLExceptionInfo.Builder(SQLExceptionCode.CANNOT_ALTER_TO_BE_TXN_IF_TXNS_DISABLED)
.setSchemaName(schemaName).setTableName(tableName).build().buildException();
}
// cannot make a table transactional if it has a row timestamp column
if (SchemaUtil.hasRowTimestampColumn(table)) {
throw new SQLExceptionInfo.Builder(SQLExceptionCode.CANNOT_ALTER_TO_BE_TXN_WITH_ROW_TIMESTAMP)
.setSchemaName(schemaName).setTableName(tableName)
.build().buildException();
}
TransactionFactory.Provider provider = metaProperties.getTransactionProviderProp();
if (provider == null) {
provider = (Provider)
TableProperty.TRANSACTION_PROVIDER.getValue(
connection.getQueryServices().getProps().get(
QueryServices.DEFAULT_TRANSACTION_PROVIDER_ATTRIB,
QueryServicesOptions.DEFAULT_TRANSACTION_PROVIDER));
}
metaPropertiesEvaluated.setTransactionProvider(provider);
if (provider.getTransactionProvider().isUnsupported(PhoenixTransactionProvider.Feature.ALTER_NONTX_TO_TX)) {
throw new SQLExceptionInfo.Builder(SQLExceptionCode.CANNOT_ALTER_TABLE_FROM_NON_TXN_TO_TXNL)
.setMessage(provider.name() + ". ")
.setSchemaName(schemaName)
.setTableName(tableName)
.build().buildException();
}
changingPhoenixTableProperty = true;
metaProperties.setNonTxToTx(true);
}
}
if (metaProperties.getTTL() != null) {
if (table.getType() == PTableType.INDEX) {
throw new SQLExceptionInfo.Builder(
SQLExceptionCode.CANNOT_SET_OR_ALTER_PROPERTY_FOR_INDEX)
.build()
.buildException();
}
if (!isViewTTLEnabled() && table.getType() == PTableType.VIEW) {
throw new SQLExceptionInfo.Builder(
SQLExceptionCode.VIEW_TTL_NOT_ENABLED)
.build()
.buildException();
}
if (table.getType() != PTableType.TABLE && (table.getType() != PTableType.VIEW ||
table.getViewType() != UPDATABLE)) {
throw new SQLExceptionInfo.Builder(
SQLExceptionCode.TTL_SUPPORTED_FOR_TABLES_AND_VIEWS_ONLY)
.build()
.buildException();
}
if (metaProperties.getTTL() != table.getTTLExpression()) {
TTLExpression newTTL = metaProperties.getTTL();
newTTL.validateTTLOnAlter(connection, table);
metaPropertiesEvaluated.setTTL(metaProperties.getTTL());
changingPhoenixTableProperty = true;
}
//Updating Introducing TTL variable to true so that we will check if TTL is already
//defined in hierarchy or not.
areWeIntroducingTTLAtThisLevel.setTrue();
}
if (metaProperties.isChangeDetectionEnabled() != null) {
verifyChangeDetectionTableType(table.getType(),
metaProperties.isChangeDetectionEnabled());
if (!metaProperties.isChangeDetectionEnabled().equals(table.isChangeDetectionEnabled())) {
metaPropertiesEvaluated.setChangeDetectionEnabled(metaProperties.isChangeDetectionEnabled());
changingPhoenixTableProperty = true;
}
}
if (!Strings.isNullOrEmpty(metaProperties.getPhysicalTableNameProp())) {
if (!metaProperties.getPhysicalTableNameProp().equals(table.getPhysicalName(true))) {
metaPropertiesEvaluated.setPhysicalTableName(metaProperties.getPhysicalTableNameProp());
changingPhoenixTableProperty = true;
}
}
if (!Strings.isNullOrEmpty(metaProperties.getSchemaVersion())) {
if (!metaProperties.getSchemaVersion().equals(table.getSchemaVersion())) {
metaPropertiesEvaluated.setSchemaVersion(metaProperties.getSchemaVersion());
changingPhoenixTableProperty = true;
}
}
if (!Strings.isNullOrEmpty(metaProperties.getStreamingTopicName())) {
if (!metaProperties.getStreamingTopicName().equals(table.getStreamingTopicName())) {
metaPropertiesEvaluated.
setStreamingTopicName(metaProperties.getStreamingTopicName());
changingPhoenixTableProperty = true;
}
}
return changingPhoenixTableProperty;
}