This is an automated email from the ASF dual-hosted git repository.

alsuliman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new e2e454b7f8 [ASTERIXDB-3259][MTD] Include database name in node group 
name
e2e454b7f8 is described below

commit e2e454b7f8f6998da41f80b4e4589142bfaf550d
Author: Ali Alsuliman <[email protected]>
AuthorDate: Tue Nov 7 23:59:08 2023 -0800

    [ASTERIXDB-3259][MTD] Include database name in node group name
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    - Fix Index compareTo() to include the database.
    - Include the database name in error messages.
    
    Change-Id: Ie0996be797666a731a92b2c2f4dc34809eba742c
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17932
    Reviewed-by: Ali Alsuliman <[email protected]>
    Reviewed-by: Murtadha Hubail <[email protected]>
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
---
 .../IntroduceSecondaryIndexInsertDeleteRule.java   |   3 +-
 .../optimizer/rules/PushFieldAccessRule.java       |   7 +-
 .../translator/LangExpressionToPlanTranslator.java |   6 +-
 .../app/function/DatasetResourcesRewriter.java     |   3 +-
 .../asterix/app/function/DatasetRewriter.java      |   4 +-
 .../asterix/app/function/DumpIndexRewriter.java    |   3 +-
 .../asterix/app/function/QueryIndexRewriter.java   |   3 +-
 .../app/function/StorageComponentsRewriter.java    |   3 +-
 .../asterix/app/translator/QueryTranslator.java    | 102 +++++++++++++--------
 .../org/apache/asterix/utils/RebalanceUtil.java    |   6 +-
 .../test/cloud_storage/CloudStorageTest.java       |   1 +
 .../apache/asterix/test/common/TestExecutor.java   |  51 ++++++++---
 .../asterix/test/metadata/MetadataTxnTest.java     |   5 +-
 .../cross-dataverse/cross-dv02/cross-dv02.1.adm    |   4 +
 .../cross-dataverse/cross-dv04/cross-dv04.1.adm    |   4 +
 .../cross-dataverse/cross-dv19/cross-dv19.1.adm    |   7 ++
 .../misc/dataset_nodegroup/dataset_nodegroup.1.adm |   1 +
 .../src/test/resources/runtimets/sqlpp_queries.xml |  92 +++++++++----------
 .../asterix/common/metadata/MetadataUtil.java      |   4 +
 .../asterix/lang/common/util/FunctionUtil.java     |   7 +-
 .../lang/sqlpp/rewrites/SqlppQueryRewriter.java    |   4 +-
 .../visitor/VariableCheckAndRewriteVisitor.java    |  18 +++-
 .../org/apache/asterix/metadata/MetadataNode.java  |   9 +-
 .../metadata/declared/MetadataManagerUtil.java     |   3 +
 .../metadata/declared/MetadataProvider.java        |   7 +-
 .../apache/asterix/metadata/entities/Index.java    |   8 +-
 .../apache/asterix/metadata/utils/DatasetUtil.java |  21 +++--
 .../src/main/resources/Catalog.xsd                 |  22 ++++-
 28 files changed, 272 insertions(+), 136 deletions(-)

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceSecondaryIndexInsertDeleteRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceSecondaryIndexInsertDeleteRule.java
index 2760eeefc1..9b28c58b7b 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceSecondaryIndexInsertDeleteRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceSecondaryIndexInsertDeleteRule.java
@@ -35,6 +35,7 @@ import 
org.apache.asterix.common.config.DatasetConfig.IndexType;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.MetadataUtil;
 import org.apache.asterix.lang.common.util.FunctionUtil;
 import org.apache.asterix.metadata.declared.DataSource;
 import org.apache.asterix.metadata.declared.DataSourceIndex;
@@ -173,7 +174,7 @@ public class IntroduceSecondaryIndexInsertDeleteRule 
implements IAlgebraicRewrit
         Dataset dataset = mp.findDataset(database, dataverseName, datasetName);
         if (dataset == null) {
             throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, 
datasetName,
-                    dataverseName);
+                    MetadataUtil.dataverseName(database, dataverseName, 
mp.isUsingDatabase()));
         }
         if (dataset.getDatasetType() == DatasetType.EXTERNAL) {
             return false;
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java
index b543b5fe90..eb93774f3c 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java
@@ -28,6 +28,7 @@ import org.apache.asterix.algebra.base.OperatorAnnotation;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.common.metadata.MetadataUtil;
 import org.apache.asterix.metadata.declared.DataSource;
 import org.apache.asterix.metadata.declared.DataSourceId;
 import org.apache.asterix.metadata.declared.MetadataProvider;
@@ -131,7 +132,8 @@ public class PushFieldAccessRule implements 
IAlgebraicRewriteRule {
         Dataset dataset = mp.findDataset(asid.getDatabaseName(), 
asid.getDataverseName(), asid.getDatasourceName());
         if (dataset == null) {
             throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, 
scan.getSourceLocation(),
-                    asid.getDatasourceName(), asid.getDataverseName());
+                    asid.getDatasourceName(),
+                    MetadataUtil.dataverseName(asid.getDatabaseName(), 
asid.getDataverseName(), mp.isUsingDatabase()));
         }
         if (dataset.getDatasetType() != DatasetType.INTERNAL) {
             return false;
@@ -320,7 +322,8 @@ public class PushFieldAccessRule implements 
IAlgebraicRewriteRule {
             Dataset dataset = mp.findDataset(asid.getDatabaseName(), 
asid.getDataverseName(), asid.getDatasourceName());
             if (dataset == null) {
                 throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, 
scan.getSourceLocation(),
-                        asid.getDatasourceName(), asid.getDataverseName());
+                        asid.getDatasourceName(), 
MetadataUtil.dataverseName(asid.getDatabaseName(),
+                                asid.getDataverseName(), 
mp.isUsingDatabase()));
             }
             if (dataset.getDatasetType() != DatasetType.INTERNAL) {
                 setAsFinal(assignOp, context, finalAnnot);
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
index 93d3a00298..68cb2850a0 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
@@ -40,6 +40,7 @@ import 
org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.MetadataUtil;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Expression.Kind;
 import org.apache.asterix.lang.common.base.ILangExpression;
@@ -207,7 +208,8 @@ abstract class LangExpressionToPlanTranslator
         if (dataset == null) {
             // This would never happen since we check for this in AqlTranslator
             throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, 
stmt.getDatasetName(),
-                    stmt.getDataverseName());
+                    MetadataUtil.dataverseName(stmt.getDatabaseName(), 
stmt.getDataverseName(),
+                            metadataProvider.isUsingDatabase()));
         }
         IAType itemType = 
metadataProvider.findType(dataset.getItemTypeDatabaseName(),
                 dataset.getItemTypeDataverseName(), dataset.getItemTypeName());
@@ -831,7 +833,7 @@ abstract class LangExpressionToPlanTranslator
         Dataset dataset = metadataProvider.findDataset(database, 
dataverseName, datasetName);
         if (dataset == null) {
             throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, 
datasetName,
-                    dataverseName);
+                    MetadataUtil.dataverseName(database, dataverseName, 
metadataProvider.isUsingDatabase()));
         }
         if (dataset.getDatasetType() == DatasetType.EXTERNAL) {
             throw new CompilationException(ErrorCode.COMPILATION_ERROR, 
sourceLoc,
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesRewriter.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesRewriter.java
index e2939f5333..5c1bea0d61 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesRewriter.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesRewriter.java
@@ -63,7 +63,8 @@ public class DatasetResourcesRewriter extends 
FunctionRewriter {
         }
         Dataset dataset = metadataProvider.findDataset(database, 
dataverseName, datasetName);
         if (dataset == null) {
-            throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, loc, datasetName, 
dataverseName);
+            throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, loc, datasetName,
+                    MetadataUtil.dataverseName(database, dataverseName, 
metadataProvider.isUsingDatabase()));
         }
         return new 
DatasetResourcesDatasource(context.getComputationNodeDomain(), 
dataset.getDatasetId());
     }
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetRewriter.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetRewriter.java
index 28a38da992..617d59b41f 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetRewriter.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetRewriter.java
@@ -33,6 +33,7 @@ import 
org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.metadata.DatasetFullyQualifiedName;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.MetadataUtil;
 import org.apache.asterix.lang.common.util.FunctionUtil;
 import org.apache.asterix.metadata.declared.DataSource;
 import org.apache.asterix.metadata.declared.DataSourceId;
