This is an automated email from the ASF dual-hosted git repository.
cgivre pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git
The following commit(s) were added to refs/heads/master by this push:
new 696233fede DRILL-8380: Remove customised SqlValidatorImpl.deriveAlias
(#2733)
696233fede is described below
commit 696233fede80b006d952b279d998ec7216d96f2b
Author: Volodymyr Vysotskyi <[email protected]>
AuthorDate: Tue Jan 17 15:08:05 2023 +0200
DRILL-8380: Remove customised SqlValidatorImpl.deriveAlias (#2733)
---
.../exec/store/cassandra/CassandraQueryTest.java | 2 +-
.../cassandra/CassandraUserTranslationTest.java | 5 +-
.../elasticsearch/ElasticSearchQueryTest.java | 2 +-
.../exec/store/jdbc/TestJdbcUserTranslation.java | 4 +-
.../store/splunk/TestSplunkUserTranslation.java | 5 +-
.../org/apache/calcite/jdbc/DynamicRootSchema.java | 36 +++++-
.../apache/drill/exec/ops/FragmentContextImpl.java | 10 ++
.../org/apache/drill/exec/ops/QueryContext.java | 10 ++
.../sql/conversion/DrillCalciteCatalogReader.java | 63 ++--------
.../planner/sql/conversion/DrillValidator.java | 140 ---------------------
.../planner/sql/conversion/DrillViewExpander.java | 5 +-
.../exec/planner/sql/conversion/SqlConverter.java | 45 ++++---
.../org/apache/drill/exec/store/SchemaConfig.java | 12 ++
.../drill/exec/store/SchemaTreeProvider.java | 10 ++
.../exec/store/dfs/WorkspaceSchemaFactory.java | 17 +++
.../drill/exec/work/metadata/MetadataProvider.java | 11 ++
.../apache/drill/alias/TestAliasSubstitution.java | 4 +-
.../impl/lateraljoin/TestLateralPlans.java | 4 +-
.../java/org/apache/drill/exec/sql/TestCTTAS.java | 46 +++----
.../store/dfs/TestSchemaNotFoundException.java | 20 ++-
.../drill/exec/store/store/TestDisabledPlugin.java | 11 +-
21 files changed, 190 insertions(+), 272 deletions(-)
diff --git
a/contrib/storage-cassandra/src/test/java/org/apache/drill/exec/store/cassandra/CassandraQueryTest.java
b/contrib/storage-cassandra/src/test/java/org/apache/drill/exec/store/cassandra/CassandraQueryTest.java
index 536a1027cd..d99b1bfa05 100644
---
a/contrib/storage-cassandra/src/test/java/org/apache/drill/exec/store/cassandra/CassandraQueryTest.java
+++
b/contrib/storage-cassandra/src/test/java/org/apache/drill/exec/store/cassandra/CassandraQueryTest.java
@@ -337,7 +337,7 @@ public class CassandraQueryTest extends BaseCassandraTest {
fail("Query didn't fail");
} catch (UserRemoteException e) {
assertThat(e.getMessage(), containsString("VALIDATION ERROR"));
- assertThat(e.getMessage(), containsString("Schema [[cassandra,
test_keyspace, non-existing]] is not valid with respect to either root schema
or current default schema"));
+ assertThat(e.getMessage(), containsString("Object 'non-existing' not
found within 'cassandra.test_keyspace'"));
}
}
diff --git
a/contrib/storage-cassandra/src/test/java/org/apache/drill/exec/store/cassandra/CassandraUserTranslationTest.java
b/contrib/storage-cassandra/src/test/java/org/apache/drill/exec/store/cassandra/CassandraUserTranslationTest.java
index f925fe3b44..82cf45205d 100644
---
a/contrib/storage-cassandra/src/test/java/org/apache/drill/exec/store/cassandra/CassandraUserTranslationTest.java
+++
b/contrib/storage-cassandra/src/test/java/org/apache/drill/exec/store/cassandra/CassandraUserTranslationTest.java
@@ -30,8 +30,9 @@ import static
org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorT
import static
org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.ADMIN_USER_PASSWORD;
import static
org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.TEST_USER_1;
import static
org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.TEST_USER_1_PASSWORD;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
@Category({SlowTest.class})
@@ -97,7 +98,7 @@ public class CassandraUserTranslationTest extends
BaseCassandraTest {
client.queryBuilder().sql(sql).rowSet();
fail();
} catch (UserRemoteException e) {
- assertTrue(e.getMessage().contains("Schema [[ut_cassandra,
test_keyspace]] is not valid"));
+ assertThat(e.getMessage(), containsString("Object 'ut_cassandra' not
found"));
}
}
}
diff --git
a/contrib/storage-elasticsearch/src/test/java/org/apache/drill/exec/store/elasticsearch/ElasticSearchQueryTest.java
b/contrib/storage-elasticsearch/src/test/java/org/apache/drill/exec/store/elasticsearch/ElasticSearchQueryTest.java
index ebfcb1324d..9a0f64ecf7 100644
---
a/contrib/storage-elasticsearch/src/test/java/org/apache/drill/exec/store/elasticsearch/ElasticSearchQueryTest.java
+++
b/contrib/storage-elasticsearch/src/test/java/org/apache/drill/exec/store/elasticsearch/ElasticSearchQueryTest.java
@@ -598,7 +598,7 @@ public class ElasticSearchQueryTest extends ClusterTest {
fail("Query didn't fail");
} catch (UserRemoteException e) {
assertThat(e.getMessage(), containsString("VALIDATION ERROR"));
- assertThat(e.getMessage(), containsString("Schema [[elastic,
non-existing]] is not valid with respect to either root schema or current
default schema"));
+ assertThat(e.getMessage(), containsString("Object 'non-existing' not
found within 'elastic'"));
}
}
diff --git
a/contrib/storage-jdbc/src/test/java/org/apache/drill/exec/store/jdbc/TestJdbcUserTranslation.java
b/contrib/storage-jdbc/src/test/java/org/apache/drill/exec/store/jdbc/TestJdbcUserTranslation.java
index 2b34a2853a..a1086d9a73 100644
---
a/contrib/storage-jdbc/src/test/java/org/apache/drill/exec/store/jdbc/TestJdbcUserTranslation.java
+++
b/contrib/storage-jdbc/src/test/java/org/apache/drill/exec/store/jdbc/TestJdbcUserTranslation.java
@@ -49,6 +49,8 @@ import static
org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorT
import static
org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.TEST_USER_1_PASSWORD;
import static
org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.TEST_USER_2;
import static
org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.TEST_USER_2_PASSWORD;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -163,7 +165,7 @@ public class TestJdbcUserTranslation extends ClusterTest {
client.queryBuilder().sql(sql).rowSet();
fail();
} catch (Exception e) {
- assertTrue(e.getMessage().contains("Schema [[mysql, drill_mysql_test]]
is not valid"));
+ assertThat(e.getMessage(), containsString("Object 'mysql' not found"));
}
}
diff --git
a/contrib/storage-splunk/src/test/java/org/apache/drill/exec/store/splunk/TestSplunkUserTranslation.java
b/contrib/storage-splunk/src/test/java/org/apache/drill/exec/store/splunk/TestSplunkUserTranslation.java
index 63de266e5f..d115b1ece2 100644
---
a/contrib/storage-splunk/src/test/java/org/apache/drill/exec/store/splunk/TestSplunkUserTranslation.java
+++
b/contrib/storage-splunk/src/test/java/org/apache/drill/exec/store/splunk/TestSplunkUserTranslation.java
@@ -31,8 +31,9 @@ import static
org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorT
import static
org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.ADMIN_USER_PASSWORD;
import static
org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.TEST_USER_1;
import static
org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.TEST_USER_1_PASSWORD;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
@Category({SlowTest.class})
@@ -97,7 +98,7 @@ public class TestSplunkUserTranslation extends SplunkBaseTest
{
client.queryBuilder().sql(sql).rowSet();
fail();
} catch (UserRemoteException e) {
- assertTrue(e.getMessage().contains("Schema [[ut_splunk]] is not valid"));
+ assertThat(e.getMessage(), containsString("Object 'ut_splunk' not
found"));
}
}
}
diff --git
a/exec/java-exec/src/main/java/org/apache/calcite/jdbc/DynamicRootSchema.java
b/exec/java-exec/src/main/java/org/apache/calcite/jdbc/DynamicRootSchema.java
index 380f0d52a2..71925a28b5 100644
---
a/exec/java-exec/src/main/java/org/apache/calcite/jdbc/DynamicRootSchema.java
+++
b/exec/java-exec/src/main/java/org/apache/calcite/jdbc/DynamicRootSchema.java
@@ -18,13 +18,13 @@
package org.apache.calcite.jdbc;
import org.apache.calcite.DataContext;
-
import org.apache.calcite.linq4j.tree.Expression;
import org.apache.calcite.linq4j.tree.Expressions;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.calcite.util.BuiltInMethod;
import org.apache.drill.common.exceptions.UserException;
import org.apache.drill.common.exceptions.UserExceptionUtils;
+import org.apache.drill.common.expression.PathSegment;
import org.apache.drill.common.expression.SchemaPath;
import org.apache.drill.exec.ExecConstants;
import org.apache.drill.exec.alias.AliasRegistryProvider;
@@ -89,7 +89,7 @@ public class DynamicRootSchema extends DynamicSchema {
return retSchema;
}
- public SchemaPath resolveTableAlias(String alias) {
+ private SchemaPath resolveTableAlias(String alias) {
return Optional.ofNullable(aliasRegistryProvider.getTableAliasesRegistry()
.getUserAliases(schemaConfig.getUserName()).get(alias))
.map(SchemaPath::parseFromString)
@@ -218,9 +218,39 @@ public class DynamicRootSchema extends DynamicSchema {
}
}
+ @Override
+ protected TableEntry getImplicitTable(String tableName, boolean
caseSensitive) {
+ return Optional.ofNullable(getTemporaryTable(tableName, caseSensitive))
+ .<TableEntry>map(table -> new TableEntryImpl(this, tableName,
table.getTable(), table.sqls))
+ .orElse(super.getImplicitTable(tableName, true));
+ }
+
+ private TableEntry getTemporaryTable(String tableName, boolean
caseSensitive) {
+ CalciteSchema currentSchema = this;
+
+ PathSegment.NameSegment pathSegment =
+
Optional.ofNullable(resolveTableAlias(SchemaPath.getCompoundPath(tableName).toExpr()))
+ .map(SchemaPath::getRootSegment)
+ .orElse(null);
+
+ if (pathSegment == null) {
+ return null;
+ }
+
+ while (!pathSegment.isLastPath()) {
+ currentSchema =
currentSchema.getImplicitSubSchema(pathSegment.getPath(), caseSensitive);
+ pathSegment = pathSegment.getChild().getNameSegment();
+ }
+
+ if (currentSchema != null) {
+ return currentSchema.getTable(pathSegment.getNameSegment().getPath(),
caseSensitive);
+ }
+ return null;
+ }
+
public static class RootSchema extends AbstractSchema {
- private StoragePluginRegistry storages;
+ private final StoragePluginRegistry storages;
public RootSchema(StoragePluginRegistry storages) {
super(Collections.emptyList(), ROOT_SCHEMA_NAME);
diff --git
a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContextImpl.java
b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContextImpl.java
index dafbf883d6..87dbcb4cab 100644
---
a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContextImpl.java
+++
b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContextImpl.java
@@ -727,5 +727,15 @@ public class FragmentContextImpl extends
BaseFragmentContext implements Executor
public OptionValue getOption(String optionKey) {
return optionManager.getOption(optionKey);
}
+
+ @Override
+ public String getTemporaryTableName(String table) {
+ throw new UnsupportedOperationException("getTemporaryTableName is not
supported");
+ }
+
+ @Override
+ public String getTemporaryWorkspace() {
+ throw new UnsupportedOperationException("getTemporaryWorkspace is not
supported");
+ }
}
}
diff --git
a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java
b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java
index 3aef43c01b..9ac1df0bae 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java
@@ -274,6 +274,16 @@ public class QueryContext implements AutoCloseable,
OptimizerRulesContext, Schem
return getOptions().getOption(optionKey);
}
+ @Override
+ public String getTemporaryTableName(String table) {
+ return session.resolveTemporaryTableName(table);
+ }
+
+ @Override
+ public String getTemporaryWorkspace() {
+ return getConfig().getString(ExecConstants.DEFAULT_TEMPORARY_WORKSPACE);
+ }
+
public boolean isImpersonationEnabled() {
return getConfig().getBoolean(ExecConstants.IMPERSONATION_ENABLED);
}
diff --git
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/DrillCalciteCatalogReader.java
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/DrillCalciteCatalogReader.java
index b6fdcc5ccf..244e8dc5d1 100644
---
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/DrillCalciteCatalogReader.java
+++
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/DrillCalciteCatalogReader.java
@@ -17,25 +17,20 @@
*/
package org.apache.drill.exec.planner.sql.conversion;
-import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.function.BooleanSupplier;
-import java.util.function.Supplier;
import org.apache.calcite.adapter.java.JavaTypeFactory;
import org.apache.calcite.config.CalciteConnectionConfigImpl;
import org.apache.calcite.config.CalciteConnectionProperty;
-import org.apache.calcite.jdbc.CalciteSchema;
import org.apache.calcite.jdbc.DynamicSchema;
import org.apache.calcite.prepare.CalciteCatalogReader;
import org.apache.calcite.prepare.Prepare;
import org.apache.calcite.schema.SchemaPlus;
-import org.apache.calcite.sql.validate.SqlValidatorUtil;
-import org.apache.calcite.util.Util;
+import org.apache.calcite.sql.validate.SqlNameMatchers;
import org.apache.drill.common.config.DrillConfig;
import org.apache.drill.common.exceptions.UserException;
-import org.apache.drill.common.util.DrillStringUtils;
import org.apache.drill.exec.metastore.MetadataProviderManager;
import org.apache.drill.exec.planner.logical.DrillTable;
import org.apache.drill.exec.planner.sql.SchemaUtilites;
@@ -58,10 +53,8 @@ class DrillCalciteCatalogReader extends CalciteCatalogReader
{
private final DrillConfig drillConfig;
private final UserSession session;
- private final String temporarySchema;
private boolean allowTemporaryTables;
private final BooleanSupplier useRootSchema;
- private final Supplier<SchemaPlus> defaultSchemaSupplier;
private final LoadingCache<DrillTableKey, MetadataProviderManager>
tableCache;
@@ -71,11 +64,10 @@ class DrillCalciteCatalogReader extends
CalciteCatalogReader {
JavaTypeFactory typeFactory,
DrillConfig drillConfig,
UserSession session,
- String temporarySchema,
- BooleanSupplier useRootSchema,
- Supplier<SchemaPlus> defaultSchemaSupplier) {
- super(DynamicSchema.from(rootSchema), defaultSchema,
- typeFactory, getConnectionConfig(caseSensitive));
+ BooleanSupplier useRootSchema) {
+ super(DynamicSchema.from(rootSchema),
SqlNameMatchers.withCaseSensitive(caseSensitive),
+ ImmutableList.of(defaultSchema, ImmutableList.of()),
+ typeFactory, getConnectionConfig(caseSensitive));
this.drillConfig = drillConfig;
this.session = session;
this.allowTemporaryTables = true;
@@ -87,9 +79,7 @@ class DrillCalciteCatalogReader extends CalciteCatalogReader {
return key.getMetadataProviderManager();
}
});
- this.temporarySchema = temporarySchema;
this.useRootSchema = useRootSchema;
- this.defaultSchemaSupplier = defaultSchemaSupplier;
}
/**
@@ -99,19 +89,6 @@ class DrillCalciteCatalogReader extends CalciteCatalogReader
{
this.allowTemporaryTables = false;
}
- List<String> getTemporaryNames(List<String> names) {
- if (needsTemporaryTableCheck(names, session.getDefaultSchemaPath(),
drillConfig)) {
- String tableName =
DrillStringUtils.removeLeadingSlash(names.get(names.size() - 1));
- String temporaryTableName = session.resolveTemporaryTableName(tableName);
- if (temporaryTableName != null) {
- List<String> temporaryNames = new
ArrayList<>(SchemaUtilites.getSchemaPathAsList(temporarySchema));
- temporaryNames.add(temporaryTableName);
- return temporaryNames;
- }
- }
- return null;
- }
-
/**
* If schema is not indicated (only one element in the list) or schema is
default temporary workspace,
* we need to check among session temporary tables in default temporary
workspace first.
@@ -135,14 +112,15 @@ class DrillCalciteCatalogReader extends
CalciteCatalogReader {
}
private void checkTemporaryTable(List<String> names) {
- if (allowTemporaryTables) {
+ if (allowTemporaryTables || !needsTemporaryTableCheck(names,
session.getDefaultSchemaPath(), drillConfig)) {
return;
}
- String originalTableName =
session.getOriginalTableNameFromTemporaryTable(names.get(names.size() - 1));
+ String tableName = names.get(names.size() - 1);
+ String originalTableName = session.resolveTemporaryTableName(tableName);
if (originalTableName != null) {
throw UserException
.validationError()
- .message("Temporary tables usage is disallowed. Used temporary table
name: [%s].", originalTableName)
+ .message("A reference to temporary table [%s] was made in a context
where temporary table references are not allowed.", tableName)
.build(logger);
}
}
@@ -155,29 +133,6 @@ class DrillCalciteCatalogReader extends
CalciteCatalogReader {
return super.getSchemaPaths();
}
- /**
- * Checks if the schema provided is a valid schema:
- * <li>schema is not indicated (only one element in the names list)<li/>
- *
- * @param names list of schema and table names, table name is always the
last element
- * @throws UserException if the schema is not valid.
- */
- void isValidSchema(List<String> names) throws UserException {
- List<String> schemaPath = Util.skipLast(names);
-
- for (List<String> currentSchema : getSchemaPaths()) {
- List<String> fullSchemaPath = new ArrayList<>(currentSchema);
- fullSchemaPath.addAll(schemaPath);
- CalciteSchema schema = SqlValidatorUtil.getSchema(getRootSchema(),
- fullSchemaPath, nameMatcher());
-
- if (schema != null) {
- return;
- }
- }
- SchemaUtilites.throwSchemaNotFoundException(defaultSchemaSupplier.get(),
schemaPath);
- }
-
/**
* We should check if passed table is temporary or not if:
* <li>schema is not indicated (only one element in the names list)<li/>
diff --git
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/DrillValidator.java
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/DrillValidator.java
deleted file mode 100644
index 5de8a3492e..0000000000
---
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/DrillValidator.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.drill.exec.planner.sql.conversion;
-
-import org.apache.calcite.jdbc.CalciteSchema;
-import org.apache.calcite.jdbc.DynamicRootSchema;
-import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.rel.type.RelDataTypeFactory;
-import org.apache.calcite.sql.SqlCall;
-import org.apache.calcite.sql.SqlIdentifier;
-import org.apache.calcite.sql.SqlKind;
-import org.apache.calcite.sql.SqlNode;
-import org.apache.calcite.sql.SqlOperatorTable;
-import org.apache.calcite.sql.parser.SqlParserPos;
-import org.apache.calcite.sql.validate.SqlConformance;
-import org.apache.calcite.sql.validate.SqlValidatorCatalogReader;
-import org.apache.calcite.sql.validate.SqlValidatorImpl;
-import org.apache.calcite.sql.validate.SqlValidatorScope;
-import org.apache.calcite.sql.validate.SqlValidatorUtil;
-import org.apache.calcite.util.Static;
-import org.apache.drill.common.expression.PathSegment;
-import org.apache.drill.common.expression.SchemaPath;
-import org.apache.drill.exec.util.ImpersonationUtil;
-import org.apache.drill.shaded.guava.com.google.common.collect.Lists;
-
-import java.security.PrivilegedAction;
-import java.util.ArrayList;
-import java.util.List;
-
-class DrillValidator extends SqlValidatorImpl {
-
- private final boolean isImpersonationEnabled;
-
- DrillValidator(SqlOperatorTable opTab, SqlValidatorCatalogReader
catalogReader,
- RelDataTypeFactory typeFactory, SqlConformance conformance,
boolean isImpersonationEnabled) {
- super(opTab, catalogReader, typeFactory,
- Config.DEFAULT.withConformance(conformance)
- .withTypeCoercionEnabled(true)
- .withIdentifierExpansion(true));
- this.isImpersonationEnabled = isImpersonationEnabled;
- }
-
- @Override
- protected void validateFrom(SqlNode node, RelDataType targetRowType,
SqlValidatorScope scope) {
- if (node.getKind() == SqlKind.AS) {
- SqlCall sqlCall = (SqlCall) node;
- SqlNode sqlNode = sqlCall.operand(0);
- switch (sqlNode.getKind()) {
- case IDENTIFIER:
- SqlIdentifier tempNode = (SqlIdentifier) sqlNode;
- changeNamesIfTableIsTemporary(tempNode);
- replaceAliasWithActualName(tempNode);
- // Check the schema and throw a valid SchemaNotFound exception
instead of TableNotFound exception.
- ((DrillCalciteCatalogReader)
getCatalogReader()).isValidSchema(tempNode.names);
- break;
- case UNNEST:
- if (sqlCall.operandCount() < 3) {
- throw Static.RESOURCE.validationError("Alias table and column name
are required for UNNEST").ex();
- }
- }
- }
- if (isImpersonationEnabled) {
- ImpersonationUtil.getProcessUserUGI().doAs((PrivilegedAction<Void>) ()
-> {
- super.validateFrom(node, targetRowType, scope);
- return null;
- });
- } else {
- super.validateFrom(node, targetRowType, scope);
- }
- }
-
- private void replaceAliasWithActualName(SqlIdentifier tempNode) {
- CalciteSchema schema = getCatalogReader().getRootSchema();
- if (schema instanceof DynamicRootSchema) {
- DynamicRootSchema rootSchema = (DynamicRootSchema) schema;
- String alias = SchemaPath.getCompoundPath(tempNode.names.toArray(new
String[0])).toExpr();
- SchemaPath actualPath = rootSchema.resolveTableAlias(alias);
- if (actualPath != null) {
- List<String> names = new ArrayList<>();
- PathSegment pathSegment = actualPath.getRootSegment();
- while (pathSegment != null) {
- names.add(pathSegment.getNameSegment().getPath());
- pathSegment = pathSegment.getChild();
- }
- changeNames(tempNode, names);
- }
- }
- }
-
- @Override
- public String deriveAlias(SqlNode node, int ordinal) {
- if (node instanceof SqlIdentifier) {
- SqlIdentifier sqlIdentifier = (SqlIdentifier) node;
- changeNamesIfTableIsTemporary(sqlIdentifier);
- replaceAliasWithActualName(sqlIdentifier);
- }
- return SqlValidatorUtil.getAlias(node, ordinal);
- }
-
- @Override
- protected void inferUnknownTypes(RelDataType inferredType, SqlValidatorScope
scope, SqlNode node) {
- // calls validateQuery() for SqlSelect to be sure that temporary table
name will be changed
- // for the case when it is used in sub-select
- if (node.getKind() == SqlKind.SELECT) {
- validateQuery(node, scope, inferredType);
- }
- super.inferUnknownTypes(inferredType, scope, node);
- }
-
- private void changeNamesIfTableIsTemporary(SqlIdentifier tempNode) {
- List<String> temporaryTableNames = ((DrillCalciteCatalogReader)
getCatalogReader()).getTemporaryNames(tempNode.names);
- if (temporaryTableNames != null) {
- changeNames(tempNode, temporaryTableNames);
- }
- }
-
- private void changeNames(SqlIdentifier sqlIdentifier, List<String> newNames)
{
- SqlParserPos pos = sqlIdentifier.getComponentParserPosition(0);
- List<SqlParserPos> poses = Lists.newArrayList();
- for (int i = 0; i < newNames.size(); i++) {
- poses.add(i, pos);
- }
- sqlIdentifier.setNames(newNames, poses);
- }
-}
diff --git
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/DrillViewExpander.java
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/DrillViewExpander.java
index 6e9e0dac93..2f4f3fc2af 100644
---
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/DrillViewExpander.java
+++
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/DrillViewExpander.java
@@ -68,9 +68,8 @@ public class DrillViewExpander implements
RelOptTable.ViewExpander {
sqlConverter.getTypeFactory(),
sqlConverter.getDrillConfig(),
sqlConverter.getSession(),
- sqlConverter.getTemporarySchema(),
- sqlConverter::useRootSchema,
- sqlConverter::getDefaultSchema);
+ sqlConverter::useRootSchema
+ );
}
private SchemaPlus findSchema(String queryString, SchemaPlus rootSchema,
List<String> schemaPath) {
diff --git
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/SqlConverter.java
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/SqlConverter.java
index 76452bb288..303db43b3f 100644
---
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/SqlConverter.java
+++
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/conversion/SqlConverter.java
@@ -17,11 +17,6 @@
*/
package org.apache.drill.exec.planner.sql.conversion;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-
import org.apache.calcite.adapter.java.JavaTypeFactory;
import org.apache.calcite.avatica.util.Casing;
import org.apache.calcite.jdbc.DynamicSchema;
@@ -46,6 +41,8 @@ import org.apache.calcite.sql.parser.SqlParseException;
import org.apache.calcite.sql.parser.SqlParser;
import org.apache.calcite.sql.util.ChainedSqlOperatorTable;
import org.apache.calcite.sql.validate.SqlConformance;
+import org.apache.calcite.sql.validate.SqlValidator;
+import org.apache.calcite.sql.validate.SqlValidatorUtil;
import org.apache.calcite.sql2rel.SqlToRelConverter;
import org.apache.drill.common.config.DrillConfig;
import org.apache.drill.common.exceptions.UserException;
@@ -65,10 +62,17 @@ import
org.apache.drill.exec.planner.sql.parser.impl.DrillParserWithCompoundIdCo
import org.apache.drill.exec.planner.sql.parser.impl.DrillSqlParseException;
import org.apache.drill.exec.planner.types.DrillRelDataTypeSystem;
import org.apache.drill.exec.rpc.user.UserSession;
+import org.apache.drill.exec.util.ImpersonationUtil;
import org.apache.drill.exec.util.Utilities;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.security.PrivilegedAction;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
/**
* Class responsible for managing:
* <ul>
@@ -89,7 +93,7 @@ public class SqlConverter {
private final SchemaPlus defaultSchema;
private final SqlOperatorTable opTab;
private final RelOptCostFactory costFactory;
- private final DrillValidator validator;
+ private final SqlValidator validator;
private final boolean isInnerQuery;
private final boolean isExpandedView;
private final QueryContext util;
@@ -102,6 +106,7 @@ public class SqlConverter {
private RelOptCluster cluster;
private VolcanoPlanner planner;
private boolean useRootSchema = false;
+ private final boolean isImpersonationEnabled;
public SqlConverter(QueryContext context) {
this.settings = context.getPlannerSettings();
@@ -143,13 +148,15 @@ public class SqlConverter {
typeFactory,
drillConfig,
session,
- temporarySchema,
- this::useRootSchema,
- this::getDefaultSchema);
+ this::useRootSchema
+ );
this.opTab = new
ChainedSqlOperatorTable(Arrays.asList(context.getDrillOperatorTable(),
catalog));
this.costFactory = (settings.useDefaultCosting()) ? null : new
DrillCostBase.DrillCostFactory();
- this.validator =
- new DrillValidator(opTab, catalog, typeFactory,
parserConfig.conformance(), context.isImpersonationEnabled());
+ this.validator = SqlValidatorUtil.newValidator(opTab, catalog, typeFactory,
+ SqlValidator.Config.DEFAULT.withConformance(parserConfig.conformance())
+ .withTypeCoercionEnabled(true)
+ .withIdentifierExpansion(true));
+ this.isImpersonationEnabled = context.isImpersonationEnabled();
cluster = null;
}
@@ -169,12 +176,15 @@ public class SqlConverter {
this.catalog = catalog;
this.opTab = parent.opTab;
this.planner = parent.planner;
- this.validator =
- new DrillValidator(opTab, catalog, typeFactory,
parserConfig.conformance(), util.isImpersonationEnabled());
+ this.validator = SqlValidatorUtil.newValidator(opTab, catalog, typeFactory,
+ SqlValidator.Config.DEFAULT.withConformance(parserConfig.conformance())
+ .withTypeCoercionEnabled(true)
+ .withIdentifierExpansion(true));
this.temporarySchema = parent.temporarySchema;
this.session = parent.session;
this.drillConfig = parent.drillConfig;
this.cluster = parent.cluster;
+ this.isImpersonationEnabled = util.isImpersonationEnabled();
}
public SqlNode parse(String sql) {
@@ -195,7 +205,12 @@ public class SqlConverter {
public SqlNode validate(final SqlNode parsedNode) {
try {
- return validator.validate(parsedNode);
+ if (isImpersonationEnabled) {
+ return ImpersonationUtil.getProcessUserUGI().doAs(
+ (PrivilegedAction<SqlNode>) () -> validator.validate(parsedNode));
+ } else {
+ return validator.validate(parsedNode);
+ }
} catch (RuntimeException e) {
UserException.Builder builder = UserException
.validationError(e);
@@ -237,7 +252,7 @@ public class SqlConverter {
return validator.getValidatedNodeType(validatedNode);
}
- public DrillValidator getValidator() {
+ public SqlValidator getValidator() {
return validator;
}
diff --git
a/exec/java-exec/src/main/java/org/apache/drill/exec/store/SchemaConfig.java
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/SchemaConfig.java
index 19906fad0d..71b9304418 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/SchemaConfig.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/SchemaConfig.java
@@ -40,6 +40,14 @@ public class SchemaConfig {
this.ignoreAuthErrors = ignoreAuthErrors;
}
+ public String getTemporaryTableName(String table) {
+ return provider.getTemporaryTableName(table);
+ }
+
+ public String getTemporaryWorkspace() {
+ return provider.getTemporaryWorkspace();
+ }
+
/**
* Create new builder.
* @param userName Name of the user accessing the storage sources.
@@ -113,5 +121,9 @@ public class SchemaConfig {
UserCredentials getQueryUserCredentials();
OptionValue getOption(String optionKey);
+
+ String getTemporaryTableName(String table);
+
+ String getTemporaryWorkspace();
}
}
diff --git
a/exec/java-exec/src/main/java/org/apache/drill/exec/store/SchemaTreeProvider.java
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/SchemaTreeProvider.java
index 3ab26435f8..5c698ec74b 100644
---
a/exec/java-exec/src/main/java/org/apache/drill/exec/store/SchemaTreeProvider.java
+++
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/SchemaTreeProvider.java
@@ -71,6 +71,16 @@ public class SchemaTreeProvider implements AutoCloseable {
return options.getOption(optionKey);
}
+ @Override
+ public String getTemporaryTableName(String table) {
+ throw new UnsupportedOperationException("getTemporaryTableName is not
supported");
+ }
+
+ @Override
+ public String getTemporaryWorkspace() {
+ throw new UnsupportedOperationException("getTemporaryWorkspace is not
supported");
+ }
+
@Override public SchemaPlus getRootSchema(String userName) {
return createRootSchema(userName, this);
}
diff --git
a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/WorkspaceSchemaFactory.java
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/WorkspaceSchemaFactory.java
index b117b43f35..7023d81611 100644
---
a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/WorkspaceSchemaFactory.java
+++
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/WorkspaceSchemaFactory.java
@@ -63,6 +63,7 @@ import org.apache.drill.exec.planner.logical.DrillViewTable;
import org.apache.drill.exec.planner.logical.DynamicDrillTable;
import org.apache.drill.exec.planner.logical.FileSystemCreateTableEntry;
import org.apache.drill.exec.planner.sql.ExpandingConcurrentMap;
+import org.apache.drill.exec.planner.sql.SchemaUtilites;
import org.apache.drill.exec.record.metadata.schema.FsMetastoreSchemaProvider;
import org.apache.drill.exec.store.AbstractSchema;
import org.apache.drill.exec.store.PartitionNotFoundException;
@@ -403,8 +404,24 @@ public class WorkspaceSchemaFactory {
return f.getView(mapper);
}
+ private String getTemporaryName(String name) {
+ if (isTemporaryWorkspace()) {
+ String tableName = DrillStringUtils.removeLeadingSlash(name);
+ return schemaConfig.getTemporaryTableName(tableName);
+ }
+ return null;
+ }
+
+ private boolean isTemporaryWorkspace() {
+ return
SchemaUtilites.getSchemaPath(schemaPath).equals(schemaConfig.getTemporaryWorkspace());
+ }
+
@Override
public Table getTable(String tableName) {
+ String temporaryName = getTemporaryName(tableName);
+ if (temporaryName != null) {
+ tableName = temporaryName;
+ }
TableInstance tableKey = new TableInstance(TableSignature.of(tableName),
ImmutableList.of());
// first check existing tables.
if (tables.alreadyContainsKey(tableKey)) {
diff --git
a/exec/java-exec/src/main/java/org/apache/drill/exec/work/metadata/MetadataProvider.java
b/exec/java-exec/src/main/java/org/apache/drill/exec/work/metadata/MetadataProvider.java
index 2d2dd90589..f9c01958ed 100644
---
a/exec/java-exec/src/main/java/org/apache/drill/exec/work/metadata/MetadataProvider.java
+++
b/exec/java-exec/src/main/java/org/apache/drill/exec/work/metadata/MetadataProvider.java
@@ -37,6 +37,7 @@ import org.apache.calcite.schema.SchemaPlus;
import org.apache.drill.common.FunctionNames;
import org.apache.drill.common.config.DrillConfig;
import org.apache.drill.common.exceptions.ErrorHelper;
+import org.apache.drill.exec.ExecConstants;
import org.apache.drill.exec.ops.ViewExpansionContext;
import org.apache.drill.exec.proto.UserBitShared.DrillPBError;
import org.apache.drill.exec.proto.UserBitShared.DrillPBError.ErrorType;
@@ -607,6 +608,16 @@ public class MetadataProvider {
@Override public UserCredentials getQueryUserCredentials() {
return session.getCredentials();
}
+
+ @Override
+ public String getTemporaryTableName(String table) {
+ return session.resolveTemporaryTableName(table);
+ }
+
+ @Override
+ public String getTemporaryWorkspace() {
+ return config.getString(ExecConstants.DEFAULT_TEMPORARY_WORKSPACE);
+ }
};
}
diff --git
a/exec/java-exec/src/test/java/org/apache/drill/alias/TestAliasSubstitution.java
b/exec/java-exec/src/test/java/org/apache/drill/alias/TestAliasSubstitution.java
index 6266c8ccd4..c84d4905ca 100644
---
a/exec/java-exec/src/test/java/org/apache/drill/alias/TestAliasSubstitution.java
+++
b/exec/java-exec/src/test/java/org/apache/drill/alias/TestAliasSubstitution.java
@@ -157,7 +157,7 @@ public class TestAliasSubstitution extends ClusterTest {
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(),
- containsString("VALIDATION ERROR: Schema [[foobar]] is not valid with
respect to either root schema or current default schema"));
+ containsString("Object 'foobar' not found: Object 'foobar' not
found"));
} finally {
storageAliasesRegistry.deletePublicAliases();
client.resetSystem(ExecConstants.ENABLE_ALIASES);
@@ -219,7 +219,7 @@ public class TestAliasSubstitution extends ClusterTest {
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(),
- containsString("VALIDATION ERROR: Schema [[foobar]] is not valid with
respect to either root schema or current default schema."));
+ containsString("Object 'foobar' not found: Object 'foobar' not
found"));
} finally {
storageAliasesRegistry.deleteUserAliases(TEST_USER_2);
}
diff --git
a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/lateraljoin/TestLateralPlans.java
b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/lateraljoin/TestLateralPlans.java
index b716aaba9c..05d7df5c62 100644
---
a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/lateraljoin/TestLateralPlans.java
+++
b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/lateraljoin/TestLateralPlans.java
@@ -303,7 +303,7 @@ public class TestLateralPlans extends BaseTestQuery {
.sql(sql)
.run();
} catch (UserRemoteException ex) {
- assertTrue(ex.getMessage().contains("Alias table and column name are
required for UNNEST"));
+ assertThat(ex.getMessage(), containsString("Alias table and column name
are required for UNNEST"));
}
}
@@ -320,7 +320,7 @@ public class TestLateralPlans extends BaseTestQuery {
.sql(sql)
.run();
} catch (UserRemoteException ex) {
- assertTrue(ex.getMessage().contains("Alias table and column name are
required for UNNEST"));
+ assertThat(ex.getMessage(), containsString("Column 'orders' not found in
table 't2'"));
}
}
diff --git
a/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestCTTAS.java
b/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestCTTAS.java
index 187e794551..41ed71e3d5 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestCTTAS.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestCTTAS.java
@@ -89,17 +89,11 @@ public class TestCTTAS extends BaseTestQuery {
test("create TEMPORARY table %s as select 'A' as c1 from (values(1))",
temporaryTableName);
testBuilder()
- .sqlQuery("select * from %s", temporaryTableName)
+ .sqlQuery("select * from %s.%s", DFS_TMP_SCHEMA,
temporaryTableName)
.unOrdered()
.baselineColumns("c1")
.baselineValues("A")
.go();
-
- testBuilder()
- .sqlQuery("select * from %s", temporaryTableName)
- .unOrdered()
- .sqlBaselineQuery("select * from %s.%s", DFS_TMP_SCHEMA,
temporaryTableName)
- .go();
}
} finally {
resetSessionOption("store.format");
@@ -117,7 +111,7 @@ public class TestCTTAS extends BaseTestQuery {
test("create TEMPORARY table %s as select 'A' as c1 from (values(1))",
temporaryTableName);
for (String tableName : temporaryTableNames) {
testBuilder()
- .sqlQuery("select * from %s", tableName)
+ .sqlQuery("select * from %s.%s", DFS_TMP_SCHEMA, tableName)
.unOrdered()
.baselineColumns("c1")
.baselineValues("A")
@@ -237,7 +231,8 @@ public class TestCTTAS extends BaseTestQuery {
test("create TEMPORARY table %s as select 'A' as c1, 'C' as c2 from
(values(1))", temporaryRightTableName);
testBuilder()
- .sqlQuery("select t1.c2 col1, t2.c2 col2 from %s t1 join %s t2 on
t1.c1 = t2.c1", temporaryLeftTableName, temporaryRightTableName)
+ .sqlQuery("select t1.c2 col1, t2.c2 col2 from %s.%s t1 join %s.%s t2
on t1.c1 = t2.c1",
+ DFS_TMP_SCHEMA, temporaryLeftTableName, DFS_TMP_SCHEMA,
temporaryRightTableName)
.unOrdered()
.baselineColumns("col1", "col2")
.baselineValues("B", "C")
@@ -251,13 +246,6 @@ public class TestCTTAS extends BaseTestQuery {
test("create TEMPORARY table %s as select 'temporary_table' as c1 from
(values(1))", name);
test("create table %s as select 'persistent_table' as c1 from
(values(1))", name);
- testBuilder()
- .sqlQuery("select * from %s", name)
- .unOrdered()
- .baselineColumns("c1")
- .baselineValues("temporary_table")
- .go();
-
testBuilder()
.sqlQuery("select * from %s.%s", temp2_schema, name)
.unOrdered()
@@ -283,7 +271,7 @@ public class TestCTTAS extends BaseTestQuery {
test("create view %s as select 'view' as c1 from (values(1))", name);
testBuilder()
- .sqlQuery("select * from %s", name)
+ .sqlQuery("select * from %s.%s", DFS_TMP_SCHEMA, name)
.unOrdered()
.baselineColumns("c1")
.baselineValues("temporary_table")
@@ -312,9 +300,9 @@ public class TestCTTAS extends BaseTestQuery {
test("create TEMPORARY table %s as select 'A' as c1 from (values(1))",
temporaryTableName);
expectUserRemoteExceptionWithMessage(String.format(
- "VALIDATION ERROR: Temporary tables usage is disallowed. Used temporary
table name: [%s]", temporaryTableName));
+ "VALIDATION ERROR: A reference to temporary table [%s] was made in a
context where temporary table references are not allowed.",
temporaryTableName));
- test("create view %s.view_with_temp_table as select * from %s",
DFS_TMP_SCHEMA, temporaryTableName);
+ test("create view %s.view_with_temp_table as select * from %s.%s",
DFS_TMP_SCHEMA, DFS_TMP_SCHEMA, temporaryTableName);
}
@Test
@@ -336,7 +324,7 @@ public class TestCTTAS extends BaseTestQuery {
test("create temporary table %s as select 'TEMP' as c1 from (values(1))",
tableName);
expectUserRemoteExceptionWithMessage(String.format(
- "VALIDATION ERROR: Temporary tables usage is disallowed. Used temporary
table name: [%s]", tableName));
+ "VALIDATION ERROR: A reference to temporary table [%s] was made in a
context where temporary table references are not allowed.", tableName));
test("select * from %s", viewName);
}
@@ -424,7 +412,7 @@ public class TestCTTAS extends BaseTestQuery {
test("create TEMPORARY table %s as select 'A' as c1 from (values(1))",
temporaryTableName);
expectUserRemoteExceptionWithMessage(String.format(
- "VALIDATION ERROR: Unknown view [%s] in schema [%s]",
temporaryTableName, DFS_TMP_SCHEMA));
+ "VALIDATION ERROR: [%s] is not a VIEW in schema [%s]",
temporaryTableName, DFS_TMP_SCHEMA));
test("drop view %s.%s", DFS_TMP_SCHEMA, temporaryTableName);
}
@@ -433,8 +421,8 @@ public class TestCTTAS extends BaseTestQuery {
public void testJoinTemporaryWithPersistentTable() throws Exception {
String temporaryTableName = "temp_tab";
String persistentTableName = "pers_tab";
- String query = String.format("select * from `%s` a join `%s` b on a.c1 =
b.c2",
- persistentTableName, temporaryTableName);
+ String query = String.format("select * from `%s` a join %s.`%s` b on a.c1
= b.c2",
+ persistentTableName, DFS_TMP_SCHEMA, temporaryTableName);
test("use %s", temp2_schema);
test("create TEMPORARY table %s as select '12312' as c2",
temporaryTableName);
@@ -472,17 +460,17 @@ public class TestCTTAS extends BaseTestQuery {
try {
test("CREATE TEMPORARY TABLE %s AS SELECT * FROM cp.`region.json`",
tableName);
- String query = "SELECT region_id FROM `%s` LIMIT 1";
+ String query = "SELECT region_id FROM %s.`%s` LIMIT 1";
testBuilder()
- .sqlQuery(query, tableName)
+ .sqlQuery(query, DFS_TMP_SCHEMA, tableName)
.unOrdered()
.baselineColumns("region_id")
.baselineValues(0L)
.go();
testBuilder()
- .sqlQuery(query, "/" + tableName)
+ .sqlQuery(query, DFS_TMP_SCHEMA, "/" + tableName)
.unOrdered()
.baselineColumns("region_id")
.baselineValues(0L)
@@ -516,11 +504,11 @@ public class TestCTTAS extends BaseTestQuery {
String query =
"select t1.id as id,\n" +
"(select count(t2.id)\n" +
- "from source t2 where t2.id = t1.id) as c\n" +
- "from source t1";
+ "from %s.source t2 where t2.id = t1.id) as c\n" +
+ "from %s.source t1";
testBuilder()
- .sqlQuery(query)
+ .sqlQuery(query, DFS_TMP_SCHEMA, DFS_TMP_SCHEMA)
.ordered()
.baselineColumns("id", "c")
.baselineValues(1, 1L)
diff --git
a/exec/java-exec/src/test/java/org/apache/drill/exec/store/dfs/TestSchemaNotFoundException.java
b/exec/java-exec/src/test/java/org/apache/drill/exec/store/dfs/TestSchemaNotFoundException.java
index dcd25bcf51..c73d9ea9d8 100644
---
a/exec/java-exec/src/test/java/org/apache/drill/exec/store/dfs/TestSchemaNotFoundException.java
+++
b/exec/java-exec/src/test/java/org/apache/drill/exec/store/dfs/TestSchemaNotFoundException.java
@@ -21,6 +21,8 @@ import org.apache.drill.test.BaseTestQuery;
import org.apache.drill.test.TestTools;
import org.junit.Test;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertTrue;
public class TestSchemaNotFoundException extends BaseTestQuery {
@@ -32,10 +34,8 @@ public class TestSchemaNotFoundException extends
BaseTestQuery {
try {
testNoResult(query);
} catch (Exception ex) {
- final String pattern = String.format("[[dfs1]] is not valid with
respect to either root schema or current default schema").toLowerCase();
- final boolean isSchemaNotFound =
ex.getMessage().toLowerCase().contains(pattern);
- assertTrue(isSchemaNotFound);
- throw ex;
+ assertThat(ex.getMessage(), containsString("Object 'dfs1' not
found"));
+ throw ex;
}
}
@@ -46,10 +46,8 @@ public class TestSchemaNotFoundException extends
BaseTestQuery {
try {
testNoResult(query);
} catch (Exception ex) {
- final String pattern = String.format("[[dfs, tmp1]] is not valid
with respect to either root schema or current default schema").toLowerCase();
- final boolean isSchemaNotFound =
ex.getMessage().toLowerCase().contains(pattern);
- assertTrue(isSchemaNotFound);
- throw ex;
+ assertThat(ex.getMessage(), containsString("Object 'tmp1' not found
within 'dfs'"));
+ throw ex;
}
}
@@ -61,10 +59,8 @@ public class TestSchemaNotFoundException extends
BaseTestQuery {
testNoResult("use dfs");
testNoResult(query);
} catch (Exception ex) {
- final String pattern = String.format("[[tmp1]] is not valid with
respect to either root schema or current default schema").toLowerCase();
- final boolean isSchemaNotFound =
ex.getMessage().toLowerCase().contains(pattern);
- assertTrue(isSchemaNotFound);
- throw ex;
+ assertThat(ex.getMessage(), containsString("Object 'tmp1' not
found"));
+ throw ex;
}
}
diff --git
a/exec/java-exec/src/test/java/org/apache/drill/exec/store/store/TestDisabledPlugin.java
b/exec/java-exec/src/test/java/org/apache/drill/exec/store/store/TestDisabledPlugin.java
index 74add911fd..805e12674b 100644
---
a/exec/java-exec/src/test/java/org/apache/drill/exec/store/store/TestDisabledPlugin.java
+++
b/exec/java-exec/src/test/java/org/apache/drill/exec/store/store/TestDisabledPlugin.java
@@ -30,9 +30,10 @@ import org.junit.Test;
import org.junit.experimental.categories.Category;
import static org.apache.drill.exec.util.StoragePluginTestUtils.CP_PLUGIN_NAME;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@Category(SqlTest.class)
@@ -62,8 +63,8 @@ public class TestDisabledPlugin extends ClusterTest {
fail("Query should have failed!");
} catch (UserRemoteException e) {
assertEquals(UserBitShared.DrillPBError.ErrorType.VALIDATION,
e.getErrorType());
- assertTrue("Incorrect error message",
- e.getMessage().contains("VALIDATION ERROR: Schema"));
+ assertThat("Incorrect error message", e.getMessage(),
+ containsString("VALIDATION ERROR: From line 1, column 15 to line 1,
column 32: Object 'cp' not found"));
}
}
@@ -74,8 +75,8 @@ public class TestDisabledPlugin extends ClusterTest {
fail("Query should have failed!");
} catch (UserRemoteException e) {
assertEquals(UserBitShared.DrillPBError.ErrorType.VALIDATION,
e.getErrorType());
- assertTrue("Incorrect error message",
- e.getMessage().contains("VALIDATION ERROR: Schema"));
+ assertThat("Incorrect error message", e.getMessage(),
+ containsString("VALIDATION ERROR: Schema"));
}
}