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) {

Reply via email to