@@ -173,7 +174,8 @@ public class DatasetRewriter implements 
IFunctionToDataSourceRewriter, IResultTy
         }
         if (dataset == null) {
             throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, 
datasetFnCall.getSourceLocation(),
-                    datasetName, dataverseName);
+                    datasetName,
+                    MetadataUtil.dataverseName(database, dataverseName, 
metadataProvider.isUsingDatabase()));
         }
         return dataset;
     }
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DumpIndexRewriter.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DumpIndexRewriter.java
index cc85b30efe..d50315b3d4 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DumpIndexRewriter.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DumpIndexRewriter.java
@@ -68,7 +68,8 @@ public class DumpIndexRewriter extends FunctionRewriter {
         MetadataProvider metadataProvider = (MetadataProvider) 
context.getMetadataProvider();
         final Dataset dataset = metadataProvider.findDataset(database, 
dataverseName, datasetName);
         if (dataset == null) {
-            throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, loc, datasetName, 
dataverseName);
+            throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, loc, datasetName,
+                    MetadataUtil.dataverseName(database, dataverseName, 
metadataProvider.isUsingDatabase()));
         }
         Index index = metadataProvider.getIndex(database, dataverseName, 
datasetName, indexName);
         if (index == null) {
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/QueryIndexRewriter.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/QueryIndexRewriter.java
index 1c00178fb6..46f13f1db7 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/QueryIndexRewriter.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/QueryIndexRewriter.java
@@ -203,7 +203,8 @@ public class QueryIndexRewriter extends FunctionRewriter 
implements IResultTypeC
             SourceLocation loc) throws AlgebricksException {
         Dataset dataset = mp.findDataset(dbName, dvName, dsName);
         if (dataset == null) {
-            throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, loc, dsName, 
dvName);
+            throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, loc, dsName,
+                    MetadataUtil.dataverseName(dbName, dvName, 
mp.isUsingDatabase()));
         }
         return dataset;
     }
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsRewriter.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsRewriter.java
index 7b02bd2b43..57e6784a0a 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsRewriter.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsRewriter.java
@@ -63,7 +63,8 @@ public class StorageComponentsRewriter extends 
FunctionRewriter {
         MetadataProvider metadataProvider = (MetadataProvider) 
context.getMetadataProvider();
         Dataset dataset = metadataProvider.findDataset(database, 
dataverseName, datasetName);
         if (dataset == null) {
-            throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, loc, datasetName, 
dataverseName);
+            throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, loc, datasetName,
+                    MetadataUtil.dataverseName(database, dataverseName, 
metadataProvider.isUsingDatabase()));
         }
         return new 
StorageComponentsDatasource(context.getComputationNodeDomain(), 
dataset.getDatasetId());
     }
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 8c750b0bf2..742bd42d50 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
@@ -628,14 +628,15 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             if (dv == null) {
                 if (stmtUseDataverse.getIfExists()) {
                     if (warningCollector.shouldWarn()) {
-                        warningCollector.warn(
-                                
Warning.of(stmtUseDataverse.getSourceLocation(), ErrorCode.UNKNOWN_DATAVERSE, 
dvName));
+                        
warningCollector.warn(Warning.of(stmtUseDataverse.getSourceLocation(),
+                                ErrorCode.UNKNOWN_DATAVERSE,
+                                MetadataUtil.dataverseName(dbName, dvName, 
metadataProvider.isUsingDatabase())));
                     }
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
                     return activeNamespace;
                 } else {
                     throw new MetadataException(ErrorCode.UNKNOWN_DATAVERSE, 
stmtUseDataverse.getSourceLocation(),
-                            dvName);
+                            MetadataUtil.dataverseName(dbName, dvName, 
metadataProvider.isUsingDatabase()));
                 }
             }
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -895,7 +896,8 @@ public class QueryTranslator extends AbstractLangTranslator 
implements IStatemen
             // Check if the dataverse exists
             Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, 
databaseName, dataverseName);
             if (dv == null) {
-                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc, dataverseName);
+                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc,
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
 
             IDatasetDetails datasetDetails;
@@ -1215,9 +1217,9 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             Collections.shuffle(allNodeList);
             selectedNodes.addAll(allNodeList.subList(0, nodegroupCardinality));
         }
-        //TODO(DB): node groups with database
         // Creates the associated node group for the dataset.
-        return DatasetUtil.createNodeGroupForNewDataset(dataverseName, 
datasetName, selectedNodes, metadataProvider);
+        return DatasetUtil.createNodeGroupForNewDataset(databaseName, 
dataverseName, datasetName, selectedNodes,
+                metadataProvider);
     }
 
     public void handleCreateIndexStatement(MetadataProvider metadataProvider, 
Statement stmt,
@@ -1255,13 +1257,14 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             // Check if the dataverse exists
             Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, 
databaseName, dataverseName);
             if (dv == null) {
-                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc, dataverseName);
+                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc,
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
 
             Dataset ds = metadataProvider.findDataset(databaseName, 
dataverseName, datasetName);
             if (ds == null) {
                 throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, 
datasetName,
-                        dataverseName);
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
 
             DatasetType datasetType = ds.getDatasetType();
@@ -1628,7 +1631,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, 
databaseName, dataverseName);
             if (dv == null) {
                 throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
stmtCreateFilter.getSourceLocation(),
-                        dataverseName);
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
 
             String filterName = stmtCreateFilter.getFilterName();
@@ -1914,7 +1917,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
         try {
             Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, 
databaseName, dataverseName);
             if (dv == null) {
-                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc, dataverseName);
+                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc,
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             Datatype dt = MetadataManager.INSTANCE.getDatatype(mdTxnCtx, 
databaseName, dataverseName, typeName);
             if (dt != null) {
@@ -2127,7 +2131,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
                     return false;
                 } else {
-                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
+                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, MetadataUtil
+                            .dataverseName(databaseName, dataverseName, 
metadataProvider.isUsingDatabase()));
                 }
             }
 
@@ -2320,12 +2325,14 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             if (dv == null) {
                 if (ifExists) {
                     if (warningCollector.shouldWarn()) {
-                        warningCollector.warn(Warning.of(sourceLoc, 
ErrorCode.UNKNOWN_DATAVERSE, dataverseName));
+                        warningCollector.warn(Warning.of(sourceLoc, 
ErrorCode.UNKNOWN_DATAVERSE, MetadataUtil
+                                .dataverseName(databaseName, dataverseName, 
metadataProvider.isUsingDatabase())));
                     }
                     
MetadataManager.INSTANCE.commitTransaction(mdTxnCtx.getValue());
                     return false;
                 } else {
-                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
+                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, MetadataUtil
+                            .dataverseName(databaseName, dataverseName, 
metadataProvider.isUsingDatabase()));
                 }
             }
             ds = metadataProvider.findDataset(databaseName, dataverseName, 
datasetName, true);
@@ -2335,11 +2342,12 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
                     return false;
                 } else {
                     throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, 
datasetName,
-                            dataverseName);
+                            MetadataUtil.dataverseName(databaseName, 
dataverseName,
+                                    metadataProvider.isUsingDatabase()));
                 }
             } else if (ds.getDatasetType() == DatasetType.VIEW) {
                 throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, 
datasetName,
-                        dataverseName);
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             validateDatasetState(metadataProvider, ds, sourceLoc);
 
@@ -2430,7 +2438,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             Dataset ds = metadataProvider.findDataset(databaseName, 
dataverseName, datasetName);
             if (ds == null) {
                 throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, 
datasetName,
-                        dataverseName);
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             if (ds.getDatasetType() == DatasetType.INTERNAL) {
                 Index index = MetadataManager.INSTANCE.getIndex(mdTxnCtx, 
databaseName, dataverseName, datasetName,
@@ -2624,12 +2632,14 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             if (dv == null) {
                 if (stmtTypeDrop.getIfExists()) {
                     if (warningCollector.shouldWarn()) {
-                        warningCollector.warn(Warning.of(sourceLoc, 
ErrorCode.UNKNOWN_DATAVERSE, dataverseName));
+                        warningCollector.warn(Warning.of(sourceLoc, 
ErrorCode.UNKNOWN_DATAVERSE, MetadataUtil
+                                .dataverseName(databaseName, dataverseName, 
metadataProvider.isUsingDatabase())));
                     }
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
                     return;
                 } else {
-                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
+                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, MetadataUtil
+                            .dataverseName(databaseName, dataverseName, 
metadataProvider.isUsingDatabase()));
                 }
             }
 
@@ -2732,7 +2742,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
         try {
             Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, 
databaseName, dataverseName);
             if (dv == null) {
-                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc, dataverseName);
+                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc,
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             Namespace ns = new Namespace(dv.getDatabaseName(), 
dv.getDataverseName());
             Dataset existingDataset =
@@ -2786,7 +2797,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
                                     
MetadataManager.INSTANCE.getDataverse(mdTxnCtx, refDatabaseName, 
refDataverseName);
                             if (refDataverse == null) {
                                 throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc,
-                                        refDataverseName);
+                                        
MetadataUtil.dataverseName(refDatabaseName, refDataverseName,
+                                                
metadataProvider.isUsingDatabase()));
                             }
                         }
                         String refDatasetName = 
foreignKeyDecl.getReferencedDatasetName().getValue();
@@ -2941,12 +2953,14 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
                 if (stmtViewDrop.getIfExists()) {
                     if (warningCollector.shouldWarn()) {
                         
warningCollector.warn(Warning.of(stmtViewDrop.getSourceLocation(), 
ErrorCode.UNKNOWN_DATAVERSE,
-                                dataverseName));
+                                MetadataUtil.dataverseName(databaseName, 
dataverseName,
+                                        metadataProvider.isUsingDatabase())));
                     }
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
                     return false;
                 } else {
-                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
+                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, MetadataUtil
+                            .dataverseName(databaseName, dataverseName, 
metadataProvider.isUsingDatabase()));
                 }
             }
             Dataset dataset = metadataProvider.findDataset(databaseName, 
dataverseName, viewName, true);
@@ -3041,7 +3055,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
         try {
             Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, 
databaseName, dataverseName);
             if (dv == null) {
-                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc, dataverseName);
+                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc,
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             Namespace ns = new Namespace(dv.getDatabaseName(), 
dv.getDataverseName());
             List<TypeSignature> existingInlineTypes;
@@ -3324,7 +3339,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
                     return false;
                 } else {
-                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
+                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, MetadataUtil
+                            .dataverseName(databaseName, dataverseName, 
metadataProvider.isUsingDatabase()));
                 }
             }
             Function function = MetadataManager.INSTANCE.getFunction(mdTxnCtx, 
signature);
@@ -3386,7 +3402,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
         try {
             Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, 
databaseName, dataverseName);
             if (dv == null) {
-                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc, dataverseName);
+                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc,
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             String adapterName = cas.getAdapterName();
             DatasourceAdapter adapter =
