diff --git a/fe/src/main/java/com/cloudera/impala/analysis/AlterTableSetTblProperties.java b/fe/src/main/java/com/cloudera/impala/analysis/AlterTableSetTblProperties.java index 0c952eaec..2ee62b5af 100644 --- a/fe/src/main/java/com/cloudera/impala/analysis/AlterTableSetTblProperties.java +++ b/fe/src/main/java/com/cloudera/impala/analysis/AlterTableSetTblProperties.java @@ -25,6 +25,7 @@ import com.cloudera.impala.common.AnalysisException; import com.cloudera.impala.thrift.*; import com.cloudera.impala.util.AvroSchemaParser; import com.cloudera.impala.util.AvroSchemaUtils; +import com.cloudera.impala.util.MetaStoreUtil; import com.google.common.base.Preconditions; import com.google.common.base.Strings; @@ -69,6 +70,8 @@ public class AlterTableSetTblProperties extends AlterTableSetStmt { public void analyze(Analyzer analyzer) throws AnalysisException { super.analyze(analyzer); + MetaStoreUtil.checkShortPropertyMap("Property", tblProperties_); + // Check avro schema when it is set in avro.schema.url or avro.schema.literal to // avoid potential metadata corruption (see IMPALA-2042). // If both properties are set then only check avro.schema.literal and ignore diff --git a/fe/src/main/java/com/cloudera/impala/analysis/CreateTableStmt.java b/fe/src/main/java/com/cloudera/impala/analysis/CreateTableStmt.java index 274584dc4..1bdd6244b 100644 --- a/fe/src/main/java/com/cloudera/impala/analysis/CreateTableStmt.java +++ b/fe/src/main/java/com/cloudera/impala/analysis/CreateTableStmt.java @@ -36,6 +36,7 @@ import com.cloudera.impala.thrift.TTableName; import com.cloudera.impala.util.AvroSchemaConverter; import com.cloudera.impala.util.AvroSchemaParser; import com.cloudera.impala.util.AvroSchemaUtils; +import com.cloudera.impala.util.MetaStoreUtil; import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.collect.Lists; @@ -191,6 +192,9 @@ public class CreateTableStmt extends StatementBase { tableName_.analyze(); owner_ = analyzer.getUser().getName(); + MetaStoreUtil.checkShortPropertyMap("Property", tblProperties_); + MetaStoreUtil.checkShortPropertyMap("Serde property", serdeProperties_); + if (analyzer.dbContainsTable(tableName_.getDb(), tableName_.getTbl(), Privilege.CREATE) && !ifNotExists_) { throw new AnalysisException(Analyzer.TBL_ALREADY_EXISTS_ERROR_MSG + tableName_); diff --git a/fe/src/main/java/com/cloudera/impala/catalog/PartitionStatsUtil.java b/fe/src/main/java/com/cloudera/impala/catalog/PartitionStatsUtil.java index d4f2ef7de..17b8371aa 100644 --- a/fe/src/main/java/com/cloudera/impala/catalog/PartitionStatsUtil.java +++ b/fe/src/main/java/com/cloudera/impala/catalog/PartitionStatsUtil.java @@ -18,6 +18,7 @@ import com.cloudera.impala.thrift.TPartitionStats; import com.cloudera.impala.common.JniUtil; import com.cloudera.impala.common.ImpalaException; import com.cloudera.impala.common.ImpalaRuntimeException; +import com.cloudera.impala.util.MetaStoreUtil; import java.util.Iterator; import java.util.List; @@ -43,9 +44,6 @@ public class PartitionStatsUtil { public static final String INTERMEDIATE_STATS_CHUNK_PREFIX = "impala_intermediate_stats_chunk"; - // HMS-imposed maximum length of a string parameter for a partition. - private static final int HMS_MAX_CHUNKLEN = 4000; - private final static Logger LOG = LoggerFactory.getLogger(PartitionStatsUtil.class); /** @@ -103,9 +101,10 @@ public class PartitionStatsUtil { TSerializer serializer = new TSerializer(protocolFactory); byte[] serialized = serializer.serialize(partStats); String base64 = new String(Base64.encodeBase64(serialized)); - List chunks = chunkStringForHms(base64, HMS_MAX_CHUNKLEN); - partition.putToParameters(INTERMEDIATE_STATS_NUM_CHUNKS, - Integer.toString(chunks.size())); + List chunks = + chunkStringForHms(base64, MetaStoreUtil.MAX_PROPERTY_VALUE_LENGTH); + partition.putToParameters( + INTERMEDIATE_STATS_NUM_CHUNKS, Integer.toString(chunks.size())); for (int i = 0; i < chunks.size(); ++i) { partition.putToParameters(INTERMEDIATE_STATS_CHUNK_PREFIX + i, chunks.get(i)); } diff --git a/fe/src/main/java/com/cloudera/impala/util/MetaStoreUtil.java b/fe/src/main/java/com/cloudera/impala/util/MetaStoreUtil.java index 56fc69916..511deb6a5 100644 --- a/fe/src/main/java/com/cloudera/impala/util/MetaStoreUtil.java +++ b/fe/src/main/java/com/cloudera/impala/util/MetaStoreUtil.java @@ -15,6 +15,7 @@ package com.cloudera.impala.util; import java.util.List; +import java.util.Map; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.metastore.HiveMetaStoreClient; @@ -24,6 +25,7 @@ import org.apache.log4j.Logger; import org.apache.thrift.TException; import com.cloudera.impala.catalog.HdfsTable; +import com.cloudera.impala.common.AnalysisException; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; @@ -42,6 +44,12 @@ public class MetaStoreUtil { // Maximum length of the string representation of a type that the HMS can store. public static final int MAX_TYPE_NAME_LENGTH = 4000; + // The longest strings Hive accepts for [serde] property keys. + public static final int MAX_PROPERTY_KEY_LENGTH = 256; + + // The longest strings Hive accepts for [serde] property values. + public static final int MAX_PROPERTY_VALUE_LENGTH = 4000; + // The default maximum number of partitions to fetch from the Hive metastore in one // RPC. private static final short DEFAULT_MAX_PARTITIONS_PER_RPC = 1000; @@ -131,4 +139,31 @@ public class MetaStoreUtil { } return fetchedPartitions; } + + /** + * Checks that a given 'property' is short enough for HMS to handle. If not, throws an + * 'AnalysisException' with 'name' as its prefix. + */ + public static void checkShortProperty(String name, String property, int length) + throws AnalysisException { + if (property.length() > length) { + throw new AnalysisException( + name + " length must be <= " + length + ": " + property.length()); + } + } + + /** + * Checks that each key and value in a proprty map is short enough for HMS to handle. If + * not, An 'AnalysisException' is thrown with 'mapName' as its prefix. + */ + public static void checkShortPropertyMap( + String mapName, Map propertyMap) throws AnalysisException { + if (null != propertyMap) { + for (Map.Entry property : propertyMap.entrySet()) { + checkShortProperty(mapName + " key", property.getKey(), MAX_PROPERTY_KEY_LENGTH); + checkShortProperty( + mapName + " value", property.getValue(), MAX_PROPERTY_VALUE_LENGTH); + } + } + } } diff --git a/fe/src/test/java/com/cloudera/impala/analysis/AnalyzeDDLTest.java b/fe/src/test/java/com/cloudera/impala/analysis/AnalyzeDDLTest.java index 921a99d4f..5eb16e0d0 100644 --- a/fe/src/test/java/com/cloudera/impala/analysis/AnalyzeDDLTest.java +++ b/fe/src/test/java/com/cloudera/impala/analysis/AnalyzeDDLTest.java @@ -33,6 +33,7 @@ import org.junit.Test; import com.cloudera.impala.catalog.ArrayType; import com.cloudera.impala.catalog.Catalog; import com.cloudera.impala.catalog.CatalogException; +import com.cloudera.impala.analysis.CreateTableStmt; import com.cloudera.impala.catalog.DataSource; import com.cloudera.impala.catalog.DataSourceTable; import com.cloudera.impala.catalog.PrimitiveType; @@ -344,6 +345,55 @@ public class AnalyzeDDLTest extends AnalyzerTest { "set tblproperties('a'='1')"); AnalyzesOk("alter table functional.alltypes PARTITION (year=2010, month=11) " + "set serdeproperties ('a'='2')"); + + { + // Check that long_properties fail at the analysis layer + String long_property_key = ""; + for (int i = 0; i < MetaStoreUtil.MAX_PROPERTY_KEY_LENGTH; ++i) { + long_property_key += 'k'; + } + String long_property_value = ""; + for (int i = 0; i < MetaStoreUtil.MAX_PROPERTY_VALUE_LENGTH; ++i) { + long_property_value += 'v'; + } + + // At this point long_property_{key_value} are actually not quite long enough to + // cause analysis to fail. + + AnalyzesOk("alter table functional.alltypes " + + "set serdeproperties ('" + long_property_key + "'='" + long_property_value + + "') "); + + AnalyzesOk("alter table functional.alltypes " + + "set tblproperties ('" + long_property_key + "'='" + long_property_value + + "') "); + + long_property_key += 'X'; + long_property_value += 'X'; + // Now that long_property_{key,value} are one character longer, they are too long + // for the analyzer. + + AnalysisError("alter table functional.alltypes set " + + "tblproperties ('" + long_property_key + "'='value')", + "Property key length must be <= " + MetaStoreUtil.MAX_PROPERTY_KEY_LENGTH + ": " + + (MetaStoreUtil.MAX_PROPERTY_KEY_LENGTH + 1)); + + AnalysisError("alter table functional.alltypes set " + + "tblproperties ('key'='" + long_property_value + "')", + "Property value length must be <= " + MetaStoreUtil.MAX_PROPERTY_VALUE_LENGTH + + ": " + (MetaStoreUtil.MAX_PROPERTY_VALUE_LENGTH + 1)); + + AnalysisError("alter table functional.alltypes set " + + "serdeproperties ('" + long_property_key + "'='value')", + "Property key length must be <= " + MetaStoreUtil.MAX_PROPERTY_KEY_LENGTH + ": " + + (MetaStoreUtil.MAX_PROPERTY_KEY_LENGTH + 1)); + + AnalysisError("alter table functional.alltypes set " + + "serdeproperties ('key'='" + long_property_value + "')", + "Property value length must be <= " + MetaStoreUtil.MAX_PROPERTY_VALUE_LENGTH + + ": " + (MetaStoreUtil.MAX_PROPERTY_VALUE_LENGTH + 1)); + } + // Arbitrary exprs as partition key values. Constant exprs are ok. AnalyzesOk("alter table functional.alltypes PARTITION " + "(year=cast(100*20+10 as INT), month=cast(2+9 as INT)) " + @@ -1178,6 +1228,52 @@ public class AnalyzeDDLTest extends AnalyzerTest { AnalyzesOk("create table functional.new_table (c char(250))"); AnalyzesOk("create table new_table (i int) PARTITIONED BY (c char(3))"); + { + // Check that long_properties fail at the analysis layer + String long_property_key = ""; + for (int i = 0; i < MetaStoreUtil.MAX_PROPERTY_KEY_LENGTH; ++i) { + long_property_key += 'k'; + } + String long_property_value = ""; + for (int i = 0; i < MetaStoreUtil.MAX_PROPERTY_VALUE_LENGTH; ++i) { + long_property_value += 'v'; + } + + // At this point long_property_{key_value} are actually not quite long enough to + // cause analysis to fail. + + AnalyzesOk("create table new_table (i int) " + + "with serdeproperties ('" + long_property_key + "'='" + long_property_value + + "') " + + "tblproperties ('" + long_property_key + "'='" + long_property_value + "')"); + + long_property_key += 'X'; + long_property_value += 'X'; + // Now that long_property_{key,value} are one character longer, they are too long + // for the analyzer. + + AnalysisError("create table new_table (i int) " + + "tblproperties ('" + long_property_key + "'='value')", + "Property key length must be <= " + MetaStoreUtil.MAX_PROPERTY_KEY_LENGTH + ": " + + (MetaStoreUtil.MAX_PROPERTY_KEY_LENGTH + 1)); + + AnalysisError("create table new_table (i int) " + + "tblproperties ('key'='" + long_property_value + "')", + "Property value length must be <= " + MetaStoreUtil.MAX_PROPERTY_VALUE_LENGTH + + ": " + (MetaStoreUtil.MAX_PROPERTY_VALUE_LENGTH + 1)); + + AnalysisError("create table new_table (i int) " + + "with serdeproperties ('" + long_property_key + "'='value')", + "Serde property key length must be <= " + MetaStoreUtil.MAX_PROPERTY_KEY_LENGTH + + ": " + (MetaStoreUtil.MAX_PROPERTY_KEY_LENGTH + 1)); + + AnalysisError("create table new_table (i int) " + + "with serdeproperties ('key'='" + long_property_value + "')", + "Serde property value length must be <= " + + MetaStoreUtil.MAX_PROPERTY_VALUE_LENGTH + ": " + + (MetaStoreUtil.MAX_PROPERTY_VALUE_LENGTH + 1)); + } + // Supported file formats. Exclude Avro since it is tested separately. String [] fileFormats = {"TEXTFILE", "SEQUENCEFILE", "PARQUET", "PARQUETFILE", "RCFILE"}; diff --git a/testdata/workloads/functional-query/queries/QueryTest/alter-table.test b/testdata/workloads/functional-query/queries/QueryTest/alter-table.test index 1e7a0e37a..1f9b4f048 100644 --- a/testdata/workloads/functional-query/queries/QueryTest/alter-table.test +++ b/testdata/workloads/functional-query/queries/QueryTest/alter-table.test @@ -750,4 +750,56 @@ show tables in alter_table_test_db2 like '%mv%' ---- RESULTS ---- TYPES STRING -==== \ No newline at end of file +==== +---- QUERY +# Test tblproperties and serdeproperties key and property value length +create database if not exists test_alter_property_length_db +==== +---- QUERY +show databases like 'test_alter_property_length_db' +---- RESULTS +'test_alter_property_length_db' +---- TYPES +STRING +==== +---- QUERY +drop table if exists test_alter_property_length_db.property_length +---- RESULTS +==== +---- QUERY +# alter with serde property lengths just within limits +create table test_alter_property_length_db.property_length (i int); +alter table test_alter_property_length_db.property_length +set serdeproperties( +'keykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeyk' += +'valuevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevalue' +) +---- RESULTS +==== +---- QUERY +# alter with property lengths just within limits +alter table test_alter_property_length_db.property_length +set tblproperties( +'keykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeyk' += +'valuevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevalue' +) +---- RESULTS +==== +---- QUERY +drop table if exists test_alter_property_length_db.property_length +---- RESULTS +==== +---- QUERY +# Need to switch databases before dropping +use default; +drop database if exists test_alter_property_length_db +---- RESULTS +==== +---- QUERY +show databases like 'test_alter_property_length_db' +---- RESULTS +---- TYPES +STRING +==== diff --git a/testdata/workloads/functional-query/queries/QueryTest/create.test b/testdata/workloads/functional-query/queries/QueryTest/create.test index 1aba953c1..01fb95050 100644 --- a/testdata/workloads/functional-query/queries/QueryTest/create.test +++ b/testdata/workloads/functional-query/queries/QueryTest/create.test @@ -895,4 +895,47 @@ drop database test_drop_restrict_db restrict ---- QUERY show databases like 'test_drop_restrict_db' ---- RESULTS -==== \ No newline at end of file +==== +---- QUERY +# Test tblproperties and serdeproperties key and property value length +create database if not exists test_property_length_db +==== +---- QUERY +show databases like 'test_property_length_db' +---- RESULTS +'test_property_length_db' +---- TYPES +STRING +==== +---- QUERY +drop table if exists test_property_length_db.short_properties +---- RESULTS +==== +---- QUERY +# create with tblproperty lengths just within limits +create table test_property_length_db.short_properties (i int) +with serdeproperties( +'keykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeyk' += +'valuevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevalue' +) tblproperties( +'keykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeyk' += +'valuevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevalue' +) +---- RESULTS +==== +---- QUERY +drop table if exists test_property_length_db.short_properties +---- RESULTS +==== +---- QUERY +# Need to switch databases before dropping +use default; +drop database if exists test_property_length_db +---- RESULTS +==== +---- QUERY +show databases like 'test_property_length_db' +---- RESULTS +==== diff --git a/tests/metadata/test_ddl.py b/tests/metadata/test_ddl.py index 2b835bb17..798a7566f 100644 --- a/tests/metadata/test_ddl.py +++ b/tests/metadata/test_ddl.py @@ -210,7 +210,7 @@ class TestDdlStatements(ImpalaTestSuite): @SkipIfS3.insert @pytest.mark.execute_serially - def test_create(self, vector): + def test_create_table(self, vector): vector.get_value('exec_option')['abort_on_error'] = False self._create_db('ddl_test_db', sync=True) self.run_test_case('QueryTest/create', vector, use_db='ddl_test_db',