>From Ali Alsuliman <[email protected]>:

Ali Alsuliman has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17872 )


Change subject: [ASTERIXDB-3259][MTD] Validate database names
......................................................................

[ASTERIXDB-3259][MTD] Validate database names

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
Validate database names such that only letters, digits,
'_' and '-' characters are allowed.

- Ensure reserved database names are not allowed:
  'asterix', 'algebricks', 'Metadata'.
- Ensure database names don't start with 'partition_'.

- When database is used, validate that the dataverse is
only 1 part.

Change-Id: I27ac40e18f8ec63c09317cbc573abd6fc2b94e39
---
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
M 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
M 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataConstants.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
7 files changed, 129 insertions(+), 48 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/72/17872/1

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java
index 0a0685d..e7e1514 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java
@@ -20,6 +20,7 @@
 
 import static org.apache.asterix.common.utils.IdentifierUtil.dataset;
 import static org.apache.asterix.common.utils.IdentifierUtil.dataverse;
+import static org.apache.hyracks.api.exceptions.ErrorCode.TIMEOUT;

 import java.util.Arrays;
 import java.util.HashSet;
@@ -41,6 +42,7 @@
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.metadata.MetadataConstants;
 import org.apache.asterix.common.metadata.Namespace;
+import org.apache.asterix.common.utils.StorageConstants;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.statement.AnalyzeDropStatement;
 import org.apache.asterix.lang.common.statement.AnalyzeStatement;