@@ -3469,7 +3486,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
                     return false;
                 } else {
-                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverseName);
+                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, MetadataUtil
+                            .dataverseName(databaseName, dataverseName, 
metadataProvider.isUsingDatabase()));
                 }
             }
             DatasourceAdapter adapter =
@@ -3526,7 +3544,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
         try {
             Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, 
databaseName, dataverseName);
             if (dv == null) {
-                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
dataverseName);
+                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE,
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             ExternalFunctionLanguage language = cls.getLang();
             existingLibrary = MetadataManager.INSTANCE.getLibrary(mdTxnCtx, 
databaseName, dataverseName, libraryName);
@@ -3664,7 +3683,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
                     return false;
                 } else {
                     throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
stmtDropLibrary.getSourceLocation(),
-                            dataverseName);
+                            MetadataUtil.dataverseName(databaseName, 
dataverseName,
+                                    metadataProvider.isUsingDatabase()));
                 }
             }
             Library library = MetadataManager.INSTANCE.getLibrary(mdTxnCtx, 
databaseName, dataverseName, libraryName);
@@ -3756,7 +3776,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
         try {
             Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, 
databaseName, dataverseName);
             if (dv == null) {
-                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
css.getSourceLocation(), dataverseName);
+                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
css.getSourceLocation(),
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             Synonym synonym = 
MetadataManager.INSTANCE.getSynonym(metadataProvider.getMetadataTxnContext(),
                     databaseName, dataverseName, synonymName);
@@ -3862,7 +3883,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
 
     protected Map<String, String> 
createExternalDataPropertiesForCopyFromStmt(String databaseName,
             DataverseName dataverseName, CopyFromStatement copyFromStatement, 
Datatype itemType,
-            MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
+            MetadataTransactionContext mdTxnCtx, MetadataProvider md) throws 
AlgebricksException {
         ExternalDetailsDecl edd = copyFromStatement.getExternalDetails();
         Map<String, String> properties = 
copyFromStatement.getExternalDetails().getProperties();
         String path = copyFromStatement.getPath();
@@ -3891,7 +3912,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             Dataset dataset = metadataProvider.findDataset(databaseName, 
dataverseName, copyStmt.getDatasetName());
             if (dataset == null) {
                 throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, 
stmt.getSourceLocation(),
-                        datasetName, dataverseName);
+                        datasetName,
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             Datatype itemType = MetadataManager.INSTANCE.getDatatype(mdTxnCtx, 
dataset.getItemTypeDatabaseName(),
                     dataset.getItemTypeDataverseName(), 
dataset.getItemTypeName());
@@ -3911,7 +3933,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             }
             ExternalDetailsDecl externalDetails = 
copyStmt.getExternalDetails();
             Map<String, String> properties = 
createExternalDataPropertiesForCopyFromStmt(databaseName, dataverseName,
-                    copyStmt, itemType, mdTxnCtx);
+                    copyStmt, itemType, mdTxnCtx, metadataProvider);
             ExternalDataUtils.normalize(properties);
             ExternalDataUtils.validate(properties);
             validateExternalDatasetProperties(externalDetails, properties, 
copyStmt.getSourceLocation(), mdTxnCtx,
@@ -3997,7 +4019,8 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             try {
                 ExternalDetailsDecl edd = copyTo.getExternalDetailsDecl();
                 
edd.setProperties(createAndValidateAdapterConfigurationForCopyToStmt(edd,
-                        ExternalDataConstants.WRITER_SUPPORTED_ADAPTERS, 
copyTo.getSourceLocation(), mdTxnCtx));
+                        ExternalDataConstants.WRITER_SUPPORTED_ADAPTERS, 
copyTo.getSourceLocation(), mdTxnCtx,
+                        metadataProvider));
 
                 Map<VarIdentifier, IAObject> externalVars = 
createExternalVariables(copyTo, stmtParams);
                 // Query Rewriting (happens under the same ongoing metadata 
