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 ce0141ac79fee0d9684b6aaee5fd3be8b90c066a
Author: Murtadha Hubail <[email protected]>
AuthorDate: Tue Mar 2 01:16:08 2021 +0300

    [NO ISSUE][MD] Limit metadata identifiers to 255 bytes
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    
    - Ensure the length of metadata identifiers doesn't exceed
      255 bytes.
    
    Change-Id: Icf92ad741d166f35d8f132ed4ba94d35a2d1aee1
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/10304
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Reviewed-by: Murtadha Hubail <[email protected]>
    Reviewed-by: Michael Blow <[email protected]>
    Contrib: Murtadha Hubail <[email protected]>
---
 .../asterix/test/metadata/MetadataManagerTest.java | 49 +++++++++++-----------
 .../metadata/declared/MetadataProvider.java        | 10 ++---
 .../asterix/metadata/utils/MetadataConstants.java  |  2 +-
 3 files changed, 31 insertions(+), 30 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 39e2ece..f8d6aeb 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
@@ -83,23 +83,23 @@ public class MetadataManagerTest {
                 Arrays.asList(
                         // #1. max single-part name
                         DataverseName.createSinglePartName(
-                                StringUtils.repeat('a', 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8)),
+                                StringUtils.repeat('a', 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8)),
                         // #2. max single-part name (2-byte characters)
                         DataverseName.createSinglePartName(
-                                StringUtils.repeat(auml, 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 / 2)),
+                                StringUtils.repeat(auml, 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2)),
                         // #3. 4 max parts
                         DataverseName.create(Arrays.asList(
-                                StringUtils.repeat('a', 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8),
-                                StringUtils.repeat('b', 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8),
-                                StringUtils.repeat('c', 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8),
-                                StringUtils.repeat('d', 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8))),
+                                StringUtils.repeat('a', 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8),
+                                StringUtils.repeat('b', 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8),
+                                StringUtils.repeat('c', 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8),
+                                StringUtils.repeat('d', 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8))),
                         // #3. 4 max parts (2-byte characters)
                         DataverseName.create(Arrays.asList(
-                                StringUtils.repeat(auml, 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 / 2),
-                                StringUtils.repeat(euml, 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 / 2),
-                                StringUtils.repeat(auml, 
MetadataConstants.DATAVERSE_NAME_PART_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),
+                                StringUtils.repeat(auml, 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2),
                                 StringUtils.repeat(euml,
-                                        
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 / 2))));
+                                        
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2))));
 
         for (DataverseName dvNameOk : dvNameOkList) {
             String sql = String.format("create dataverse %s;", dvNameOk);
@@ -114,31 +114,32 @@ public class MetadataManagerTest {
                 Arrays.asList(
                         // #1. single-part name exceeds part length limit
                         DataverseName.createSinglePartName(
-                                StringUtils.repeat('A', 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 + 1)),
+                                StringUtils.repeat('A', 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 + 1)),
                         // #2 single-part name exceeds part length limit 
(2-byte characters)
                         
DataverseName.createSinglePartName(StringUtils.repeat(iuml,
-                                
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 / 2 + 1)),
+                                
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2 + 1)),
                         // #3. 2-part name, 2nd part exceed part length limit
                         DataverseName.create(Arrays.asList("A",
-                                StringUtils.repeat('B', 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 + 1))),
+                                StringUtils.repeat('B', 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 + 1))),
                         // #4. 2-part name, 2nd part exceed part length limit 
(2-byte characters)
                         DataverseName.create(Arrays.asList("A",
                                 StringUtils.repeat(ouml,
-                                        
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 / 2 + 1))),
+                                        
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2 + 1))),
                         // #5. 5-part name, each part at the part length 
limit, total length limit is exceeded
                         DataverseName.create(Arrays.asList(
-                                StringUtils.repeat('A', 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8),
-                                StringUtils.repeat('B', 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8),
-                                StringUtils.repeat('C', 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8),
-                                StringUtils.repeat('D', 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8),
-                                StringUtils.repeat('E', 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8))),
+                                StringUtils.repeat('A', 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8),
+                                StringUtils.repeat('B', 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8),
+                                StringUtils.repeat('C', 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8),
+                                StringUtils.repeat('D', 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8),
+                                StringUtils.repeat('E', 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8))),
                         // #6. 5-part name, each part at the part length 
limit, total length limit is exceeded (2-byte characters)
                         DataverseName.create(Arrays.asList(
-                                StringUtils.repeat(iuml, 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 / 2),
-                                StringUtils.repeat(ouml, 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 / 2),
-                                StringUtils.repeat(iuml, 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 / 2),
-                                StringUtils.repeat(ouml, 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 / 2),
-                                StringUtils.repeat(iuml, 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 / 2))),
+                                StringUtils.repeat(iuml, 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2),
+                                StringUtils.repeat(ouml, 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2),
+                                StringUtils.repeat(iuml, 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2),
+                                StringUtils.repeat(ouml, 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2),
+                                StringUtils.repeat(iuml,
+                                        
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 / 2))),
                         // #7. Multi-part name, each part at the part length 
limit, total length limit is exceeded
                         DataverseName.create(
                                 
Collections.nCopies(MetadataConstants.DATAVERSE_NAME_TOTAL_LENGTH_LIMIT_UTF8 + 
1, "A")),
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 e2505b7..9b85601 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
@@ -1749,11 +1749,7 @@ public class MetadataProvider implements 
IMetadataProvider<DataSourceId, String>
         int totalLengthUTF8 = 0;
         for (String dvNamePart : dataverseName.getParts()) {
             validateDatabaseObjectNameImpl(dvNamePart, sourceLoc);
-            int lengthUTF8 = 
dvNamePart.getBytes(StandardCharsets.UTF_8).length;
-            if (lengthUTF8 > 
MetadataConstants.DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8) {
-                throw new 
AsterixException(ErrorCode.INVALID_DATABASE_OBJECT_NAME, sourceLoc, dvNamePart);
-            }
-            totalLengthUTF8 += lengthUTF8;
+            totalLengthUTF8 += 
dvNamePart.getBytes(StandardCharsets.UTF_8).length;
         }
         if (totalLengthUTF8 > 
MetadataConstants.DATAVERSE_NAME_TOTAL_LENGTH_LIMIT_UTF8) {
             throw new AsterixException(ErrorCode.INVALID_DATABASE_OBJECT_NAME, 
sourceLoc, dataverseName.toString());
@@ -1775,5 +1771,9 @@ public class MetadataProvider implements 
IMetadataProvider<DataSourceId, String>
         if (Character.isWhitespace(name.codePointAt(0))) {
             throw new AsterixException(ErrorCode.INVALID_DATABASE_OBJECT_NAME, 
sourceLoc, name);
         }
+        int lengthUTF8 = name.getBytes(StandardCharsets.UTF_8).length;
+        if (lengthUTF8 > 
MetadataConstants.METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8) {
+            throw new AsterixException(ErrorCode.INVALID_DATABASE_OBJECT_NAME, 
sourceLoc, name);
+        }
     }
 }
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataConstants.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataConstants.java
index 9b037d6..6bd52fa 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataConstants.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataConstants.java
@@ -26,7 +26,7 @@ import org.apache.asterix.common.metadata.DataverseName;
  */
 public class MetadataConstants {
 
-    public static final int DATAVERSE_NAME_PART_LENGTH_LIMIT_UTF8 = 255;
+    public static final int METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 = 255;
     public static final int DATAVERSE_NAME_TOTAL_LENGTH_LIMIT_UTF8 = 1023;
 
     // Name of the dataverse the metadata lives in.

Reply via email to