@@ -68,6 +70,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Pair;
+import 
org.apache.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -100,7 +103,7 @@
             try {
                 clusterStateManager.waitForState(ClusterState.ACTIVE, 
maxWaitCycles, TimeUnit.SECONDS);
             } catch (HyracksDataException e) {
-                throw new AsterixException(e);
+                throw new AlgebricksException(e, TIMEOUT);
             } catch (InterruptedException e) {
                 if (LOGGER.isWarnEnabled()) {
                     LOGGER.warn("Thread interrupted while waiting for cluster 
to be " + ClusterState.ACTIVE);
@@ -197,7 +200,7 @@
             case CREATE_DATABASE: {
                 CreateDatabaseStatement dbCreateStmt = 
(CreateDatabaseStatement) stmt;
                 String dbName = dbCreateStmt.getDatabaseName().getValue();
-                invalidOperation = isSystemDatabase(dbName) || 
isDefaultDatabase(dbName);
+                invalidOperation = isSystemDatabase(dbName) || 
isDefaultDatabase(dbName) || isReservedDatabase(dbName);
                 if (invalidOperation) {
                     message = String.format("Cannot create database: %s", 
dbName);
                 }
@@ -457,4 +460,11 @@
     protected static boolean isDefaultDataverse(DataverseName dataverseName) {
         return MetadataConstants.DEFAULT_DATAVERSE_NAME.equals(dataverseName);
     }
+
+    protected static boolean isReservedDatabase(String databaseName) {
+        return FunctionConstants.ASTERIX_DB.equals(databaseName)
+                || 
AlgebricksBuiltinFunctions.ALGEBRICKS_DB.equals(databaseName)
+                || 
MetadataConstants.METADATA_DATAVERSE_NAME.getCanonicalForm().equals(databaseName)
+                || 
databaseName.startsWith(StorageConstants.PARTITION_DIR_PREFIX);
+    }
 }
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index cd76c73..75ff63b 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -593,7 +593,7 @@
         DataverseDecl dvd = (DataverseDecl) stmt;
         DataverseName dvName = dvd.getDataverseName();
         String database = dvd.getDatabaseName();
-        metadataProvider.validateDataverseName(dvName, 
dvd.getSourceLocation());
+        metadataProvider.validateNamespaceName(dvd.getNamespace(), 
dvd.getSourceLocation());
         //TODO(DB): read lock on database
         lockManager.acquireDataverseReadLock(metadataProvider.getLocks(), 
database, dvName);
         try {
@@ -638,7 +638,7 @@
             IRequestParameters requestParameters) throws Exception {
         CreateDatabaseStatement stmtCreateDatabase = (CreateDatabaseStatement) 
stmt;
         String database = stmtCreateDatabase.getDatabaseName().getValue();
-        //TODO(DB): validate names
+        metadataProvider.validateDatabaseName(database, 
stmt.getSourceLocation());
         if (isCompileOnly()) {
             return;
         }
@@ -681,7 +681,8 @@
         CreateDataverseStatement stmtCreateDataverse = 
(CreateDataverseStatement) stmt;
         DataverseName dvName = stmtCreateDataverse.getDataverseName();
         String dbName = stmtCreateDataverse.getDatabaseName();
-        metadataProvider.validateDataverseName(dvName, 
stmtCreateDataverse.getSourceLocation());
+        Namespace stmtNamespace = stmtCreateDataverse.getNamespace();
+        metadataProvider.validateNamespaceName(stmtNamespace, 
stmtCreateDataverse.getSourceLocation());
         if (isCompileOnly()) {
             return;
         }
@@ -769,7 +770,7 @@
             IHyracksClientConnection hcc, IRequestParameters 
requestParameters) throws Exception {
         DatasetDecl dd = (DatasetDecl) stmt;
         String datasetName = dd.getName().getValue();
-        metadataProvider.validateDatabaseObjectName(dd.getDataverse(), 
datasetName, stmt.getSourceLocation());
+        metadataProvider.validateDatabaseObjectName(dd.getNamespace(), 
datasetName, stmt.getSourceLocation());
         Namespace stmtActiveNamespace = getActiveNamespace(dd.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -1212,7 +1213,7 @@
         String datasetName = stmtCreateIndex.getDatasetName().getValue();
         String indexName = stmtCreateIndex.getIndexName().getValue();
         String fullTextConfigName = stmtCreateIndex.getFullTextConfigName();
-        
metadataProvider.validateDatabaseObjectName(stmtCreateIndex.getDataverseName(), 
indexName,
+        
metadataProvider.validateDatabaseObjectName(stmtCreateIndex.getNamespace(), 
indexName,
                 stmt.getSourceLocation());
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtCreateIndex.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
@@ -1568,7 +1569,7 @@
             throws Exception {
         CreateFullTextFilterStatement stmtCreateFilter = 
(CreateFullTextFilterStatement) stmt;
         String fullTextFilterName = stmtCreateFilter.getFilterName();
-        
metadataProvider.validateDatabaseObjectName(stmtCreateFilter.getDataverseName(),
 fullTextFilterName,
+        
metadataProvider.validateDatabaseObjectName(stmtCreateFilter.getNamespace(), 
fullTextFilterName,
                 stmt.getSourceLocation());
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtCreateFilter.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
@@ -1637,7 +1638,7 @@
             throws Exception {
         CreateFullTextConfigStatement stmtCreateConfig = 
(CreateFullTextConfigStatement) stmt;
         String configName = stmtCreateConfig.getConfigName();
-        
metadataProvider.validateDatabaseObjectName(stmtCreateConfig.getDataverseName(),
 configName,
+        
metadataProvider.validateDatabaseObjectName(stmtCreateConfig.getNamespace(), 
configName,
                 stmt.getSourceLocation());
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtCreateConfig.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
@@ -1882,7 +1883,7 @@
         TypeDecl stmtCreateType = (TypeDecl) stmt;
         SourceLocation sourceLoc = stmtCreateType.getSourceLocation();
         String typeName = stmtCreateType.getIdent().getValue();
-        
metadataProvider.validateDatabaseObjectName(stmtCreateType.getDataverseName(), 
typeName, sourceLoc);
+        
metadataProvider.validateDatabaseObjectName(stmtCreateType.getNamespace(), 
typeName, sourceLoc);
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtCreateType.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -1938,7 +1939,7 @@
         DatabaseDropStatement stmtDropDatabase = (DatabaseDropStatement) stmt;
         SourceLocation sourceLoc = stmtDropDatabase.getSourceLocation();
         String databaseName = stmtDropDatabase.getDatabaseName().getValue();
-        //TODO(DB): validate names
+        metadataProvider.validateDatabaseName(databaseName, sourceLoc);

         if (isSystemDatabase(databaseName) || isDefaultDatabase(databaseName)) 
{
             throw new CompilationException(ErrorCode.COMPILATION_ERROR, 
sourceLoc,
@@ -2062,9 +2063,8 @@
         SourceLocation sourceLoc = stmtDropDataverse.getSourceLocation();
         DataverseName dataverseName = stmtDropDataverse.getDataverseName();
         String databaseName = stmtDropDataverse.getDatabaseName();
-        metadataProvider.validateDataverseName(dataverseName, sourceLoc);
-        if (dataverseName.equals(MetadataConstants.DEFAULT_DATAVERSE_NAME)
-                || 
dataverseName.equals(MetadataConstants.METADATA_DATAVERSE_NAME)) {
+        
metadataProvider.validateNamespaceName(stmtDropDataverse.getNamespace(), 
sourceLoc);
+        if (isDefaultDataverse(dataverseName) || 
isMetadataDataverse(dataverseName)) {
             throw new CompilationException(ErrorCode.COMPILATION_ERROR, 
sourceLoc,
                     dataverseName + " " + dataverse() + " can't be dropped");
         }
@@ -2267,7 +2267,7 @@
         DropDatasetStatement stmtDelete = (DropDatasetStatement) stmt;
         SourceLocation sourceLoc = stmtDelete.getSourceLocation();
         String datasetName = stmtDelete.getDatasetName().getValue();
-        
metadataProvider.validateDatabaseObjectName(stmtDelete.getDataverseName(), 
datasetName, sourceLoc);
+        metadataProvider.validateDatabaseObjectName(stmtDelete.getNamespace(), 
datasetName, sourceLoc);
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtDelete.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -2379,7 +2379,7 @@
     protected void handleIndexDropStatement(MetadataProvider metadataProvider, 
Statement stmt,
             IHyracksClientConnection hcc, IRequestParameters 
requestParameters) throws Exception {
         IndexDropStatement stmtIndexDrop = (IndexDropStatement) stmt;
-        
metadataProvider.validateDatabaseObjectName(stmtIndexDrop.getDataverseName(),
+        
metadataProvider.validateDatabaseObjectName(stmtIndexDrop.getNamespace(),
                 stmtIndexDrop.getIndexName().getValue(), 
stmtIndexDrop.getSourceLocation());
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtIndexDrop.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
@@ -2590,7 +2590,7 @@
         TypeDropStatement stmtTypeDrop = (TypeDropStatement) stmt;
         SourceLocation sourceLoc = stmtTypeDrop.getSourceLocation();
         String typeName = stmtTypeDrop.getTypeName().getValue();
-        
metadataProvider.validateDatabaseObjectName(stmtTypeDrop.getDataverseName(), 
typeName, sourceLoc);
+        
metadataProvider.validateDatabaseObjectName(stmtTypeDrop.getNamespace(), 
typeName, sourceLoc);
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtTypeDrop.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -2666,7 +2666,7 @@
             IStatementRewriter stmtRewriter, IRequestParameters 
requestParameters) throws Exception {
         CreateViewStatement cvs = (CreateViewStatement) stmt;
         String viewName = cvs.getViewName();
-        metadataProvider.validateDatabaseObjectName(cvs.getDataverseName(), 
viewName, stmt.getSourceLocation());
+        metadataProvider.validateDatabaseObjectName(cvs.getNamespace(), 
viewName, stmt.getSourceLocation());
         Namespace stmtActiveNamespace = getActiveNamespace(cvs.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -2896,7 +2896,7 @@
         ViewDropStatement stmtDrop = (ViewDropStatement) stmt;
         SourceLocation sourceLoc = stmtDrop.getSourceLocation();
         String viewName = stmtDrop.getViewName().getValue();
-        
metadataProvider.validateDatabaseObjectName(stmtDrop.getDataverseName(), 
viewName, sourceLoc);
+        metadataProvider.validateDatabaseObjectName(stmtDrop.getNamespace(), 
viewName, sourceLoc);
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtDrop.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -2963,7 +2963,8 @@
         FunctionDecl fds = (FunctionDecl) stmt;
         FunctionSignature signature = fds.getSignature();
         DataverseName funDataverse = signature.getDataverseName();
-        metadataProvider.validateDatabaseObjectName(funDataverse, 
signature.getName(), stmt.getSourceLocation());
+        Namespace funNamespace = signature.getNamespace();
+        metadataProvider.validateDatabaseObjectName(funNamespace, 
signature.getName(), stmt.getSourceLocation());
         if (funDataverse == null) {
             signature.setDataverseName(activeNamespace.getDatabaseName(), 
activeNamespace.getDataverseName());
         }
@@ -2975,7 +2976,8 @@
         CreateFunctionStatement cfs = (CreateFunctionStatement) stmt;
         FunctionSignature signature = cfs.getFunctionSignature();
         DataverseName funDataverse = signature.getDataverseName();
-        metadataProvider.validateDatabaseObjectName(funDataverse, 
signature.getName(), stmt.getSourceLocation());
+        Namespace funNamespace = signature.getNamespace();
+        metadataProvider.validateDatabaseObjectName(funNamespace, 
signature.getName(), stmt.getSourceLocation());
         DataverseName dataverseName;
         String databaseName;
         if (funDataverse == null) {
@@ -3265,7 +3267,8 @@
         FunctionDropStatement stmtDropFunction = (FunctionDropStatement) stmt;
         FunctionSignature signature = stmtDropFunction.getFunctionSignature();
         DataverseName funDataverse = signature.getDataverseName();
-        metadataProvider.validateDatabaseObjectName(funDataverse, 
signature.getName(),
+        Namespace funNamespace = signature.getNamespace();
+        metadataProvider.validateDatabaseObjectName(funNamespace, 
signature.getName(),
                 stmtDropFunction.getSourceLocation());
         DataverseName dataverseName;
         String databaseName;
@@ -3334,7 +3337,7 @@
     protected void handleCreateAdapterStatement(MetadataProvider 
metadataProvider, Statement stmt) throws Exception {
         CreateAdapterStatement cas = (CreateAdapterStatement) stmt;
         String adapterName = cas.getAdapterName();
-        metadataProvider.validateDatabaseObjectName(cas.getDataverseName(), 
adapterName, cas.getSourceLocation());
+        metadataProvider.validateDatabaseObjectName(cas.getNamespace(), 
adapterName, cas.getSourceLocation());
         Namespace stmtActiveNamespace = getActiveNamespace(cas.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -3421,7 +3424,7 @@
         AdapterDropStatement stmtDropAdapter = (AdapterDropStatement) stmt;
         SourceLocation sourceLoc = stmtDropAdapter.getSourceLocation();
         String adapterName = stmtDropAdapter.getAdapterName();
-        
metadataProvider.validateDatabaseObjectName(stmtDropAdapter.getDataverseName(), 
adapterName, sourceLoc);
+        
metadataProvider.validateDatabaseObjectName(stmtDropAdapter.getNamespace(), 
adapterName, sourceLoc);
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtDropAdapter.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -3474,8 +3477,7 @@
     protected void handleCreateLibraryStatement(MetadataProvider 
metadataProvider, Statement stmt,
             IHyracksClientConnection hcc, IRequestParameters 
requestParameters) throws Exception {
         CreateLibraryStatement cls = (CreateLibraryStatement) stmt;
-        metadataProvider.validateDatabaseObjectName(cls.getDataverseName(), 
cls.getLibraryName(),
-                cls.getSourceLocation());
+        metadataProvider.validateDatabaseObjectName(cls.getNamespace(), 
cls.getLibraryName(), cls.getSourceLocation());
         Namespace stmtActiveNamespace = getActiveNamespace(cls.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -3612,7 +3614,7 @@
             IHyracksClientConnection hcc, IRequestParameters 
requestParameters) throws Exception {
         LibraryDropStatement stmtDropLibrary = (LibraryDropStatement) stmt;
         String libraryName = stmtDropLibrary.getLibraryName();
-        
metadataProvider.validateDatabaseObjectName(stmtDropLibrary.getDataverseName(), 
libraryName,
+        
metadataProvider.validateDatabaseObjectName(stmtDropLibrary.getNamespace(), 
libraryName,
                 stmtDropLibrary.getSourceLocation());
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtDropLibrary.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
@@ -3709,8 +3711,7 @@

     protected void handleCreateSynonymStatement(MetadataProvider 
metadataProvider, Statement stmt) throws Exception {
         CreateSynonymStatement css = (CreateSynonymStatement) stmt;
-        metadataProvider.validateDatabaseObjectName(css.getDataverseName(), 
css.getSynonymName(),
-                css.getSourceLocation());
+        metadataProvider.validateDatabaseObjectName(css.getNamespace(), 
css.getSynonymName(), css.getSourceLocation());
         Namespace stmtActiveNamespace = getActiveNamespace(css.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -3766,7 +3767,7 @@
     protected void handleDropSynonymStatement(MetadataProvider 
metadataProvider, Statement stmt) throws Exception {
         SynonymDropStatement stmtSynDrop = (SynonymDropStatement) stmt;
         String synonymName = stmtSynDrop.getSynonymName();
-        
metadataProvider.validateDatabaseObjectName(stmtSynDrop.getDataverseName(), 
synonymName,
+        
metadataProvider.validateDatabaseObjectName(stmtSynDrop.getNamespace(), 
synonymName,
                 stmtSynDrop.getSourceLocation());
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtSynDrop.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
@@ -3808,8 +3809,7 @@
             throws Exception {
         LoadStatement loadStmt = (LoadStatement) stmt;
         String datasetName = loadStmt.getDatasetName();
-        
metadataProvider.validateDatabaseObjectName(loadStmt.getDataverseName(), 
datasetName,
-                loadStmt.getSourceLocation());
+        metadataProvider.validateDatabaseObjectName(loadStmt.getNamespace(), 
datasetName, loadStmt.getSourceLocation());
         Namespace stmtActiveNamespace = 
getActiveNamespace(loadStmt.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -3852,8 +3852,7 @@
             throws Exception {
         CopyStatement copyStmt = (CopyStatement) stmt;
         String datasetName = copyStmt.getDatasetName();
-        
metadataProvider.validateDatabaseObjectName(copyStmt.getDataverseName(), 
datasetName,
-                copyStmt.getSourceLocation());
+        metadataProvider.validateDatabaseObjectName(copyStmt.getNamespace(), 
datasetName, copyStmt.getSourceLocation());
         Namespace stmtActiveNamespace = 
getActiveNamespace(copyStmt.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -3947,7 +3946,7 @@
             Map<String, IAObject> stmtParams, IStatementRewriter stmtRewriter) 
throws Exception {
         InsertStatement stmtInsertUpsert = (InsertStatement) stmt;
         String datasetName = stmtInsertUpsert.getDatasetName();
-        
metadataProvider.validateDatabaseObjectName(stmtInsertUpsert.getDataverseName(),
 datasetName,
+        
metadataProvider.validateDatabaseObjectName(stmtInsertUpsert.getNamespace(), 
datasetName,
                 stmtInsertUpsert.getSourceLocation());
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtInsertUpsert.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
@@ -4037,8 +4036,7 @@
             throws Exception {
         DeleteStatement stmtDelete = (DeleteStatement) stmt;
         String datasetName = stmtDelete.getDatasetName();
-        
metadataProvider.validateDatabaseObjectName(stmtDelete.getDataverseName(), 
datasetName,
-                stmt.getSourceLocation());
+        metadataProvider.validateDatabaseObjectName(stmtDelete.getNamespace(), 
datasetName, stmt.getSourceLocation());
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtDelete.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -4168,7 +4166,7 @@
         CreateFeedStatement cfs = (CreateFeedStatement) stmt;
         SourceLocation sourceLoc = cfs.getSourceLocation();
         String feedName = cfs.getFeedName().getValue();
-        metadataProvider.validateDatabaseObjectName(cfs.getDataverseName(), 
feedName, sourceLoc);
+        metadataProvider.validateDatabaseObjectName(cfs.getNamespace(), 
feedName, sourceLoc);
         Namespace stmtActiveNamespace = getActiveNamespace(cfs.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -4282,7 +4280,7 @@
         FeedDropStatement stmtFeedDrop = (FeedDropStatement) stmt;
         SourceLocation sourceLoc = stmtFeedDrop.getSourceLocation();
         String feedName = stmtFeedDrop.getFeedName().getValue();
-        
metadataProvider.validateDatabaseObjectName(stmtFeedDrop.getDataverseName(), 
feedName, sourceLoc);
+        
metadataProvider.validateDatabaseObjectName(stmtFeedDrop.getNamespace(), 
feedName, sourceLoc);
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtFeedDrop.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -4340,7 +4338,7 @@
         FeedPolicyDropStatement stmtFeedPolicyDrop = (FeedPolicyDropStatement) 
stmt;
         SourceLocation sourceLoc = stmtFeedPolicyDrop.getSourceLocation();
         String policyName = stmtFeedPolicyDrop.getPolicyName().getValue();
-        
metadataProvider.validateDatabaseObjectName(stmtFeedPolicyDrop.getDataverseName(),
 policyName, sourceLoc);
+        
metadataProvider.validateDatabaseObjectName(stmtFeedPolicyDrop.getNamespace(), 
policyName, sourceLoc);
         Namespace stmtActiveNamespace = 
getActiveNamespace(stmtFeedPolicyDrop.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -4577,8 +4575,8 @@
     protected void handleAnalyzeStatement(MetadataProvider metadataProvider, 
Statement stmt,
             IHyracksClientConnection hcc, IRequestParameters 
requestParameters) throws Exception {
         AnalyzeStatement analyzeStatement = (AnalyzeStatement) stmt;
-        
metadataProvider.validateDatabaseObjectName(analyzeStatement.getDataverseName(),
-                analyzeStatement.getDatasetName(), 
analyzeStatement.getSourceLocation());
+        
metadataProvider.validateDatabaseObjectName(analyzeStatement.getNamespace(), 
analyzeStatement.getDatasetName(),
+                analyzeStatement.getSourceLocation());
         Namespace stmtActiveNamespace = 
getActiveNamespace(analyzeStatement.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
@@ -4804,8 +4802,8 @@
     protected void handleAnalyzeDropStatement(MetadataProvider 
metadataProvider, Statement stmt,
             IHyracksClientConnection hcc, IRequestParameters requestParams) 
throws Exception {
         AnalyzeDropStatement analyzeDropStmt = (AnalyzeDropStatement) stmt;
-        
metadataProvider.validateDatabaseObjectName(analyzeDropStmt.getDataverseName(),
-                analyzeDropStmt.getDatasetName(), 
analyzeDropStmt.getSourceLocation());
+        
metadataProvider.validateDatabaseObjectName(analyzeDropStmt.getNamespace(), 
analyzeDropStmt.getDatasetName(),
+                analyzeDropStmt.getSourceLocation());
         Namespace stmtActiveNamespace = 
getActiveNamespace(analyzeDropStmt.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
         String databaseName = stmtActiveNamespace.getDatabaseName();
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
index 94621bf..890890c 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
@@ -23,6 +23,7 @@

 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.Namespace;
 import 
org.apache.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;

@@ -108,6 +109,11 @@
         return dataverseName;
     }

+    public Namespace getNamespace() {
+        //TODO(DB): the dataverse name is the driver here. change so that it's 
similar to other statement
+        return dataverseName == null ? null : new Namespace(databaseName, 
dataverseName);
+    }
+
     public String getName() {
         return name;
     }
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataConstants.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataConstants.java
index 044d920..9b1d5ae 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataConstants.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataConstants.java
@@ -28,6 +28,7 @@
  */
 public class MetadataConstants {

+    public static final int DB_SCOPE_PARTS_COUNT = 1;
     public static final int METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 = 251;
     public static final int DATAVERSE_NAME_TOTAL_LENGTH_LIMIT_UTF8 = 
METADATA_OBJECT_NAME_LENGTH_LIMIT_UTF8 * 4;
     public static final Pattern METADATA_OBJECT_NAME_INVALID_CHARS =
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java
index 9b437c2..3579cbe 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java
@@ -40,6 +40,10 @@
         this.ifNotExists = ifNotExists;
     }

+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public String getDatabaseName() {
         return namespace.getDatabaseName();
     }
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java
index 14ed0da..b40dc000 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java
@@ -48,6 +48,10 @@
         return Statement.Kind.DATAVERSE_DROP;
     }

+    public Namespace getNamespace() {
+        return namespace;
+    }
+
     public String getDatabaseName() {
         return namespace.getDatabaseName();
     }
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 a5e7f15..fc63d89 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
@@ -1871,14 +1871,29 @@
         return appCtx.getCompressionManager();
     }

+    public void validateNamespaceName(Namespace namespace, SourceLocation 
srcLoc) throws AlgebricksException {
+        validateDatabaseName(namespace.getDatabaseName(), srcLoc);
+        validateDataverseName(namespace.getDataverseName(), srcLoc);
+    }
+
+    public void validateDatabaseName(String databaseName, SourceLocation 
srcLoc) throws AlgebricksException {
+        validateDatabaseObjectNameImpl(databaseName, srcLoc);
+        validateChars(databaseName, srcLoc);
+    }
+
     public void validateDataverseName(DataverseName dataverseName, 
SourceLocation sourceLoc)
             throws AlgebricksException {
+        List<String> dvParts = dataverseName.getParts();
+        validatePartsLimit(dataverseName, dvParts, sourceLoc);
         int totalLengthUTF8 = 0;
-        for (String dvNamePart : dataverseName.getParts()) {
+        for (String dvNamePart : dvParts) {
             validateDatabaseObjectNameImpl(dvNamePart, sourceLoc);
             if (totalLengthUTF8 == 0 && 
StoragePathUtil.DATAVERSE_CONTINUATION_MARKER == dvNamePart.codePointAt(0)) {
                 throw new 
AsterixException(ErrorCode.INVALID_DATABASE_OBJECT_NAME, sourceLoc, dvNamePart);
             }
+            if (namespaceResolver.isUsingDatabase()) {
+                validateChars(dvNamePart, sourceLoc);
+            }
             totalLengthUTF8 += 
dvNamePart.getBytes(StandardCharsets.UTF_8).length;
         }
         if (totalLengthUTF8 > 
MetadataConstants.DATAVERSE_NAME_TOTAL_LENGTH_LIMIT_UTF8) {
@@ -1892,10 +1907,10 @@
         return IndexUtil.createExternalFilterEvaluatorFactory(context, 
typeEnv, projectionFiltrationInfo, properties);
     }

-    public void validateDatabaseObjectName(DataverseName dataverseName, String 
objectName, SourceLocation sourceLoc)
+    public void validateDatabaseObjectName(Namespace namespace, String 
objectName, SourceLocation sourceLoc)
             throws AlgebricksException {
-        if (dataverseName != null) {
-            validateDataverseName(dataverseName, sourceLoc);
+        if (namespace != null) {
+            validateNamespaceName(namespace, sourceLoc);
         }
         validateDatabaseObjectNameImpl(objectName, sourceLoc);
     }
@@ -1912,4 +1927,23 @@
             throw new AsterixException(ErrorCode.INVALID_DATABASE_OBJECT_NAME, 
sourceLoc, name);
         }
     }
+
+    private void validatePartsLimit(DataverseName dvName, List<String> parts, 
SourceLocation srcLoc)
+            throws AsterixException {
+        if (namespaceResolver.isUsingDatabase() && parts.size() != 
MetadataConstants.DB_SCOPE_PARTS_COUNT) {
+            throw new AsterixException(ErrorCode.INVALID_DATABASE_OBJECT_NAME, 
srcLoc, dvName);
+        }
+    }
+
+    private static void validateChars(String name, SourceLocation srcLoc) 
throws AsterixException {
+        for (int off = 0, len = name.length(); off < len;) {
+            int codePointChar = name.codePointAt(off);
+            if (!Character.isLetterOrDigit(codePointChar)) {
+                if (codePointChar != '_' && codePointChar != '-') {
+                    throw new 
AsterixException(ErrorCode.INVALID_DATABASE_OBJECT_NAME, srcLoc, name);
+                }
+            }
+            off += Character.charCount(codePointChar);
+        }
+    }
 }

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17872
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings

Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: I27ac40e18f8ec63c09317cbc573abd6fc2b94e39
Gerrit-Change-Number: 17872
Gerrit-PatchSet: 1
Gerrit-Owner: Ali Alsuliman <[email protected]>
Gerrit-MessageType: newchange

Reply via email to