transaction)
@@ -4646,7 +4669,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             Dataset ds = metadataProvider.findDataset(databaseName, 
dataverseName, datasetName);
             if (ds == null) {
                 throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, 
datasetName,
-                        dataverseName);
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             if (fc == null) {
                 throw new CompilationException(ErrorCode.COMPILATION_ERROR, 
sourceLoc, "Feed " + feedName
@@ -4703,13 +4726,14 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             // Check if the dataverse exists
             Dataverse dv = MetadataManager.INSTANCE.getDataverse(mdTxnCtx, 
databaseName, dataverseName);
             if (dv == null) {
-                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc, dataverseName);
+                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, 
sourceLoc,
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             // Check if the dataset exists
             ds = metadataProvider.findDataset(databaseName, dataverseName, 
datasetName);
             if (ds == null) {
                 throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, 
datasetName,
-                        dataverseName);
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             if (ds.getDatasetType() == DatasetType.INTERNAL) {
                 validateDatasetState(metadataProvider, ds, sourceLoc);
@@ -4932,7 +4956,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             Dataset ds = metadataProvider.findDataset(databaseName, 
dataverseName, datasetName);
             if (ds == null) {
                 throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, 
datasetName,
-                        dataverseName);
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             if (ds.getDatasetType() != DatasetType.INTERNAL) {
                 throw new 
CompilationException(ErrorCode.OPERATION_NOT_SUPPORTED, sourceLoc);
@@ -5068,7 +5092,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             Dataset ds = metadataProvider.findDataset(databaseName, 
dataverseName, datasetName);
             if (ds == null) {
                 throw new 
CompilationException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, sourceLoc, 
datasetName,
-                        dataverseName);
+                        MetadataUtil.dataverseName(databaseName, 
dataverseName, metadataProvider.isUsingDatabase()));
             }
             // Prepare jobs to compact the datatset and its indexes
             List<Index> indexes =
@@ -5591,7 +5615,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
 
     protected Map<String, String> 
createAndValidateAdapterConfigurationForCopyToStmt(
             ExternalDetailsDecl externalDetailsDecl, Set<String> 
supportedAdapters, SourceLocation sourceLocation,
-            MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
+            MetadataTransactionContext mdTxnCtx, MetadataProvider md) throws 
AlgebricksException {
         String adapterName = externalDetailsDecl.getAdapter();
         Map<String, String> properties = externalDetailsDecl.getProperties();
         WriterValidationUtil.validateWriterConfiguration(adapterName, 
supportedAdapters, properties, sourceLocation);
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
index 7b7c5d4ff3..180b6ccd45 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
@@ -121,9 +121,9 @@ public class RebalanceUtil {
 
             if (!targetNcNames.isEmpty()) {
                 // Creates a node group for rebalance.
-                String nodeGroupName = 
DatasetUtil.createNodeGroupForNewDataset(sourceDataset.getDataverseName(),
-                        sourceDataset.getDatasetName(), 
sourceDataset.getRebalanceCount() + 1, targetNcNames,
-                        metadataProvider);
+                String nodeGroupName = 
DatasetUtil.createNodeGroupForNewDataset(sourceDataset.getDatabaseName(),
+                        sourceDataset.getDataverseName(), 
sourceDataset.getDatasetName(),
+                        sourceDataset.getRebalanceCount() + 1, targetNcNames, 
metadataProvider);
                 // The target dataset for rebalance.
                 targetDataset = 
sourceDataset.getTargetDatasetForRebalance(nodeGroupName);
 
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageTest.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageTest.java
index a23da8c0e8..5f7a037866 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageTest.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageTest.java
@@ -64,6 +64,7 @@ public class CloudStorageTest {
     public static void setUp() throws Exception {
         LocalCloudUtil.startS3CloudEnvironment(true);
         TestExecutor testExecutor = new TestExecutor(DELTA_RESULT_PATH);
+        testExecutor.executorId = "cloud";
         testExecutor.stripSubstring = "//DB:";
         LangExecutionUtil.setUp(CONFIG_FILE_NAME, testExecutor);
         System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, 
CONFIG_FILE_NAME);
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
index 9498979a47..8641bd6c5a 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
@@ -251,6 +251,7 @@ public class TestExecutor {
     private static final String PROFILE_QUERY_TYPE = "profile";
     private static final String PLANS_QUERY_TYPE = "plans";
     private static final String SIGNATURE_QUERY_TYPE = "signature";
+    private static final String DEF_REPLACER = "def";
 
     private static final HashMap<Integer, ITestServer> runningTestServers = 
new HashMap<>();
     private static Map<String, InetSocketAddress> ncEndPoints;
@@ -277,6 +278,7 @@ public class TestExecutor {
 
     protected String deltaPath = null;
     public String stripSubstring = null;
+    public String executorId = null;
 
     public TestExecutor() {
         this(Collections.singletonList(
@@ -1844,13 +1846,8 @@ public class TestExecutor {
     }
 
     protected static boolean isExpected(Exception e, CompilationUnit cUnit) {
-        final List<String> expErrors = cUnit.getExpectedError();
-        for (String exp : expErrors) {
-            if (e.toString().contains(exp) || containsPattern(e.toString(), 
exp)) {
-                return true;
-            }
-        }
-        return false;
+        return cUnit.getExpectedError().stream().anyMatch(
+                exp -> e.toString().contains(exp.getValue()) || 
containsPattern(e.toString(), exp.getValue()));
     }
 
     private static boolean containsPattern(String exception, String 
maybePattern) {
@@ -2147,7 +2144,9 @@ public class TestExecutor {
         int numOfFiles = 0;
         List<CompilationUnit> cUnits = 
testCaseCtx.getTestCase().getCompilationUnit();
         for (CompilationUnit cUnit : cUnits) {
-            testCaseCtx.expectedErrors = cUnit.getExpectedError();
+            fixupMessages(cUnit);
+            testCaseCtx.expectedErrors = 
cUnit.getExpectedError().stream().map(CompilationUnit.ExpectedError::getValue)
+                    .collect(Collectors.toList());
             testCaseCtx.expectedWarnings = new 
BitSet(cUnit.getExpectedWarn().size());
             testCaseCtx.expectedWarnings.set(0, 
cUnit.getExpectedWarn().size());
             LOGGER.info(
@@ -2221,6 +2220,30 @@ public class TestExecutor {
         }
     }
 
+    private void fixupMessages(CompilationUnit cUnit) {
+        String replacerId = executorId == null ? DEF_REPLACER : executorId;
+
+        List<CompilationUnit.ExpectedWarn> expectedWarns = 
cUnit.getExpectedWarn();
+        expectedWarns.stream().filter(w -> 
!w.getReplacers().isEmpty()).forEach(w -> w.setValue(
+                MessageFormat.format(w.getValue(), (Object[]) 
getReplacements(cUnit, replacerId, w.getReplacers()))));
+
+        List<CompilationUnit.ExpectedError> expectedErrors = 
cUnit.getExpectedError();
+        expectedErrors.stream().filter(e -> 
!e.getReplacers().isEmpty()).forEach(e -> e.setValue(
+                MessageFormat.format(e.getValue(), (Object[]) 
getReplacements(cUnit, replacerId, e.getReplacers()))));
+    }
+
+    private static String[] getReplacements(CompilationUnit cUnit, String 
replacerId, List<String> replacers) {
+        Optional<String> replacements = replacers.stream().filter(s -> 
s.startsWith(replacerId)).findFirst();
+        if (replacements.isPresent()) {
+            return replacements.get().substring(replacerId.length() + 
1).split(",");
+        }
+        LOGGER.error("Test '{}', could not find message replacements for '{}' 
in replacements {}", cUnit.getName(),
+                replacerId, replacers);
+        throw new RuntimeException(
+                String.format("Test '%s', could not find message replacements 
for '%s' in replacements %s",
+                        cUnit.getName(), replacerId, replacers));
+    }
+
     private String applySubstitution(String statement, List<Parameter> 
parameters) throws Exception {
         // Ensure all macro parameters are available
         Parameter startParameter = parameters.stream()
@@ -2747,7 +2770,8 @@ public class TestExecutor {
         if (fail) {
             LOGGER.error("Test {} failed to raise (an) expected warning(s):", 
cUnit.getName());
         }
-        List<String> expectedWarn = cUnit.getExpectedWarn();
+        List<String> expectedWarn =
+                cUnit.getExpectedWarn().stream().map(w -> 
w.getValue()).collect(Collectors.toList());
         for (int i = expectedWarnings.nextSetBit(0); i >= 0; i = 
expectedWarnings.nextSetBit(i + 1)) {
             String warning = expectedWarn.get(i);
             LOGGER.error(warning);
@@ -2912,13 +2936,14 @@ public class TestExecutor {
         }
     }
 
-    protected void validateWarnings(List<String> actualWarnings, List<String> 
expectedWarn, BitSet expectedWarnings,
-            boolean expectedSourceLoc, File testFile) throws Exception {
+    protected void validateWarnings(List<String> actualWarnings, 
List<CompilationUnit.ExpectedWarn> expectedWarn,
+            BitSet expectedWarnings, boolean expectedSourceLoc, File testFile) 
throws Exception {
         if (actualWarnings != null) {
             for (String actualWarn : actualWarnings) {
                 OptionalInt first = IntStream.range(0, expectedWarn.size())
-                        .filter(i -> actualWarn.contains(expectedWarn.get(i)) 
&& expectedWarnings.get(i)).findFirst();
-                if (!first.isPresent()) {
+                        .filter(i -> 
actualWarn.contains(expectedWarn.get(i).getValue()) && expectedWarnings.get(i))
+                        .findFirst();
+                if (first.isEmpty()) {
                     String msg = "unexpected warning was encountered or has 
already been matched (" + actualWarn + ")";
                     LOGGER.error(msg);
                     if (!expectedWarnings.isEmpty()) {
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java
index 9e0683beaa..0b666767e5 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java
@@ -133,8 +133,9 @@ public class MetadataTxnTest {
         metadataProvider.setMetadataTxnContext(rebalanceTxn);
         try {
             final Set<String> rebalanceToNodes = 
Stream.of("asterix_nc1").collect(Collectors.toSet());
-            
DatasetUtil.createNodeGroupForNewDataset(sourceDataset.getDataverseName(), 
sourceDataset.getDatasetName(),
-                    sourceDataset.getRebalanceCount() + 1, rebalanceToNodes, 
metadataProvider);
+            
DatasetUtil.createNodeGroupForNewDataset(sourceDataset.getDatabaseName(), 
sourceDataset.getDataverseName(),
+                    sourceDataset.getDatasetName(), 
sourceDataset.getRebalanceCount() + 1, rebalanceToNodes,
+                    metadataProvider);
             // rebalance failed --> abort txn
             MetadataManager.INSTANCE.abortTransaction(rebalanceTxn);
         } finally {
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/cross-dataverse/cross-dv02/cross-dv02.1.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/cross-dataverse/cross-dv02/cross-dv02.1.adm
new file mode 100644
index 0000000000..95c9207dcc
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/cross-dataverse/cross-dv02/cross-dv02.1.adm
@@ -0,0 +1,4 @@
+{ "DataverseName": "student", "DatasetName": "gdstd", "DatatypeDataverseName": 
"student", "DatatypeName": "stdType", "DatasetType": "INTERNAL", "GroupName": 
"Default.student.gdstd", "CompactionPolicy": "concurrent", 
"CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" 
}, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": 
"max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": 
"1.2" } ], "InternalDetails": { "FileStructure": " [...]
+{ "DataverseName": "teacher", "DatasetName": "prof", "DatatypeDataverseName": 
"teacher", "DatatypeName": "tchrType", "DatasetType": "INTERNAL", "GroupName": 
"Default.teacher.prof", "CompactionPolicy": "concurrent", 
"CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" 
}, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": 
"max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": 
"1.2" } ], "InternalDetails": { "FileStructure": "B [...]
+{ "DataverseName": "teacher", "DatasetName": "pstdoc", 
"DatatypeDataverseName": "teacher", "DatatypeName": "tchrType", "DatasetType": 
"INTERNAL", "GroupName": "Default.teacher.pstdoc", "CompactionPolicy": 
"concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", 
"Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { 
"Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", 
"Value": "1.2" } ], "InternalDetails": { "FileStructure" [...]
+{ "DataverseName": "student", "DatasetName": "ugdstd", 
"DatatypeDataverseName": "student", "DatatypeName": "stdType", "DatasetType": 
"INTERNAL", "GroupName": "Default.student.ugdstd", "CompactionPolicy": 
"concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", 
"Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { 
"Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", 
"Value": "1.2" } ], "InternalDetails": { "FileStructure": [...]
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/cross-dataverse/cross-dv04/cross-dv04.1.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/cross-dataverse/cross-dv04/cross-dv04.1.adm
new file mode 100644
index 0000000000..d20b7d6cbb
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/cross-dataverse/cross-dv04/cross-dv04.1.adm
@@ -0,0 +1,4 @@
+{ "DataverseName": "student", "DatasetName": "gdstd", "DatatypeDataverseName": 
"student", "DatatypeName": "stdType", "DatasetType": "INTERNAL", "GroupName": 
"Default.student.gdstd", "CompactionPolicy": "concurrent", 
"CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" 
}, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": 
"max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": 
"1.2" } ], "InternalDetails": { "FileStructure": " [...]
+{ "DataverseName": "teacher", "DatasetName": "prof", "DatatypeDataverseName": 
"teacher", "DatatypeName": "tchrType", "DatasetType": "INTERNAL", "GroupName": 
"Default.teacher.prof", "CompactionPolicy": "concurrent", 
"CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" 
}, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": 
"max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": 
"1.2" } ], "InternalDetails": { "FileStructure": "B [...]
+{ "DataverseName": "teacher", "DatasetName": "pstdoc", 
"DatatypeDataverseName": "teacher", "DatatypeName": "tchrType", "DatasetType": 
"INTERNAL", "GroupName": "Default.teacher.pstdoc", "CompactionPolicy": 
"concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", 
"Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { 
"Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", 
"Value": "1.2" } ], "InternalDetails": { "FileStructure" [...]
+{ "DataverseName": "student", "DatasetName": "ugdstd", 
"DatatypeDataverseName": "student", "DatatypeName": "stdType", "DatasetType": 
"INTERNAL", "GroupName": "Default.student.ugdstd", "CompactionPolicy": 
"concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", 
"Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { 
"Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", 
"Value": "1.2" } ], "InternalDetails": { "FileStructure": [...]
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/cross-dataverse/cross-dv19/cross-dv19.1.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/cross-dataverse/cross-dv19/cross-dv19.1.adm
new file mode 100644
index 0000000000..6c7097a440
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/cross-dataverse/cross-dv19/cross-dv19.1.adm
@@ -0,0 +1,7 @@
+{ "DataverseName": "test1", "DatasetName": "TwitterData", 
"DatatypeDataverseName": "test1", "DatatypeName": "Tweet", "DatasetType": 
"EXTERNAL", "GroupName": "Default.test1.TwitterData", "CompactionPolicy": 
"concurrent", "CompactionPolicyProperties": [ { "Name": "max-component-count", 
"Value": "30" }, { "Name": "min-merge-component-count", "Value": "3" }, { 
"Name": "max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", 
"Value": "1.2" } ], "ExternalDetails": { "DatasourceAda [...]
+{ "DataverseName": "test1", "DatasetName": "t1", "DatatypeDataverseName": 
"test1", "DatatypeName": "testtype", "DatasetType": "INTERNAL", "GroupName": 
"Default.test1.t1", "CompactionPolicy": "concurrent", 
"CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" 
}, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": 
"max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": 
"1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "Pa [...]
+{ "DataverseName": "test1", "DatasetName": "t2", "DatatypeDataverseName": 
"test1", "DatatypeName": "testtype", "DatasetType": "INTERNAL", "GroupName": 
"Default.test1.t2", "CompactionPolicy": "concurrent", 
"CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" 
}, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": 
"max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": 
"1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "Pa [...]
+{ "DataverseName": "test1", "DatasetName": "t3", "DatatypeDataverseName": 
"test1", "DatatypeName": "testtype", "DatasetType": "INTERNAL", "GroupName": 
"Default.test1.t3", "CompactionPolicy": "concurrent", 
"CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" 
}, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": 
"max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": 
"1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "Pa [...]
+{ "DataverseName": "test2", "DatasetName": "t2", "DatatypeDataverseName": 
"test2", "DatatypeName": "testtype", "DatasetType": "INTERNAL", "GroupName": 
"Default.test2.t2", "CompactionPolicy": "concurrent", 
"CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" 
}, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": 
"max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": 
"1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "Pa [...]
+{ "DataverseName": "test2", "DatasetName": "t3", "DatatypeDataverseName": 
"test2", "DatatypeName": "testtype", "DatasetType": "INTERNAL", "GroupName": 
"Default.test2.t3", "CompactionPolicy": "concurrent", 
"CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" 
}, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": 
"max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": 
"1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "Pa [...]
+{ "DataverseName": "test2", "DatasetName": "t4", "DatatypeDataverseName": 
"test2", "DatatypeName": "testtype", "DatasetType": "INTERNAL", "GroupName": 
"Default.test2.t4", "CompactionPolicy": "concurrent", 
"CompactionPolicyProperties": [ { "Name": "max-component-count", "Value": "30" 
}, { "Name": "min-merge-component-count", "Value": "3" }, { "Name": 
"max-merge-component-count", "Value": "10" }, { "Name": "size-ratio", "Value": 
"1.2" } ], "InternalDetails": { "FileStructure": "BTREE", "Pa [...]
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/misc/dataset_nodegroup/dataset_nodegroup.1.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/misc/dataset_nodegroup/dataset_nodegroup.1.adm
new file mode 100644
index 0000000000..80aba7bcf5
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/misc/dataset_nodegroup/dataset_nodegroup.1.adm
@@ -0,0 +1 @@
+{ "GroupName": "Default.twitter.TwitterData", "NodeNames": {{ "asterix_nc1", 
"asterix_nc2" }} }
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml 
b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
index 22bc3a902e..f65f6431c7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
@@ -50,7 +50,7 @@
     <test-case FilePath="api" check-warnings="true">
       <compilation-unit name="request-dataverse">
         <output-dir compare="Text">request-dataverse</output-dir>
-        <expected-warn>ASX1063: Cannot find dataverse with name 
testUnknown</expected-warn>
+        <expected-warn replacers="cloud:Default.testUnknown 
def:testUnknown">ASX1063: Cannot find dataverse with name {0}</expected-warn>
         <source-location>false</source-location>
       </compilation-unit>
     </test-case>
@@ -4010,7 +4010,7 @@
     <test-case FilePath="custord">
       <compilation-unit name="join_q_07">
         <output-dir compare="Text">join_q_06</output-dir>
-        <expected-error>Cannot find dataset c in dataverse test nor an alias 
with name c</expected-error>
+        <expected-error replacers="cloud:Default.test def:test">Cannot find 
dataset c in dataverse {0} nor an alias with name c</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="custord">
@@ -4084,7 +4084,7 @@
     <test-case FilePath="dapd">
       <compilation-unit name="q2-2-negative">
         <output-dir compare="Text">q2</output-dir>
-        <expected-error>Cannot find dataset e in dataverse test nor an alias 
with name e</expected-error>
+        <expected-error replacers="cloud:Default.test def:test">Cannot find 
dataset e in dataverse {0} nor an alias with name e</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="dapd">
@@ -4162,7 +4162,7 @@
     <test-case FilePath="ddl">
       <compilation-unit name="create-dataset-3">
         <output-dir compare="Clean-JSON">create-dataset-3</output-dir>
-        <expected-error>ASX1077: Cannot find dataset non_existent in dataverse 
test nor an alias with name non_existent (in line 23, at column 
21)</expected-error>
+        <expected-error replacers="cloud:Default.test def:test">ASX1077: 
Cannot find dataset non_existent in dataverse {0} nor an alias with name 
non_existent (in line 23, at column 21)</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="ddl">
@@ -4219,8 +4219,8 @@
     <test-case FilePath="ddl/create-index">
       <compilation-unit name="create-index-6">
         <output-dir compare="Text">none</output-dir>
-        <expected-error>ASX1050: Cannot find dataset with name LineItemView1 
in dataverse test (in line 55, at column 1)</expected-error>
-        <expected-error>ASX1050: Cannot find dataset with name LineItemView2 
in dataverse test (in line 60, at column 1)</expected-error>
+        <expected-error replacers="cloud:Default.test def:test">ASX1050: 
Cannot find dataset with name LineItemView1 in dataverse {0} (in line 55, at 
column 1)</expected-error>
+        <expected-error replacers="cloud:Default.test def:test">ASX1050: 
Cannot find dataset with name LineItemView2 in dataverse {0} (in line 60, at 
column 1)</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="ddl/create-index">
@@ -4259,13 +4259,13 @@
       <compilation-unit name="invalid-dataverse">
         <output-dir compare="Text">invalid-dataverse</output-dir>
         <source-location>false</source-location>
-        <expected-warn>Cannot find dataverse with name fakeDataverse (in line 
22, at column 1)</expected-warn>
-        <expected-error>Cannot find dataverse with name fakeDataverse (in line 
27, at column 1)</expected-error>
-        <expected-warn>Cannot find dataverse with name fakeDataverse (in line 
29, at column 1)</expected-warn>
-        <expected-error>Cannot find dataverse with name fakeDataverse (in line 
30, at column 1)</expected-error>
-        <expected-error>Cannot find datatype with name 
fakeDataverse.myType</expected-error>
-        <expected-error>Cannot find dataverse with name fakeDataverse (in line 
30, at column 1)</expected-error>
-        <expected-error>Cannot find dataverse with name fakeDataverse (in line 
32, at column 1)</expected-error>
+        <expected-warn replacers="cloud:Default.fakeDataverse 
def:fakeDataverse">Cannot find dataverse with name {0} (in line 22, at column 
1)</expected-warn>
+        <expected-error replacers="cloud:Default.fakeDataverse 
def:fakeDataverse">Cannot find dataverse with name {0} (in line 27, at column 
1)</expected-error>
+        <expected-warn replacers="cloud:Default.fakeDataverse 
def:fakeDataverse">Cannot find dataverse with name {0} (in line 29, at column 
1)</expected-warn>
+        <expected-error replacers="cloud:Default.fakeDataverse 
def:fakeDataverse">Cannot find dataverse with name {0} (in line 30, at column 
1)</expected-error>
+        <expected-error replacers="cloud:fakeDataverse 
def:fakeDataverse">Cannot find datatype with name {0}.myType</expected-error>
+        <expected-error replacers="cloud:Default.fakeDataverse 
def:fakeDataverse">Cannot find dataverse with name {0} (in line 30, at column 
1)</expected-error>
+        <expected-error replacers="cloud:Default.fakeDataverse 
def:fakeDataverse">Cannot find dataverse with name {0} (in line 32, at column 
1)</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="ddl">
@@ -4364,14 +4364,14 @@
     <test-case FilePath="ddl" check-warnings="true">
       <compilation-unit name="drop_dataset_invalid_dataverse">
         <output-dir compare="Text">drop_dataset_invalid_dataverse</output-dir>
-        <expected-error>ASX1063: Cannot find dataverse with name fakeDataverse 
(in line 22, at column 1)</expected-error>
-        <expected-error>ASX1063: Cannot find dataverse with name fakeDataverse 
(in line 22, at column 1)</expected-error>
-        <expected-error>ASX1063: Cannot find dataverse with name fakeDataverse 
(in line 22, at column 1)</expected-error>
-        <expected-error>ASX1063: Cannot find dataverse with name fakeDataverse 
(in line 22, at column 1)</expected-error>
-        <expected-error>ASX1050: Cannot find dataset with name fakeDataset1 in 
dataverse realDataverse (in line 22, at column 1)</expected-error>
-        <expected-warn>ASX1063: Cannot find dataverse with name fakeDataverse 
(in line 22, at column 1)</expected-warn>
-        <expected-warn>ASX1063: Cannot find dataverse with name fakeDataverse 
(in line 22, at column 1)</expected-warn>
-        <expected-warn>ASX1063: Cannot find dataverse with name fakeDataverse 
(in line 22, at column 1)</expected-warn>
+        <expected-error  replacers="cloud:Default.fakeDataverse 
def:fakeDataverse">ASX1063: Cannot find dataverse with name {0} (in line 22, at 
column 1)</expected-error>
+        <expected-error  replacers="cloud:Default.fakeDataverse 
def:fakeDataverse">ASX1063: Cannot find dataverse with name {0} (in line 22, at 
column 1)</expected-error>
+        <expected-error  replacers="cloud:Default.fakeDataverse 
def:fakeDataverse">ASX1063: Cannot find dataverse with name {0} (in line 22, at 
column 1)</expected-error>
+        <expected-error  replacers="cloud:Default.fakeDataverse 
def:fakeDataverse">ASX1063: Cannot find dataverse with name {0} (in line 22, at 
column 1)</expected-error>
+        <expected-error replacers="cloud:Default.realDataverse 
def:realDataverse">ASX1050: Cannot find dataset with name fakeDataset1 in 
dataverse {0} (in line 22, at column 1)</expected-error>
+        <expected-warn  replacers="cloud:Default.fakeDataverse 
def:fakeDataverse">ASX1063: Cannot find dataverse with name {0} (in line 22, at 
column 1)</expected-warn>
+        <expected-warn  replacers="cloud:Default.fakeDataverse 
def:fakeDataverse">ASX1063: Cannot find dataverse with name {0} (in line 22, at 
column 1)</expected-warn>
+        <expected-warn  replacers="cloud:Default.fakeDataverse 
def:fakeDataverse">ASX1063: Cannot find dataverse with name {0} (in line 22, at 
column 1)</expected-warn>
       </compilation-unit>
     </test-case>
     <test-case FilePath="ddl">
@@ -5956,13 +5956,13 @@
     <test-case FilePath="group-by">
       <compilation-unit name="core-01-error">
         <output-dir compare="Text">none</output-dir>
-        <expected-error>Cannot find dataset e in dataverse gby nor an alias 
with name e</expected-error>
+        <expected-error replacers="cloud:Default.gby def:gby">Cannot find 
dataset e in dataverse {0} nor an alias with name e</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="group-by">
       <compilation-unit name="core-02-error">
         <output-dir compare="Text">none</output-dir>
-        <expected-error>Cannot find dataset f in dataverse gby nor an alias 
with name f</expected-error>
+        <expected-error replacers="cloud:Default.gby def:gby">Cannot find 
dataset f in dataverse {0} nor an alias with name f</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="group-by">
@@ -6722,7 +6722,7 @@
     <test-case FilePath="join">
       <compilation-unit name="cross-join-02-negative">
         <output-dir compare="Text">none</output-dir>
-        <expected-error>ASX1077: Cannot find dataset x in dataverse Default 
nor an alias with name x (in line 26, at column 39)</expected-error>
+        <expected-error replacers="cloud:Default.Default def:Default">ASX1077: 
Cannot find dataset x in dataverse {0} nor an alias with name x (in line 26, at 
column 39)</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="join">
@@ -7102,8 +7102,8 @@
       <compilation-unit name="partition-by-nonexistent-field">
         <output-dir compare="Text">partition-by-nonexistent-field</output-dir>
         <expected-error>Field 'id' is not found</expected-error>
-        <expected-error>Cannot find dataset with name testds in dataverse 
test</expected-error>
-        <expected-error>Cannot find dataset testds in dataverse test nor an 
alias with name testds</expected-error>
+        <expected-error replacers="cloud:Default.test def:test">Cannot find 
dataset with name testds in dataverse {0}</expected-error>
+        <expected-error replacers="cloud:Default.test def:test">Cannot find 
dataset testds in dataverse {0} nor an alias with name testds</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="misc">
@@ -7298,8 +7298,8 @@
       <compilation-unit name="dump_index">
         <output-dir compare="Text">dump_index</output-dir>
         <expected-error>Cannot find index with name noindex</expected-error>
-        <expected-error>Cannot find dataset with name nodataset in dataverse 
test</expected-error>
-        <expected-error>Cannot find dataset with name ds in dataverse 
nodataverse</expected-error>
+        <expected-error replacers="cloud:Default.test def:test">Cannot find 
dataset with name nodataset in dataverse {0}</expected-error>
+        <expected-error replacers="cloud:Default.nodataverse 
def:nodataverse">Cannot find dataset with name ds in dataverse 
{0}</expected-error>
         <expected-error>Unsupported type: dump-index cannot process input type 
null</expected-error>
         <expected-error>Unsupported type: dump-index cannot process input type 
null</expected-error>
         <expected-error>Unsupported type: dump-index cannot process input type 
null</expected-error>
@@ -11626,7 +11626,7 @@
     <test-case FilePath="synonym">
       <compilation-unit name="synonym-02-negative">
         <output-dir compare="Text">none</output-dir>
-        <expected-error>ASX1063: Cannot find dataverse with name 
UNKNOWN_DATAVERSE</expected-error>
+        <expected-error replacers="cloud:Default.UNKNOWN_DATAVERSE 
def:UNKNOWN_DATAVERSE">ASX1063: Cannot find dataverse with name 
{0}</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="synonym">
@@ -13122,26 +13122,26 @@
     <test-case FilePath="user-defined-functions">
       <compilation-unit name="bad-function-ddl-1">
         <output-dir compare="Text">bad-function-ddl-1</output-dir>
-        <expected-error>Cannot find dataset TweetMessages in dataverse 
experiments nor an alias with name TweetMessages</expected-error>
-        <expected-error>Cannot find dataset TweetMessages2 in dataverse 
experiments2 nor an alias with name TweetMessages2</expected-error>
+        <expected-error replacers="cloud:Default.experiments 
def:experiments">Cannot find dataset TweetMessages in dataverse {0} nor an 
alias with name TweetMessages</expected-error>
+        <expected-error replacers="cloud:Default.experiments2 
def:experiments2">Cannot find dataset TweetMessages2 in dataverse {0} nor an 
alias with name TweetMessages2</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
       <compilation-unit name="bad-function-ddl-2">
         <output-dir compare="Text">bad-function-ddl-2</output-dir>
-        <expected-error>Cannot find dataset TweetMessages in dataverse 
experiments2 nor an alias with name TweetMessages</expected-error>
+        <expected-error replacers="cloud:Default.experiments2 
def:experiments2">Cannot find dataset TweetMessages in dataverse {0} nor an 
alias with name TweetMessages</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
       <compilation-unit name="bad-function-ddl-3">
         <output-dir compare="Text">bad-function-ddl-3</output-dir>
-        <expected-error>Cannot find dataset TweetMessages in dataverse 
experiments nor an alias with name TweetMessages</expected-error>
+        <expected-error replacers="cloud:Default.experiments 
def:experiments">Cannot find dataset TweetMessages in dataverse {0} nor an 
alias with name TweetMessages</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
       <compilation-unit name="bad-function-ddl-4">
         <output-dir compare="Text">bad-function-ddl-4</output-dir>
-        <expected-error>Cannot find dataset TweetMessages in dataverse 
experients nor an alias with name TweetMessages</expected-error>
+        <expected-error replacers="cloud:Default.experients 
def:experients">Cannot find dataset TweetMessages in dataverse {0} nor an alias 
with name TweetMessages</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
@@ -13160,13 +13160,13 @@
     <test-case FilePath="user-defined-functions">
       <compilation-unit name="bad-function-ddl-7">
         <output-dir compare="Text">bad-function-ddl-7</output-dir>
-        <expected-error>Cannot find dataset TweetMessaes in dataverse 
experiments nor an alias with name TweetMessaes</expected-error>
+        <expected-error replacers="cloud:Default.experiments 
def:experiments">Cannot find dataset TweetMessaes in dataverse {0} nor an alias 
with name TweetMessaes</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
       <compilation-unit name="bad-function-ddl-8">
         <output-dir compare="Text">bad-function-ddl-8</output-dir>
-        <expected-error>Cannot find dataset TweetMessaes in dataverse 
experiments nor an alias with name TweetMessaes</expected-error>
+        <expected-error replacers="cloud:Default.experiments 
def:experiments">Cannot find dataset TweetMessaes in dataverse {0} nor an alias 
with name TweetMessaes</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
@@ -13278,7 +13278,7 @@
     <test-case FilePath="user-defined-functions">
       <compilation-unit name="query-ASTERIXDB-1652">
         <output-dir compare="Text">query-ASTERIXDB-1652-2</output-dir>
-        <expected-error>ASX1063: Cannot find dataverse with name 
test</expected-error>
+        <expected-error replacers="cloud:Default.test def:test">ASX1063: 
Cannot find dataverse with name {0}</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
@@ -13559,7 +13559,7 @@
     <test-case FilePath="view">
       <compilation-unit name="create-view-2-negative">
         <output-dir compare="Text">none</output-dir>
-        <expected-error>ASX1063: Cannot find dataverse with name test (in line 
24, at column 1)</expected-error>
+        <expected-error replacers="cloud:Default.test def:test">ASX1063: 
Cannot find dataverse with name {0} (in line 24, at column 1)</expected-error>
         <expected-error><![CDATA[ASX1001: Syntax error: In line 25 >>create 
view test.v1 as select * from range(1,2) r order by;<< Encountered ";" at 
column 59]]></expected-error>
         <expected-error>ASX1081: Cannot find function with signature 
test.undefined_range(2) (in line 25, at column 38)</expected-error>
         <expected-error>ASX1160: A view with this name test.v1 already exists 
(in line 26, at column 1)</expected-error>
@@ -13639,7 +13639,7 @@
         <expected-error><![CDATA[ASX1166: Invalid foreign key definition: 
foreign key does not match primary key of view test1.employee_v1 (in line 34, 
at column 1)]]></expected-error>
         <expected-error><![CDATA[ASX1166: Invalid foreign key definition: 
foreign key does not match primary key of view test1.employee_v2 (in line 34, 
at column 1)]]></expected-error>
         <expected-error><![CDATA[ASX1164: Invalid foreign key definition (in 
line 34, at column 1)]]></expected-error>
-        <expected-error><![CDATA[ASX1063: Cannot find dataverse with name 
test3 (in line 42, at column 1)]]></expected-error>
+        <expected-error replacers="cloud:Default.test3 
def:test3"><![CDATA[ASX1063: Cannot find dataverse with name {0} (in line 42, 
at column 1)]]></expected-error>
         <expected-error><![CDATA[ASX1159: Cannot find view with name 
test1.employee_v3 (in line 42, at column 1)]]></expected-error>
         <expected-error><![CDATA[ASX1159: Cannot find view with name 
test1.employee (in line 43, at column 1)]]></expected-error>
         <expected-error><![CDATA[ASX1164: Invalid foreign key definition (in 
line 43, at column 1)]]></expected-error>
@@ -13679,9 +13679,9 @@
     <test-case FilePath="view">
       <compilation-unit name="drop-view-2-negative">
         <output-dir compare="Text">drop-view-2-negative</output-dir>
-        <expected-error>ASX1063: Cannot find dataverse with name test (in line 
24, at column 1)</expected-error>
+        <expected-error replacers="cloud:Default.test def:test">ASX1063: 
Cannot find dataverse with name {0} (in line 24, at column 1)</expected-error>
         <expected-error>ASX1159: Cannot find view with name test.v1 (in line 
25, at column 1)</expected-error>
-        <expected-error>ASX1050: Cannot find dataset with name v1 in dataverse 
test (in line 27, at column 1)</expected-error>
+        <expected-error replacers="cloud:Default.test def:test">ASX1050: 
Cannot find dataset with name v1 in dataverse {0} (in line 27, at column 
1)</expected-error>
         <expected-error>ASX1159: Cannot find view with name test.ds1 (in line 
30, at column 1)</expected-error>
         <expected-error>ASX1148: Cannot drop dataset test2.ds2 being used by 
view test1.v1</expected-error>
         <expected-error>ASX1148: Cannot drop function test2.f2() being used by 
view test1.v1</expected-error>
@@ -13700,9 +13700,9 @@
     <test-case FilePath="view">
       <compilation-unit name="view-2-negative">
         <output-dir compare="Text">none</output-dir>
-        <expected-error>ASX1050: Cannot find dataset with name v1 in dataverse 
test1 (in line 24, at column 17)</expected-error>
-        <expected-error>ASX1050: Cannot find dataset with name v2 in dataverse 
test1 (in line 24, at column 17)</expected-error>
-        <expected-error>ASX1050: Cannot find dataset with name v3 in dataverse 
test1 (in line 24, at column 1)</expected-error>
+        <expected-error replacers="cloud:Default.test1 def:test1">ASX1050: 
Cannot find dataset with name v1 in dataverse {0} (in line 24, at column 
17)</expected-error>
+        <expected-error replacers="cloud:Default.test1 def:test1">ASX1050: 
Cannot find dataset with name v2 in dataverse {0} (in line 24, at column 
17)</expected-error>
+        <expected-error replacers="cloud:Default.test1 def:test1">ASX1050: 
Cannot find dataset with name v3 in dataverse {0} (in line 24, at column 
1)</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="view">
@@ -13791,7 +13791,7 @@
     <test-case FilePath="load">
       <compilation-unit name="issue650_query">
         <output-dir compare="Text">none</output-dir>
-        <expected-error>Cannot find dataset with name Users in dataverse 
fuzzyjoin</expected-error>
+        <expected-error replacers="cloud:Default.fuzzyjoin 
def:fuzzyjoin">Cannot find dataset with name Users in dataverse 
{0}</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="load">
@@ -15075,7 +15075,7 @@
     <test-case FilePath="union">
       <compilation-unit name="union_negative">
         <output-dir compare="Text">union</output-dir>
-        <expected-error>Cannot find dataset t in dataverse TinySocial nor an 
alias with name t</expected-error>
+        <expected-error replacers="cloud:Default.TinySocial 
def:TinySocial">Cannot find dataset t in dataverse {0} nor an alias with name 
t</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="union">
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataUtil.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataUtil.java
index 539b8c4b43..75944575de 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataUtil.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/metadata/MetadataUtil.java
@@ -42,6 +42,10 @@ public class MetadataUtil {
         }
     }
 
+    public static String dataverseName(String databaseName, DataverseName 
dataverseName, boolean useDb) {
+        return useDb ? databaseName + "." + dataverseName : 
String.valueOf(dataverseName);
+    }
+
     public static String getFullyQualifiedDisplayName(DataverseName 
dataverseName, String objectName) {
         return dataverseName + "." + objectName;
     }
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
index e1ba3baf64..a4bca83f77 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
@@ -38,6 +38,7 @@ import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.metadata.DatasetFullyQualifiedName;
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.metadata.DependencyFullyQualifiedName;
+import org.apache.asterix.common.metadata.MetadataUtil;
 import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.IParser;
@@ -173,10 +174,12 @@ public class FunctionUtil {
                 try {
                     dv = metadataProvider.findDataverse(database, dataverse);
                 } catch (AlgebricksException e) {
-                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, e, sourceLoc, dataverse);
+                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, e, sourceLoc,
+                            MetadataUtil.dataverseName(database, dataverse, 
metadataProvider.isUsingDatabase()));
                 }
                 if (dv == null) {
-                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc, dataverse);
+                    throw new 
CompilationException(ErrorCode.UNKNOWN_DATAVERSE, sourceLoc,
+                            MetadataUtil.dataverseName(database, dataverse, 
metadataProvider.isUsingDatabase()));
                 }
             }
         }
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
index bad48c29b4..cbbb9de985 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
@@ -34,6 +34,7 @@ import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.metadata.DatasetFullyQualifiedName;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.MetadataUtil;
 import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Expression;
@@ -566,7 +567,8 @@ public class SqlppQueryRewriter implements IQueryRewriter {
                     targetNamespace = new Namespace(dv.getDatabaseName(), 
dv.getDataverseName());
                 }
             } catch (AlgebricksException e) {
-                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, e, 
sourceLoc, entityDataverseName);
+                throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, e, 
sourceLoc, MetadataUtil
+                        .dataverseName(entityDatabaseName, 
entityDataverseName, metadataProvider.isUsingDatabase()));
             }
         }
 
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
index 97a41712ad..346ad4f079 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
@@ -106,7 +106,7 @@ public class VariableCheckAndRewriteVisitor extends 
AbstractSqlppExpressionScopi
                             dataverseNamePart);
                 }
                 //TODO(DB): decide
