>From Ali Alsuliman <[email protected]>: Ali Alsuliman has submitted this change. ( 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 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17872 Reviewed-by: Ali Alsuliman <[email protected]> Reviewed-by: Murtadha Hubail <[email protected]> Integration-Tests: Jenkins <[email protected]> Tested-by: Ali Alsuliman <[email protected]> --- M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java M asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.000.ddl.sqlpp 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-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.999.ddl.sqlpp 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-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.001.update.sqlpp M asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.002.query.sqlpp 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 11 files changed, 143 insertions(+), 57 deletions(-) Approvals: Murtadha Hubail: Looks good to me, approved Ali Alsuliman: Looks good to me, but someone else must approve; Verified Jenkins: Verified 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-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.000.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.000.ddl.sqlpp index e7c2769..d3915a8 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.000.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.000.ddl.sqlpp @@ -17,10 +17,10 @@ * under the License. */ -DROP DATABASE `part1` IF EXISTS; -CREATE DATABASE `part1`; -DROP DATAVERSE `part1`.`p%r t2` IF EXISTS; -CREATE DATAVERSE `part1`.`p%r t2`; +DROP DATABASE `part_1-` IF EXISTS; +CREATE DATABASE `part_1-`; +DROP DATAVERSE `part_1-`.`p_r-t2` IF EXISTS; +CREATE DATAVERSE `part_1-`.`p_r-t2`; -USE `part1`.`p%r t2`; +USE `part_1-`.`p_r-t2`; CREATE COLLECTION `some@dataset` PRIMARY KEY (id: int); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.001.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.001.update.sqlpp index 3629d7f..15d9bbd 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.001.update.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.001.update.sqlpp @@ -17,6 +17,6 @@ * under the License. */ -USE `part1`.`p%r t2`; +USE `part_1-`.`p_r-t2`; UPSERT INTO `some@dataset` {"id": 1}; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.002.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.002.query.sqlpp index ff2ab8f..7019cab 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.002.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.002.query.sqlpp @@ -17,7 +17,7 @@ * under the License. */ -USE `part1`.`p%r t2`; +USE `part_1-`.`p_r-t2`; SELECT VALUE COUNT(*) FROM `some@dataset`; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.999.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.999.ddl.sqlpp index 923c81b..9efd9f7 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.999.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/special-chars/test.999.ddl.sqlpp @@ -17,5 +17,5 @@ * under the License. */ -DROP DATAVERSE `part1`.`p%r t2` IF EXISTS; -DROP DATABASE `part1`; \ No newline at end of file +DROP DATAVERSE `part_1-`.`p_r-t2` IF EXISTS; +DROP DATABASE `part_1-`; \ No newline at end of file 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: 3 Gerrit-Owner: Ali Alsuliman <[email protected]> Gerrit-Reviewer: Ali Alsuliman <[email protected]> Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Michael Blow <[email protected]> Gerrit-Reviewer: Murtadha Hubail <[email protected]> Gerrit-MessageType: merged
