This is an automated email from the ASF dual-hosted git repository. mblow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit e3e4220c18b5ddccecd2f9697360ae4011df2a1e Author: Michael Blow <[email protected]> AuthorDate: Thu Mar 4 17:41:07 2021 -0500 [ASTERIXDB-2841][*DB][STO] Prevent ^ as first character in dv first part Change-Id: I5e5aeea9ec38320f7f14877b1ee3bf904519ee66 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/10365 Reviewed-by: Ian Maxon <[email protected]> Tested-by: Jenkins <[email protected]> --- .../asterix/test/metadata/MetadataManagerTest.java | 19 ++++++++++++++++--- .../asterix/common/storage/ResourceReference.java | 2 +- .../org/apache/asterix/external/util/FeedUtils.java | 2 +- .../asterix/metadata/declared/MetadataProvider.java | 3 +++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataManagerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataManagerTest.java index 946d116..eed9ae1 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataManagerTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataManagerTest.java @@ -27,6 +27,7 @@ import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil; import org.apache.asterix.common.config.GlobalConfig; import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.common.metadata.DataverseName; +import org.apache.asterix.common.utils.StoragePathUtil; import org.apache.asterix.metadata.utils.MetadataConstants; import org.apache.asterix.test.common.TestExecutor; import org.apache.asterix.testframework.context.TestCaseContext; @@ -100,7 +101,14 @@ public class MetadataManagerTest { StringUtils.repeat(euml, MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2), StringUtils.repeat(auml, MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2), StringUtils.repeat(euml, - MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2)))); + MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2))), + // #4. single-part name containing continuation char + DataverseName + .createSinglePartName("abc" + StoragePathUtil.DATAVERSE_CONTINUATION_MARKER + "def"), + // #5. multi-part name containing continuation chars + DataverseName + .create(Arrays.asList("abc" + StoragePathUtil.DATAVERSE_CONTINUATION_MARKER + "def", + StoragePathUtil.DATAVERSE_CONTINUATION_MARKER + "def"))); for (DataverseName dvNameOk : dvNameOkList) { String sql = String.format("create dataverse %s;", dvNameOk); @@ -172,8 +180,13 @@ public class MetadataManagerTest { DataverseName.createSinglePartName("abc\u0000def"), // #2. leading whitespace DataverseName.createSinglePartName(" abcdef"), - // #2. file separator - DataverseName.createSinglePartName("abc" + File.separatorChar + "def")); + // #3. file separator + DataverseName.createSinglePartName("abc" + File.separatorChar + "def"), + // #4. single-part starting with ^ + DataverseName.createSinglePartName(StoragePathUtil.DATAVERSE_CONTINUATION_MARKER + "abcdef"), + // #5. multi-part w/ first part starting with ^ + DataverseName + .create(Arrays.asList(StoragePathUtil.DATAVERSE_CONTINUATION_MARKER + "abcdef", "abcdef"))); ErrorCode invalidNameErrCode = ErrorCode.INVALID_DATABASE_OBJECT_NAME; for (DataverseName dvNameOk : dvNameBadCharsList) { diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java index 0e78152..94a5f2a 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java @@ -60,7 +60,7 @@ public class ResourceReference { dataset = tokens[--offset]; List<String> dvParts = new ArrayList<>(); String dvPart = tokens[--offset]; - while (dvPart.charAt(0) == StoragePathUtil.DATAVERSE_CONTINUATION_MARKER) { + while (dvPart.codePointAt(0) == StoragePathUtil.DATAVERSE_CONTINUATION_MARKER) { dvParts.add(dvPart.substring(1)); dvPart = tokens[--offset]; } diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java index 7f3d911..0a91ae8 100644 --- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java +++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java @@ -89,7 +89,7 @@ public class FeedUtils { String relPathFile = StoragePathUtil.prepareDataverseComponentName(dataverseName, feedName); String storagePartitionPath = StoragePathUtil.prepareStoragePartitionPath(partition.getPartitionId()); // Note: feed adapter instances in a single node share the feed logger - // format: 'storage dir name'/partition_#/dataverse_part1[/ dataverse_part2[...]]/feed/node + // format: 'storage dir name'/partition_#/dataverse_part1[^dataverse_part2[...]]/feed/node File f = new File(storagePartitionPath + File.separator + relPathFile + File.separator + nodeName); return StoragePathUtil.getFileSplitForClusterPartition(partition, f.getPath()); } diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java index a534954..5f7fdea 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java @@ -1751,6 +1751,9 @@ public class MetadataProvider implements IMetadataProvider<DataSourceId, String> int totalLengthUTF8 = 0; for (String dvNamePart : dataverseName.getParts()) { validateDatabaseObjectNameImpl(dvNamePart, sourceLoc); + if (totalLengthUTF8 == 0 && StoragePathUtil.DATAVERSE_CONTINUATION_MARKER == dvNamePart.codePointAt(0)) { + throw new AsterixException(ErrorCode.INVALID_DATABASE_OBJECT_NAME, sourceLoc, dvNamePart); + } totalLengthUTF8 += dvNamePart.getBytes(StandardCharsets.UTF_8).length; } if (totalLengthUTF8 > MetadataConstants.DATAVERSE_NAME_TOTAL_LENGTH_LIMIT_UTF8) {