-                String databaseName = MetadataUtil.resolveDatabase(null, 
dataverseName);
+                String databaseName = MetadataUtil.databaseFor(dataverseName);
                 String datasetName = fa.getIdent().getValue();
                 CallExpr datasetExpr =
                         resolveAsDataset(databaseName, dataverseName, 
datasetName, parent, leadingVarExpr);
@@ -196,7 +196,7 @@ public class VariableCheckAndRewriteVisitor extends 
AbstractSqlppExpressionScopi
         } else {
             Pair<Dataset, Boolean> p = findDataset(databaseName, 
dataverseName, datasetName, true, sourceLoc);
             if (p == null) {
-                throw createUnresolvableError(dataverseName, datasetName, 
sourceLoc);
+                throw createUnresolvableError(databaseName, dataverseName, 
datasetName, sourceLoc);
             }
             Dataset resolvedDataset = p.first;
             resolvedDatabaseName = resolvedDataset.getDatabaseName();
@@ -261,15 +261,23 @@ public class VariableCheckAndRewriteVisitor extends 
AbstractSqlppExpressionScopi
         }
     }
 
-    private CompilationException createUnresolvableError(DataverseName 
dataverseName, String datasetName,
-            SourceLocation sourceLoc) {
+    private CompilationException createUnresolvableError(String databaseName, 
DataverseName dataverseName,
+            String datasetName, SourceLocation sourceLoc) {
         DataverseName defaultDataverseName = 
metadataProvider.getDefaultNamespace().getDataverseName();
+        String defaultDatabaseName = 
metadataProvider.getDefaultNamespace().getDatabaseName();
         if (dataverseName == null && defaultDataverseName == null) {
             return new 
CompilationException(ErrorCode.NAME_RESOLVE_UNKNOWN_DATASET, sourceLoc, 
datasetName);
         }
+        boolean useDb = metadataProvider.isUsingDatabase();
+        String namespace;
+        if (dataverseName == null) {
+            namespace = MetadataUtil.dataverseName(defaultDatabaseName, 
defaultDataverseName, useDb);
+        } else {
+            namespace = MetadataUtil.dataverseName(databaseName, 
dataverseName, useDb);
+        }
         //If no available dataset nor in-scope variable to resolve to, we 
throw an error.
         return new 
CompilationException(ErrorCode.NAME_RESOLVE_UNKNOWN_DATASET_IN_DATAVERSE, 
sourceLoc, datasetName,
-                dataverseName == null ? defaultDataverseName : dataverseName);
+                namespace);
     }
 
     private Pair<Dataset, Boolean> findDataset(String databaseName, 
DataverseName dataverseName, String datasetName,
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
index 7d85568839..03d4bb82e1 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
@@ -935,7 +935,8 @@ public class MetadataNode implements IMetadataNode {
             forceDropDataverse(txnId, database, dataverseName);
         } catch (HyracksDataException e) {
             if (e.matches(ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY)) {
-                throw new AsterixException(UNKNOWN_DATAVERSE, e, 
dataverseName);
+                throw new AsterixException(UNKNOWN_DATAVERSE, e,
+                        MetadataUtil.dataverseName(database, dataverseName, 
mdIndexesProvider.isUsingDatabase()));
             } else {
                 throw new AsterixException(METADATA_ERROR, e, e.getMessage());
             }
@@ -970,7 +971,8 @@ public class MetadataNode implements IMetadataNode {
             boolean force) throws AlgebricksException {
         Dataset dataset = getDataset(txnId, database, dataverseName, 
datasetName);
         if (dataset == null) {
-            throw new AsterixException(UNKNOWN_DATASET_IN_DATAVERSE, 
datasetName, dataverseName);
+            throw new AsterixException(UNKNOWN_DATASET_IN_DATAVERSE, 
datasetName,
+                    MetadataUtil.dataverseName(database, dataverseName, 
mdIndexesProvider.isUsingDatabase()));
         }
         if (!force) {
             String datasetTypeDisplayName = 
DatasetUtil.getDatasetTypeDisplayName(dataset.getDatasetType());
@@ -3019,7 +3021,8 @@ public class MetadataNode implements IMetadataNode {
         } catch (HyracksDataException e) {
             if (e.matches(ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY)) {
                 throw new AsterixException(UNKNOWN_DATASET_IN_DATAVERSE, e, 
dataset.getDatasetName(),
-                        dataset.getDataverseName());
+                        MetadataUtil.dataverseName(dataset.getDatabaseName(), 
dataset.getDataverseName(),
+                                mdIndexesProvider.isUsingDatabase()));
             } else {
                 throw new AsterixException(METADATA_ERROR, e, e.getMessage());
             }
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataManagerUtil.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataManagerUtil.java
index 9b4c715354..8a8351749c 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataManagerUtil.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataManagerUtil.java
@@ -157,6 +157,7 @@ public class MetadataManagerUtil {
             DataverseName dataverseName, String datasetName) throws 
AlgebricksException {
         Dataset dataset = findDataset(mdTxnCtx, database, dataverseName, 
datasetName);
         if (dataset == null) {
+            //TODO(DB): include database
             throw new AsterixException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, 
datasetName, dataverseName);
         }
         return dataset;
@@ -229,6 +230,7 @@ public class MetadataManagerUtil {
             MetadataTransactionContext mdTxnCtx, DataSourceId id) throws 
AlgebricksException {
         Dataset dataset = findDataset(mdTxnCtx, id.getDatabaseName(), 
id.getDataverseName(), id.getDatasourceName());
         if (dataset == null) {
+            //TODO(DB): include database
             throw new AsterixException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, 
id.getDatasourceName(),
                     id.getDataverseName());
         }
@@ -241,6 +243,7 @@ public class MetadataManagerUtil {
                 datasourceType = DataSource.Type.EXTERNAL_DATASET;
                 break;
             default:
+                //TODO(DB): include database
                 throw new 
AsterixException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, id.getDatasourceName(),
                         id.getDataverseName());
         }
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 cfa8054974..b310271270 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
@@ -346,6 +346,10 @@ public class MetadataProvider implements 
IMetadataProvider<DataSourceId, String>
         return namespaceResolver;
     }
 
+    public boolean isUsingDatabase() {
+        return namespaceResolver.isUsingDatabase();
+    }
+
     public StorageProperties getStorageProperties() {
         return storageProperties;
     }
@@ -816,7 +820,8 @@ public class MetadataProvider implements 
IMetadataProvider<DataSourceId, String>
         String database = dataSource.getId().getDatabaseName();
         Dataset dataset = findDataset(database, dataverseName, datasetName);
         if (dataset == null) {
-            throw new AsterixException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, 
datasetName, dataverseName);
+            throw new AsterixException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, 
datasetName,
+                    MetadataUtil.dataverseName(database, dataverseName, 
isUsingDatabase()));
         }
         int numKeys = primaryKeys.size();
         int numFilterFields = DatasetUtil.getFilterField(dataset) == null ? 0 
: 1;
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
index fbd0670581..66192e01fa 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
@@ -284,8 +284,11 @@ public class Index implements IMetadataEntity<Index>, 
Comparable<Index> {
         if (result != 0) {
             return result;
         }
-        //TODO(DB): fix to also consider database
-        return dataverseName.compareTo(otherIndex.getDataverseName());
+        result = dataverseName.compareTo(otherIndex.getDataverseName());
+        if (result != 0) {
+            return result;
+        }
+        return databaseName.compareTo(otherIndex.getDatabaseName());
     }
 
     public byte resourceType() throws CompilationException {
@@ -308,6 +311,7 @@ public class Index implements IMetadataEntity<Index>, 
Comparable<Index> {
 
     @Override
     public String toString() {
+        //TODO(DB)
         return dataverseName + "." + datasetName + "." + indexName;
     }
 
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
index 4d1c4a656b..93802c2e47 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
@@ -367,7 +367,8 @@ public class DatasetUtil {
         DataverseName dataverseName = dataverse.getDataverseName();
         Dataset dataset = 
metadataProvider.findDataset(dataverse.getDatabaseName(), dataverseName, 
datasetName);
         if (dataset == null) {
-            throw new AsterixException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, 
datasetName, dataverseName);
+            throw new AsterixException(ErrorCode.UNKNOWN_DATASET_IN_DATAVERSE, 
datasetName, MetadataUtil
+                    .dataverseName(dataverse.getDatabaseName(), dataverseName, 
metadataProvider.isUsingDatabase()));
         }
         JobSpecification spec = 
RuntimeUtils.createJobSpecification(metadataProvider.getApplicationContext());
         PartitioningProperties partitioningProperties = 
metadataProvider.getPartitioningProperties(dataset);
@@ -636,6 +637,8 @@ public class DatasetUtil {
     /***
      * Creates a node group that is associated with a new dataset.
      *
+     * @param databaseName,
+     *            the database name of the dataset.
      * @param dataverseName,
      *            the dataverse name of the dataset.
      * @param datasetName,
@@ -647,14 +650,16 @@ public class DatasetUtil {
      * @return the name of the created node group.
      * @throws Exception
      */
-    public static String createNodeGroupForNewDataset(DataverseName 
dataverseName, String datasetName,
-            Set<String> ncNames, MetadataProvider metadataProvider) throws 
Exception {
-        return createNodeGroupForNewDataset(dataverseName, datasetName, 0L, 
ncNames, metadataProvider);
+    public static String createNodeGroupForNewDataset(String databaseName, 
DataverseName dataverseName,
+            String datasetName, Set<String> ncNames, MetadataProvider 
metadataProvider) throws Exception {
+        return createNodeGroupForNewDataset(databaseName, dataverseName, 
datasetName, 0L, ncNames, metadataProvider);
     }
 
     /***
      * Creates a node group that is associated with a new dataset.
      *
+     * @param databaseName,
+     *            the database name of the dataset.
      * @param dataverseName,
      *            the dataverse name of the dataset.
      * @param datasetName,
@@ -668,10 +673,12 @@ public class DatasetUtil {
      * @return the name of the created node group.
      * @throws Exception
      */
-    public static String createNodeGroupForNewDataset(DataverseName 
dataverseName, String datasetName,
-            long rebalanceCount, Set<String> ncNames, MetadataProvider 
metadataProvider) throws Exception {
+    public static String createNodeGroupForNewDataset(String databaseName, 
DataverseName dataverseName,
+            String datasetName, long rebalanceCount, Set<String> ncNames, 
MetadataProvider metadataProvider)
+            throws Exception {
         ICcApplicationContext appCtx = 
metadataProvider.getApplicationContext();
-        String nodeGroup = dataverseName.getCanonicalForm() + "." + datasetName
+        boolean useDb = 
metadataProvider.getNamespaceResolver().isUsingDatabase();
+        String nodeGroup = (useDb ? databaseName + "." : "") + 
dataverseName.getCanonicalForm() + "." + datasetName
                 + (rebalanceCount == 0L ? "" : "_" + rebalanceCount);
         MetadataTransactionContext mdTxnCtx = 
metadataProvider.getMetadataTxnContext();
         
appCtx.getMetadataLockManager().acquireNodeGroupWriteLock(metadataProvider.getLocks(),
 nodeGroup);
diff --git a/asterixdb/asterix-test-framework/src/main/resources/Catalog.xsd 
b/asterixdb/asterix-test-framework/src/main/resources/Catalog.xsd
index 303a4d7375..b3d27f4d0d 100644
--- a/asterixdb/asterix-test-framework/src/main/resources/Catalog.xsd
+++ b/asterixdb/asterix-test-framework/src/main/resources/Catalog.xsd
@@ -166,22 +166,36 @@
 
                   <!-- Zero or more expected errors for this query -->
 
-                  <xs:element name="expected-error" type="xs:string" 
minOccurs="0" maxOccurs="unbounded">
+                  <xs:element name="expected-error" minOccurs="0" 
maxOccurs="unbounded">
                      <xs:annotation>
                         <xs:documentation>
                            Zero or more expected errors for this query.
                         </xs:documentation>
                      </xs:annotation>
+                     <xs:complexType>
+                        <xs:simpleContent>
+                           <xs:extension base="xs:string">
+                              <xs:attribute name="replacers" 
type="test:str-list"/>
+                           </xs:extension>
+                        </xs:simpleContent>
+                     </xs:complexType>
                   </xs:element>
 
                   <!-- Zero or more expected warnings for this test -->
 
-                  <xs:element name="expected-warn" type="xs:string" 
minOccurs="0" maxOccurs="unbounded">
+                  <xs:element name="expected-warn" minOccurs="0" 
maxOccurs="unbounded">
                      <xs:annotation>
                         <xs:documentation>
                            Zero or more expected warnings for this query.
                         </xs:documentation>
                      </xs:annotation>
+                     <xs:complexType>
+                        <xs:simpleContent>
+                           <xs:extension base="xs:string">
+                              <xs:attribute name="replacers" 
type="test:str-list"/>
+                           </xs:extension>
+                        </xs:simpleContent>
+                     </xs:complexType>
                   </xs:element>
 
                   <!-- Whether the source location is expected in the error 
message -->
@@ -304,4 +318,8 @@
       </xs:restriction>
    </xs:simpleType>
 
+   <xs:simpleType name="str-list">
+      <xs:list itemType="xs:string" />
+   </xs:simpleType>
+
 </xs:schema>

Reply via email to