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

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


The following commit(s) were added to refs/heads/master by this push:
     new 914eebb4b7 Wire up the catalog resolver (#13788)
914eebb4b7 is described below

commit 914eebb4b747b5847ba6e9e1e559b6fbbee72ff2
Author: Paul Rogers <[email protected]>
AuthorDate: Wed Feb 22 11:42:32 2023 -0800

    Wire up the catalog resolver (#13788)
    
    Introduces the catalog resolver interface
    Wires the resolver up to the planner factory
    Refactors planner factory
---
 .../apache/druid/benchmark/query/SqlBenchmark.java |   4 +-
 .../benchmark/query/SqlExpressionBenchmark.java    |   4 +-
 .../benchmark/query/SqlNestedDataBenchmark.java    |   4 +-
 .../benchmark/query/SqlVsNativeBenchmark.java      |   4 +-
 .../org/apache/druid/msq/test/MSQTestBase.java     |  16 ++-
 .../druid/sql/calcite/expression/Expressions.java  |   4 +-
 .../calcite/expression/OperatorConversions.java    |   2 +-
 .../druid/sql/calcite/planner/CatalogResolver.java |  74 ++++++++++++++
 .../sql/calcite/planner/DruidRexExecutor.java      |   5 +-
 .../druid/sql/calcite/planner/PlannerContext.java  |  66 ++++++------
 .../druid/sql/calcite/planner/PlannerFactory.java  |  46 ++++-----
 .../druid/sql/calcite/planner/PlannerToolbox.java  | 111 +++++++++++++++++++++
 .../druid/sql/calcite/rule/GroupByRules.java       |   2 +-
 .../java/org/apache/druid/sql/guice/SqlModule.java |   4 +
 .../org/apache/druid/sql/SqlStatementTest.java     |   4 +-
 .../druid/sql/avatica/DruidAvaticaHandlerTest.java |   5 +-
 .../druid/sql/avatica/DruidStatementTest.java      |   4 +-
 .../calcite/SqlVectorizedExpressionSanityTest.java |   4 +-
 .../calcite/expression/ExpressionTestHelper.java   |  19 +++-
 .../external/ExternalTableScanRuleTest.java        |  18 +++-
 .../calcite/planner/CalcitePlannerModuleTest.java  |  17 +++-
 .../sql/calcite/planner/DruidRexExecutorTest.java  |  14 ++-
 .../druid/sql/calcite/planner/TrivialTest.java     |  70 +++++++++++++
 .../schema/DruidCalciteSchemaModuleTest.java       |   2 +
 .../sql/calcite/util/QueryFrameworkUtils.java      |  18 +++-
 .../druid/sql/calcite/util/SqlTestFramework.java   |  13 ++-
 .../org/apache/druid/sql/guice/SqlModuleTest.java  |   2 +
 .../org/apache/druid/sql/http/SqlResourceTest.java |   4 +-
 28 files changed, 440 insertions(+), 100 deletions(-)

diff --git 
a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlBenchmark.java 
b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlBenchmark.java
index 5714faa12e..2b2bc61af4 100644
--- 
a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlBenchmark.java
+++ 
b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlBenchmark.java
@@ -50,6 +50,7 @@ import 
org.apache.druid.sql.calcite.aggregation.builtin.CountSqlAggregator;
 import org.apache.druid.sql.calcite.expression.SqlOperatorConversion;
 import 
org.apache.druid.sql.calcite.expression.builtin.QueryLookupOperatorConversion;
 import org.apache.druid.sql.calcite.planner.CalciteRulesManager;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.DruidOperatorTable;
 import org.apache.druid.sql.calcite.planner.DruidPlanner;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
@@ -485,7 +486,8 @@ public class SqlBenchmark
         CalciteTests.getJsonMapper(),
         CalciteTests.DRUID_SCHEMA_NAME,
         new CalciteRulesManager(ImmutableSet.of()),
-        CalciteTests.createJoinableFactoryWrapper()
+        CalciteTests.createJoinableFactoryWrapper(),
+        CatalogResolver.NULL_RESOLVER
     );
   }
 
diff --git 
a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlExpressionBenchmark.java
 
b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlExpressionBenchmark.java
index 56617e45f6..2bfa5773a9 100644
--- 
a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlExpressionBenchmark.java
+++ 
b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlExpressionBenchmark.java
@@ -39,6 +39,7 @@ import org.apache.druid.server.QueryStackTests;
 import org.apache.druid.server.security.AuthTestUtils;
 import org.apache.druid.sql.calcite.SqlVectorizedExpressionSanityTest;
 import org.apache.druid.sql.calcite.planner.CalciteRulesManager;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.DruidPlanner;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
 import org.apache.druid.sql.calcite.planner.PlannerFactory;
@@ -322,7 +323,8 @@ public class SqlExpressionBenchmark
         CalciteTests.getJsonMapper(),
         CalciteTests.DRUID_SCHEMA_NAME,
         new CalciteRulesManager(ImmutableSet.of()),
-        CalciteTests.createJoinableFactoryWrapper()
+        CalciteTests.createJoinableFactoryWrapper(),
+        CatalogResolver.NULL_RESOLVER
     );
 
     try {
diff --git 
a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlNestedDataBenchmark.java
 
b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlNestedDataBenchmark.java
index 721fdef76f..d509bd2ede 100644
--- 
a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlNestedDataBenchmark.java
+++ 
b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlNestedDataBenchmark.java
@@ -47,6 +47,7 @@ import org.apache.druid.server.QueryStackTests;
 import org.apache.druid.server.security.AuthTestUtils;
 import org.apache.druid.sql.calcite.SqlVectorizedExpressionSanityTest;
 import org.apache.druid.sql.calcite.planner.CalciteRulesManager;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.DruidPlanner;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
 import org.apache.druid.sql.calcite.planner.PlannerFactory;
@@ -311,7 +312,8 @@ public class SqlNestedDataBenchmark
         CalciteTests.getJsonMapper(),
         CalciteTests.DRUID_SCHEMA_NAME,
         new CalciteRulesManager(ImmutableSet.of()),
-        CalciteTests.createJoinableFactoryWrapper()
+        CalciteTests.createJoinableFactoryWrapper(),
+        CatalogResolver.NULL_RESOLVER
     );
 
     try {
diff --git 
a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlVsNativeBenchmark.java
 
b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlVsNativeBenchmark.java
index b7c450f312..3d5b2aa381 100644
--- 
a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlVsNativeBenchmark.java
+++ 
b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlVsNativeBenchmark.java
@@ -40,6 +40,7 @@ import org.apache.druid.segment.generator.SegmentGenerator;
 import org.apache.druid.server.QueryStackTests;
 import org.apache.druid.server.security.AuthTestUtils;
 import org.apache.druid.sql.calcite.planner.CalciteRulesManager;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.DruidPlanner;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
 import org.apache.druid.sql.calcite.planner.PlannerFactory;
@@ -128,7 +129,8 @@ public class SqlVsNativeBenchmark
         CalciteTests.getJsonMapper(),
         CalciteTests.DRUID_SCHEMA_NAME,
         new CalciteRulesManager(ImmutableSet.of()),
-        CalciteTests.createJoinableFactoryWrapper()
+        CalciteTests.createJoinableFactoryWrapper(),
+        CatalogResolver.NULL_RESOLVER
     );
     groupByQuery = GroupByQuery
         .builder()
diff --git 
a/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/test/MSQTestBase.java
 
b/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/test/MSQTestBase.java
index 8277adca27..5ff019e67f 100644
--- 
a/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/test/MSQTestBase.java
+++ 
b/extensions-core/multi-stage-query/src/test/java/org/apache/druid/msq/test/MSQTestBase.java
@@ -141,6 +141,7 @@ import org.apache.druid.sql.calcite.BaseCalciteQueryTest;
 import org.apache.druid.sql.calcite.external.ExternalDataSource;
 import org.apache.druid.sql.calcite.external.ExternalOperatorConversion;
 import org.apache.druid.sql.calcite.planner.CalciteRulesManager;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
 import org.apache.druid.sql.calcite.planner.PlannerFactory;
 import org.apache.druid.sql.calcite.rel.DruidQuery;
@@ -174,6 +175,7 @@ import org.mockito.Mockito;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
+
 import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
@@ -258,7 +260,6 @@ public class MSQTestBase extends BaseCalciteQueryTest
   public static final String DEFAULT = "default";
   public static final String SEQUENTIAL_MERGE = "sequential_merge";
 
-
   public final boolean useDefault = NullHandling.replaceWithDefault();
 
   protected File localFileStorageDir;
@@ -293,7 +294,6 @@ public class MSQTestBase extends BaseCalciteQueryTest
 
     builder.addModule(new DruidModule()
     {
-
       // Small subset of MsqSqlModule
       @Override
       public void configure(Binder binder)
@@ -478,6 +478,7 @@ public class MSQTestBase extends BaseCalciteQueryTest
         testTaskActionClient,
         workerMemoryParameters
     );
+    CatalogResolver catalogResolver = createMockCatalogResolver();
     final InProcessViewManager viewManager = new 
InProcessViewManager(SqlTestFramework.DRUID_VIEW_MACRO_FACTORY);
     DruidSchemaCatalog rootSchema = QueryFrameworkUtils.createMockRootSchema(
         CalciteTests.INJECTOR,
@@ -503,12 +504,18 @@ public class MSQTestBase extends BaseCalciteQueryTest
         objectMapper,
         CalciteTests.DRUID_SCHEMA_NAME,
         new CalciteRulesManager(ImmutableSet.of()),
-        CalciteTests.createJoinableFactoryWrapper()
+        CalciteTests.createJoinableFactoryWrapper(),
+        catalogResolver
     );
 
     sqlStatementFactory = CalciteTests.createSqlStatementFactory(engine, 
plannerFactory);
   }
 
+  protected CatalogResolver createMockCatalogResolver()
+  {
+    return CatalogResolver.NULL_RESOLVER;
+  }
+
   /**
    * Returns query context expected for a scan query. Same as {@link 
#DEFAULT_MSQ_CONTEXT}, but
    * includes {@link DruidQuery#CTX_SCAN_SIGNATURE}.
@@ -732,7 +739,6 @@ public class MSQTestBase extends BaseCalciteQueryTest
     }
 
     return payload.getStatus().getErrorReport();
-
   }
 
   private void assertMSQSpec(MSQSpec expectedMSQSpec, MSQSpec querySpecForTask)
@@ -781,7 +787,7 @@ public class MSQTestBase extends BaseCalciteQueryTest
         throw new ISE("Unable to get results from the report");
       }
 
-      return Optional.of(new Pair(rowSignature, rows));
+      return Optional.of(new Pair<RowSignature, List<Object[]>>(rowSignature, 
rows));
     }
   }
 
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/expression/Expressions.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/expression/Expressions.java
index ff92f83c37..0ce7a7cf0f 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/expression/Expressions.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/expression/Expressions.java
@@ -287,7 +287,7 @@ public class Expressions
   {
     final SqlOperator operator = ((RexCall) rexNode).getOperator();
 
-    final SqlOperatorConversion conversion = plannerContext.getOperatorTable()
+    final SqlOperatorConversion conversion = 
plannerContext.getPlannerToolbox().operatorTable()
                                                            
.lookupOperatorConversion(operator);
 
     if (conversion == null) {
@@ -703,7 +703,7 @@ public class Expressions
       return filter;
     } else if (rexNode instanceof RexCall) {
       final SqlOperator operator = ((RexCall) rexNode).getOperator();
-      final SqlOperatorConversion conversion = 
plannerContext.getOperatorTable().lookupOperatorConversion(operator);
+      final SqlOperatorConversion conversion = 
plannerContext.getPlannerToolbox().operatorTable().lookupOperatorConversion(operator);
 
       if (conversion == null) {
         return null;
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/expression/OperatorConversions.java
 
b/sql/src/main/java/org/apache/druid/sql/calcite/expression/OperatorConversions.java
index 31b94ff496..ff0f80901b 100644
--- 
a/sql/src/main/java/org/apache/druid/sql/calcite/expression/OperatorConversions.java
+++ 
b/sql/src/main/java/org/apache/druid/sql/calcite/expression/OperatorConversions.java
@@ -268,7 +268,7 @@ public class OperatorConversions
       );
     } else if (rexNode instanceof RexCall) {
       final SqlOperator operator = ((RexCall) rexNode).getOperator();
-      final SqlOperatorConversion conversion = 
plannerContext.getOperatorTable()
+      final SqlOperatorConversion conversion = 
plannerContext.getPlannerToolbox().operatorTable()
                                                              
.lookupOperatorConversion(operator);
 
       if (conversion != null) {
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/planner/CatalogResolver.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/planner/CatalogResolver.java
new file mode 100644
index 0000000000..33e5ae9c3f
--- /dev/null
+++ 
b/sql/src/main/java/org/apache/druid/sql/calcite/planner/CatalogResolver.java
@@ -0,0 +1,74 @@
+/*
+ * 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.druid.sql.calcite.planner;
+
+import org.apache.druid.sql.calcite.table.DatasourceTable;
+import org.apache.druid.sql.calcite.table.DruidTable;
+
+import java.util.Set;
+
+/**
+ * Facade onto the (optional) Druid catalog. Configured in Guice to be
+ * the {@link CatalogResolver.NullCatalogResolver} or to an actual catalog.
+ */
+public interface CatalogResolver
+{
+  CatalogResolver NULL_RESOLVER = new NullCatalogResolver();
+
+  /**
+   * Catalog resolver for when the catalog is not available.
+   */
+  class NullCatalogResolver implements CatalogResolver
+  {
+    @Override
+    public boolean ingestRequiresExistingTable()
+    {
+      return false;
+    }
+
+    @Override
+    public DruidTable resolveDatasource(
+        final String tableName,
+        final DatasourceTable.PhysicalDatasourceMetadata dsMetadata
+    )
+    {
+      return dsMetadata == null ? null : new DatasourceTable(dsMetadata);
+    }
+
+    @Override
+    public Set<String> getTableNames(Set<String> datasourceNames)
+    {
+      return datasourceNames;
+    }
+  }
+
+  /**
+   * Global option to determine whether ingest requires an existing 
datasource, or
+   * can automatically create a new datasource.
+   */
+  boolean ingestRequiresExistingTable();
+
+  DruidTable resolveDatasource(
+      String tableName,
+      DatasourceTable.PhysicalDatasourceMetadata dsMetadata
+  );
+
+  Set<String> getTableNames(Set<String> datasourceNames);
+}
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidRexExecutor.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidRexExecutor.java
index 7ab6fd0b04..6279f7e673 100644
--- 
a/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidRexExecutor.java
+++ 
b/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidRexExecutor.java
@@ -71,7 +71,10 @@ public class DruidRexExecutor implements RexExecutor
         reducedValues.add(constExp);
       } else {
         final SqlTypeName sqlTypeName = constExp.getType().getSqlTypeName();
-        final Expr expr = Parser.parse(druidExpression.getExpression(), 
plannerContext.getExprMacroTable());
+        final Expr expr = Parser.parse(
+            druidExpression.getExpression(),
+            plannerContext.getPlannerToolbox().exprMacroTable()
+        );
 
         final ExprEval exprResult = expr.eval(
             InputBindings.forFunction(
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/planner/PlannerContext.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/planner/PlannerContext.java
index f57a473de6..e2346540db 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/planner/PlannerContext.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/planner/PlannerContext.java
@@ -43,12 +43,12 @@ import 
org.apache.druid.sql.calcite.rel.VirtualColumnRegistry;
 import org.apache.druid.sql.calcite.run.EngineFeature;
 import org.apache.druid.sql.calcite.run.QueryMaker;
 import org.apache.druid.sql.calcite.run.SqlEngine;
-import org.apache.druid.sql.calcite.schema.DruidSchemaCatalog;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.joda.time.Interval;
 
 import javax.annotation.Nullable;
+
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -57,8 +57,9 @@ import java.util.UUID;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
- * Like {@link PlannerConfig}, but that has static configuration and this 
class contains dynamic, per-query
- * configuration.
+ * Like {@link PlannerConfig}, but that has static configuration and this class
+ * contains dynamic, per-query configuration. Additional Druid-specific static
+ * configuration resides in the {@link PlannerToolbox} class.
  */
 public class PlannerContext
 {
@@ -75,19 +76,16 @@ public class PlannerContext
   // DataContext keys
   public static final String DATA_CTX_AUTHENTICATION_RESULT = 
"authenticationResult";
 
+  private final PlannerToolbox plannerToolbox;
   private final String sql;
-  private final DruidOperatorTable operatorTable;
-  private final ExprMacroTable macroTable;
-  private final JoinableFactoryWrapper joinableFactoryWrapper;
-  private final ObjectMapper jsonMapper;
   private final PlannerConfig plannerConfig;
   private final DateTime localNow;
-  private final DruidSchemaCatalog rootSchema;
   private final SqlEngine engine;
   private final Map<String, Object> queryContext;
   private final String sqlQueryId;
   private final boolean stringifyArrays;
   private final CopyOnWriteArrayList<String> nativeQueryIds = new 
CopyOnWriteArrayList<>();
+  private final PlannerHook hook;
   // bindings for dynamic parameters to bind during planning
   private List<TypedValue> parameters = Collections.emptyList();
   // result of authentication, providing identity to authorize set of 
resources produced by validation
@@ -103,30 +101,24 @@ public class PlannerContext
   private VirtualColumnRegistry joinExpressionVirtualColumnRegistry;
 
   private PlannerContext(
+      final PlannerToolbox plannerToolbox,
       final String sql,
-      final DruidOperatorTable operatorTable,
-      final ExprMacroTable macroTable,
-      final ObjectMapper jsonMapper,
       final PlannerConfig plannerConfig,
       final DateTime localNow,
       final boolean stringifyArrays,
-      final DruidSchemaCatalog rootSchema,
       final SqlEngine engine,
       final Map<String, Object> queryContext,
-      final JoinableFactoryWrapper joinableFactoryWrapper
+      final PlannerHook hook
   )
   {
+    this.plannerToolbox = plannerToolbox;
     this.sql = sql;
-    this.operatorTable = operatorTable;
-    this.macroTable = macroTable;
-    this.jsonMapper = jsonMapper;
     this.plannerConfig = Preconditions.checkNotNull(plannerConfig, 
"plannerConfig");
-    this.rootSchema = rootSchema;
     this.engine = engine;
     this.queryContext = queryContext;
     this.localNow = Preconditions.checkNotNull(localNow, "localNow");
     this.stringifyArrays = stringifyArrays;
-    this.joinableFactoryWrapper = joinableFactoryWrapper;
+    this.hook = hook == null ? NoOpPlannerHook.INSTANCE : hook;
 
     String sqlQueryId = (String) 
this.queryContext.get(QueryContexts.CTX_SQL_QUERY_ID);
     // special handling for DruidViewMacro, normal client will allocate sqlid 
in SqlLifecyle
@@ -137,15 +129,11 @@ public class PlannerContext
   }
 
   public static PlannerContext create(
+      final PlannerToolbox plannerToolbox,
       final String sql,
-      final DruidOperatorTable operatorTable,
-      final ExprMacroTable macroTable,
-      final ObjectMapper jsonMapper,
-      final PlannerConfig plannerConfig,
-      final DruidSchemaCatalog rootSchema,
       final SqlEngine engine,
       final Map<String, Object> queryContext,
-      final JoinableFactoryWrapper joinableFactoryWrapper
+      final PlannerHook hook
   )
   {
     final DateTime utcNow;
@@ -165,7 +153,7 @@ public class PlannerContext
     if (tzParam != null) {
       timeZone = DateTimes.inferTzFromString(String.valueOf(tzParam));
     } else {
-      timeZone = plannerConfig.getSqlTimeZone();
+      timeZone = plannerToolbox.plannerConfig().getSqlTimeZone();
     }
 
     if (stringifyParam != null) {
@@ -175,33 +163,32 @@ public class PlannerContext
     }
 
     return new PlannerContext(
+        plannerToolbox,
         sql,
-        operatorTable,
-        macroTable,
-        jsonMapper,
-        plannerConfig.withOverrides(queryContext),
+        plannerToolbox.plannerConfig().withOverrides(queryContext),
         utcNow.withZone(timeZone),
         stringifyArrays,
-        rootSchema,
         engine,
         queryContext,
-        joinableFactoryWrapper
+        hook
     );
   }
 
-  public DruidOperatorTable getOperatorTable()
+  public PlannerToolbox getPlannerToolbox()
   {
-    return operatorTable;
+    return plannerToolbox;
   }
 
+  // Deprecated: prefer using the toolbox
   public ExprMacroTable getExprMacroTable()
   {
-    return macroTable;
+    return plannerToolbox.exprMacroTable();
   }
 
+  // Deprecated: prefer using the toolbox
   public ObjectMapper getJsonMapper()
   {
-    return jsonMapper;
+    return plannerToolbox.jsonMapper();
   }
 
   public PlannerConfig getPlannerConfig()
@@ -221,13 +208,13 @@ public class PlannerContext
 
   public JoinableFactoryWrapper getJoinableFactoryWrapper()
   {
-    return joinableFactoryWrapper;
+    return plannerToolbox.joinableFactoryWrapper();
   }
 
   @Nullable
   public String getSchemaResourceType(String schema, String resourceName)
   {
-    return rootSchema.getResourceType(schema, resourceName);
+    return plannerToolbox.rootSchema().getResourceType(schema, resourceName);
   }
 
   /**
@@ -268,6 +255,11 @@ public class PlannerContext
     return sql;
   }
 
+  public PlannerHook getPlannerHook()
+  {
+    return hook;
+  }
+
   public String getSqlQueryId()
   {
     return sqlQueryId;
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/planner/PlannerFactory.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/planner/PlannerFactory.java
index 3cbc20dd05..085d476072 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/planner/PlannerFactory.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/planner/PlannerFactory.java
@@ -52,7 +52,7 @@ import org.apache.druid.sql.calcite.schema.DruidSchemaName;
 import java.util.Map;
 import java.util.Properties;
 
-public class PlannerFactory
+public class PlannerFactory extends PlannerToolbox
 {
   static final SqlParser.Config PARSER_CONFIG = SqlParser
       .configBuilder()
@@ -61,19 +61,9 @@ public class PlannerFactory
       .setQuotedCasing(Casing.UNCHANGED)
       .setQuoting(Quoting.DOUBLE_QUOTE)
       .setConformance(DruidConformance.instance())
-      .setParserFactory(new DruidSqlParserImplFactory()) // Custom sql parser 
factory
+      .setParserFactory(new DruidSqlParserImplFactory()) // Custom SQL parser 
factory
       .build();
 
-  private final DruidSchemaCatalog rootSchema;
-  private final DruidOperatorTable operatorTable;
-  private final ExprMacroTable macroTable;
-  private final PlannerConfig plannerConfig;
-  private final ObjectMapper jsonMapper;
-  private final AuthorizerMapper authorizerMapper;
-  private final String druidSchemaName;
-  private final CalciteRulesManager calciteRuleManager;
-  private final JoinableFactoryWrapper joinableFactoryWrapper;
-
   @Inject
   public PlannerFactory(
       final DruidSchemaCatalog rootSchema,
@@ -84,18 +74,22 @@ public class PlannerFactory
       final @Json ObjectMapper jsonMapper,
       final @DruidSchemaName String druidSchemaName,
       final CalciteRulesManager calciteRuleManager,
-      final JoinableFactoryWrapper joinableFactoryWrapper
+      final JoinableFactoryWrapper joinableFactoryWrapper,
+      final CatalogResolver catalog
   )
   {
-    this.rootSchema = rootSchema;
-    this.operatorTable = operatorTable;
-    this.macroTable = macroTable;
-    this.plannerConfig = plannerConfig;
-    this.authorizerMapper = authorizerMapper;
-    this.jsonMapper = jsonMapper;
-    this.druidSchemaName = druidSchemaName;
-    this.calciteRuleManager = calciteRuleManager;
-    this.joinableFactoryWrapper = joinableFactoryWrapper;
+    super(
+        operatorTable,
+        macroTable,
+        jsonMapper,
+        plannerConfig,
+        rootSchema,
+        joinableFactoryWrapper,
+        catalog,
+        druidSchemaName,
+        calciteRuleManager,
+        authorizerMapper
+    );
   }
 
   /**
@@ -109,15 +103,11 @@ public class PlannerFactory
   )
   {
     final PlannerContext context = PlannerContext.create(
+        this,
         sql,
-        operatorTable,
-        macroTable,
-        jsonMapper,
-        plannerConfig,
-        rootSchema,
         engine,
         queryContext,
-        joinableFactoryWrapper
+        hook
     );
 
     return new DruidPlanner(buildFrameworkConfig(context), context, engine, 
hook);
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/planner/PlannerToolbox.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/planner/PlannerToolbox.java
new file mode 100644
index 0000000000..24655c85b5
--- /dev/null
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/planner/PlannerToolbox.java
@@ -0,0 +1,111 @@
+/*
+ * 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.druid.sql.calcite.planner;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.Preconditions;
+import org.apache.druid.math.expr.ExprMacroTable;
+import org.apache.druid.segment.join.JoinableFactoryWrapper;
+import org.apache.druid.server.security.AuthorizerMapper;
+import org.apache.druid.sql.calcite.schema.DruidSchemaCatalog;
+
+public class PlannerToolbox
+{
+  protected final DruidOperatorTable operatorTable;
+  protected final ExprMacroTable macroTable;
+  protected final JoinableFactoryWrapper joinableFactoryWrapper;
+  protected final ObjectMapper jsonMapper;
+  protected final PlannerConfig plannerConfig;
+  protected final DruidSchemaCatalog rootSchema;
+  protected final CatalogResolver catalog;
+  protected final String druidSchemaName;
+  protected final CalciteRulesManager calciteRuleManager;
+  protected final AuthorizerMapper authorizerMapper;
+
+  public PlannerToolbox(
+      final DruidOperatorTable operatorTable,
+      final ExprMacroTable macroTable,
+      final ObjectMapper jsonMapper,
+      final PlannerConfig plannerConfig,
+      final DruidSchemaCatalog rootSchema,
+      final JoinableFactoryWrapper joinableFactoryWrapper,
+      final CatalogResolver catalog,
+      final String druidSchemaName,
+      final CalciteRulesManager calciteRuleManager,
+      final AuthorizerMapper authorizerMapper
+  )
+  {
+    this.operatorTable = operatorTable;
+    this.macroTable = macroTable;
+    this.jsonMapper = jsonMapper;
+    this.plannerConfig = Preconditions.checkNotNull(plannerConfig, 
"plannerConfig");
+    this.rootSchema = rootSchema;
+    this.joinableFactoryWrapper = joinableFactoryWrapper;
+    this.catalog = catalog;
+    this.druidSchemaName = druidSchemaName;
+    this.calciteRuleManager = calciteRuleManager;
+    this.authorizerMapper = authorizerMapper;
+  }
+
+  public DruidOperatorTable operatorTable()
+  {
+    return operatorTable;
+  }
+
+  public ExprMacroTable exprMacroTable()
+  {
+    return macroTable;
+  }
+
+  public ObjectMapper jsonMapper()
+  {
+    return jsonMapper;
+  }
+
+  public DruidSchemaCatalog rootSchema()
+  {
+    return rootSchema;
+  }
+
+  public JoinableFactoryWrapper joinableFactoryWrapper()
+  {
+    return joinableFactoryWrapper;
+  }
+
+  public CatalogResolver catalogResolver()
+  {
+    return catalog;
+  }
+
+  public String druidSchemaName()
+  {
+    return druidSchemaName;
+  }
+
+  public CalciteRulesManager calciteRuleManager()
+  {
+    return calciteRuleManager;
+  }
+
+  public PlannerConfig plannerConfig()
+  {
+    return plannerConfig;
+  }
+}
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/rule/GroupByRules.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/rule/GroupByRules.java
index 549c789973..fc144395d1 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/rule/GroupByRules.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/rule/GroupByRules.java
@@ -91,7 +91,7 @@ public class GroupByRules
       filter = null;
     }
 
-    final SqlAggregator sqlAggregator = plannerContext.getOperatorTable()
+    final SqlAggregator sqlAggregator = 
plannerContext.getPlannerToolbox().operatorTable()
                                                       
.lookupAggregator(call.getAggregation());
 
     if (sqlAggregator == null) {
diff --git a/sql/src/main/java/org/apache/druid/sql/guice/SqlModule.java 
b/sql/src/main/java/org/apache/druid/sql/guice/SqlModule.java
index 21a10bd695..d0ad849d40 100644
--- a/sql/src/main/java/org/apache/druid/sql/guice/SqlModule.java
+++ b/sql/src/main/java/org/apache/druid/sql/guice/SqlModule.java
@@ -42,6 +42,7 @@ import org.apache.druid.sql.avatica.AvaticaModule;
 import org.apache.druid.sql.calcite.aggregation.SqlAggregationModule;
 import 
org.apache.druid.sql.calcite.expression.builtin.QueryLookupOperatorConversion;
 import org.apache.druid.sql.calcite.planner.CalcitePlannerModule;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.PlannerFactory;
 import org.apache.druid.sql.calcite.run.NativeSqlEngine;
 import org.apache.druid.sql.calcite.schema.DruidCalciteSchemaModule;
@@ -121,6 +122,9 @@ public class SqlModule implements Module
     if (isAvaticaEnabled()) {
       binder.install(new AvaticaModule());
     }
+
+    // Default do-nothing catalog resolver
+    
binder.bind(CatalogResolver.class).toInstance(CatalogResolver.NULL_RESOLVER);
   }
 
   private boolean isEnabled()
diff --git a/sql/src/test/java/org/apache/druid/sql/SqlStatementTest.java 
b/sql/src/test/java/org/apache/druid/sql/SqlStatementTest.java
index fe3edecb10..aef500ed18 100644
--- a/sql/src/test/java/org/apache/druid/sql/SqlStatementTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/SqlStatementTest.java
@@ -49,6 +49,7 @@ import org.apache.druid.server.security.ForbiddenException;
 import org.apache.druid.sql.DirectStatement.ResultSet;
 import org.apache.druid.sql.SqlPlanningException.PlanningError;
 import org.apache.druid.sql.calcite.planner.CalciteRulesManager;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.DruidOperatorTable;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
 import org.apache.druid.sql.calcite.planner.PlannerFactory;
@@ -156,7 +157,8 @@ public class SqlStatementTest
         CalciteTests.getJsonMapper(),
         CalciteTests.DRUID_SCHEMA_NAME,
         new CalciteRulesManager(ImmutableSet.of()),
-        joinableFactoryWrapper
+        joinableFactoryWrapper,
+        CatalogResolver.NULL_RESOLVER
     );
 
     this.sqlStatementFactory = new SqlStatementFactory(
diff --git 
a/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java 
b/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
index deccbf497d..c54c94bf39 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
@@ -75,6 +75,7 @@ import 
org.apache.druid.sql.avatica.DruidJdbcResultSet.ResultFetcher;
 import org.apache.druid.sql.avatica.DruidJdbcResultSet.ResultFetcherFactory;
 import org.apache.druid.sql.calcite.planner.CalciteRulesManager;
 import org.apache.druid.sql.calcite.planner.Calcites;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.DruidOperatorTable;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
 import org.apache.druid.sql.calcite.planner.PlannerFactory;
@@ -291,6 +292,7 @@ public class DruidAvaticaHandlerTest extends CalciteTestBase
             binder.bind(new 
TypeLiteral<Supplier<DefaultQueryConfig>>(){}).toInstance(Suppliers.ofInstance(new
 DefaultQueryConfig(ImmutableMap.of())));
             binder.bind(CalciteRulesManager.class).toInstance(new 
CalciteRulesManager(ImmutableSet.of()));
             
binder.bind(JoinableFactoryWrapper.class).toInstance(CalciteTests.createJoinableFactoryWrapper());
+            
binder.bind(CatalogResolver.class).toInstance(CatalogResolver.NULL_RESOLVER);
           }
          )
         .build();
@@ -999,7 +1001,8 @@ public class DruidAvaticaHandlerTest extends 
CalciteTestBase
             CalciteTests.getJsonMapper(),
             CalciteTests.DRUID_SCHEMA_NAME,
             new CalciteRulesManager(ImmutableSet.of()),
-            CalciteTests.createJoinableFactoryWrapper()
+            CalciteTests.createJoinableFactoryWrapper(),
+            CatalogResolver.NULL_RESOLVER
         )
     );
   }
diff --git 
a/sql/src/test/java/org/apache/druid/sql/avatica/DruidStatementTest.java 
b/sql/src/test/java/org/apache/druid/sql/avatica/DruidStatementTest.java
index 05a3676c30..b039ff07d0 100644
--- a/sql/src/test/java/org/apache/druid/sql/avatica/DruidStatementTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/avatica/DruidStatementTest.java
@@ -38,6 +38,7 @@ import org.apache.druid.sql.SqlQueryPlus;
 import org.apache.druid.sql.SqlStatementFactory;
 import org.apache.druid.sql.avatica.DruidJdbcResultSet.ResultFetcherFactory;
 import org.apache.druid.sql.calcite.planner.CalciteRulesManager;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.DruidOperatorTable;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
 import org.apache.druid.sql.calcite.planner.PlannerFactory;
@@ -114,7 +115,8 @@ public class DruidStatementTest extends CalciteTestBase
         CalciteTests.getJsonMapper(),
         CalciteTests.DRUID_SCHEMA_NAME,
         new CalciteRulesManager(ImmutableSet.of()),
-        joinableFactoryWrapper
+        joinableFactoryWrapper,
+        CatalogResolver.NULL_RESOLVER
     );
     this.sqlStatementFactory = CalciteTests.createSqlStatementFactory(
         CalciteTests.createMockSqlEngine(walker, conglomerate),
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/SqlVectorizedExpressionSanityTest.java
 
b/sql/src/test/java/org/apache/druid/sql/calcite/SqlVectorizedExpressionSanityTest.java
index 4c3d70cc47..dc3a1367b9 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/SqlVectorizedExpressionSanityTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/SqlVectorizedExpressionSanityTest.java
@@ -41,6 +41,7 @@ import org.apache.druid.segment.join.JoinableFactoryWrapper;
 import org.apache.druid.server.QueryStackTests;
 import org.apache.druid.server.security.AuthTestUtils;
 import org.apache.druid.sql.calcite.planner.CalciteRulesManager;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.DruidPlanner;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
 import org.apache.druid.sql.calcite.planner.PlannerFactory;
@@ -152,7 +153,8 @@ public class SqlVectorizedExpressionSanityTest extends 
InitializedNullHandlingTe
         CalciteTests.getJsonMapper(),
         CalciteTests.DRUID_SCHEMA_NAME,
         new CalciteRulesManager(ImmutableSet.of()),
-        joinableFactoryWrapper
+        joinableFactoryWrapper,
+        CatalogResolver.NULL_RESOLVER
     );
   }
 
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/expression/ExpressionTestHelper.java
 
b/sql/src/test/java/org/apache/druid/sql/calcite/expression/ExpressionTestHelper.java
index 45f1d7239b..8372d61188 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/expression/ExpressionTestHelper.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/expression/ExpressionTestHelper.java
@@ -20,6 +20,7 @@
 package org.apache.druid.sql.calcite.expression;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
@@ -44,10 +45,13 @@ import org.apache.druid.segment.VirtualColumns;
 import org.apache.druid.segment.column.RowSignature;
 import org.apache.druid.segment.join.JoinableFactoryWrapper;
 import org.apache.druid.segment.virtual.VirtualizedColumnSelectorFactory;
+import org.apache.druid.sql.calcite.planner.CalciteRulesManager;
 import org.apache.druid.sql.calcite.planner.Calcites;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.DruidTypeSystem;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
 import org.apache.druid.sql.calcite.planner.PlannerContext;
+import org.apache.druid.sql.calcite.planner.PlannerToolbox;
 import org.apache.druid.sql.calcite.rel.VirtualColumnRegistry;
 import org.apache.druid.sql.calcite.schema.DruidSchema;
 import org.apache.druid.sql.calcite.schema.DruidSchemaCatalog;
@@ -63,6 +67,7 @@ import org.joda.time.DateTimeZone;
 import org.junit.Assert;
 
 import javax.annotation.Nullable;
+
 import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.Collections;
@@ -75,8 +80,7 @@ import java.util.stream.Collectors;
 class ExpressionTestHelper
 {
   private static final JoinableFactoryWrapper JOINABLE_FACTORY_WRAPPER = 
CalciteTests.createJoinableFactoryWrapper();
-  private static final PlannerContext PLANNER_CONTEXT = PlannerContext.create(
-      "SELECT 1", // The actual query isn't important for this test
+  private static final PlannerToolbox PLANNER_TOOLBOX = new PlannerToolbox(
       CalciteTests.createOperatorTable(),
       CalciteTests.createExprMacroTable(),
       CalciteTests.getJsonMapper(),
@@ -88,9 +92,18 @@ class ExpressionTestHelper
               NamedViewSchema.NAME, new 
NamedViewSchema(EasyMock.createMock(ViewSchema.class))
           )
       ),
+      JOINABLE_FACTORY_WRAPPER,
+      CatalogResolver.NULL_RESOLVER,
+      "druid",
+      new CalciteRulesManager(ImmutableSet.of()),
+      CalciteTests.TEST_AUTHORIZER_MAPPER
+  );
+  private static final PlannerContext PLANNER_CONTEXT = PlannerContext.create(
+      PLANNER_TOOLBOX,
+      "SELECT 1", // The actual query isn't important for this test
       null, /* Don't need engine */
       Collections.emptyMap(),
-      JOINABLE_FACTORY_WRAPPER
+      null
   );
 
   private final RowSignature rowSignature;
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/external/ExternalTableScanRuleTest.java
 
b/sql/src/test/java/org/apache/druid/sql/calcite/external/ExternalTableScanRuleTest.java
index af72e7a3e5..048d26981e 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/external/ExternalTableScanRuleTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/external/ExternalTableScanRuleTest.java
@@ -20,13 +20,17 @@
 package org.apache.druid.sql.calcite.external;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.rel.RelRoot;
 import org.apache.calcite.schema.SchemaPlus;
 import org.apache.druid.query.QueryRunnerFactoryConglomerate;
 import org.apache.druid.query.QuerySegmentWalker;
+import org.apache.druid.sql.calcite.planner.CalciteRulesManager;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
 import org.apache.druid.sql.calcite.planner.PlannerContext;
+import org.apache.druid.sql.calcite.planner.PlannerToolbox;
 import org.apache.druid.sql.calcite.run.NativeSqlEngine;
 import org.apache.druid.sql.calcite.schema.DruidSchema;
 import org.apache.druid.sql.calcite.schema.DruidSchemaCatalog;
@@ -49,8 +53,7 @@ public class ExternalTableScanRuleTest
         EasyMock.createMock(QuerySegmentWalker.class),
         EasyMock.createMock(QueryRunnerFactoryConglomerate.class)
     );
-    final PlannerContext plannerContext = PlannerContext.create(
-        "DUMMY", // The actual query isn't important for this test
+    final PlannerToolbox toolbox = new PlannerToolbox(
         CalciteTests.createOperatorTable(),
         CalciteTests.createExprMacroTable(),
         CalciteTests.getJsonMapper(),
@@ -62,9 +65,18 @@ public class ExternalTableScanRuleTest
                 NamedViewSchema.NAME, new 
NamedViewSchema(EasyMock.createMock(ViewSchema.class))
             )
         ),
+        CalciteTests.createJoinableFactoryWrapper(),
+        CatalogResolver.NULL_RESOLVER,
+        "druid",
+        new CalciteRulesManager(ImmutableSet.of()),
+        CalciteTests.TEST_AUTHORIZER_MAPPER
+    );
+    final PlannerContext plannerContext = PlannerContext.create(
+        toolbox,
+        "DUMMY", // The actual query isn't important for this test
         engine,
         Collections.emptyMap(),
-        CalciteTests.createJoinableFactoryWrapper()
+        null
     );
     plannerContext.setQueryMaker(
         engine.buildQueryMakerForSelect(EasyMock.createMock(RelRoot.class), 
plannerContext)
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/planner/CalcitePlannerModuleTest.java
 
b/sql/src/test/java/org/apache/druid/sql/calcite/planner/CalcitePlannerModuleTest.java
index 0413c7df36..2796adc433 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/planner/CalcitePlannerModuleTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/planner/CalcitePlannerModuleTest.java
@@ -45,6 +45,7 @@ import org.apache.druid.sql.calcite.schema.DruidSchemaCatalog;
 import org.apache.druid.sql.calcite.schema.DruidSchemaName;
 import org.apache.druid.sql.calcite.schema.NamedSchema;
 import org.apache.druid.sql.calcite.util.CalciteTestBase;
+import org.apache.druid.sql.calcite.util.CalciteTests;
 import org.easymock.EasyMock;
 import org.easymock.EasyMockRunner;
 import org.easymock.Mock;
@@ -112,7 +113,6 @@ public class CalcitePlannerModuleTest extends 
CalciteTestBase
       @Override
       public void onMatch(RelOptRuleCall call)
       {
-
       }
     };
     injector = Guice.createInjector(
@@ -128,6 +128,7 @@ public class CalcitePlannerModuleTest extends 
CalciteTestBase
           binder.bind(Key.get(new TypeLiteral<Set<SqlOperatorConversion>>() 
{})).toInstance(operatorConversions);
           binder.bind(DruidSchemaCatalog.class).toInstance(rootSchema);
           
binder.bind(JoinableFactoryWrapper.class).toInstance(joinableFactoryWrapper);
+          
binder.bind(CatalogResolver.class).toInstance(CatalogResolver.NULL_RESOLVER);
         },
         target,
         binder -> {
@@ -170,16 +171,24 @@ public class CalcitePlannerModuleTest extends 
CalciteTestBase
   @Test
   public void testExtensionCalciteRule()
   {
-    PlannerContext context = PlannerContext.create(
-        "SELECT 1",
+    PlannerToolbox toolbox = new PlannerToolbox(
         injector.getInstance(DruidOperatorTable.class),
         macroTable,
         new DefaultObjectMapper(),
         injector.getInstance(PlannerConfig.class),
         rootSchema,
+        joinableFactoryWrapper,
+        CatalogResolver.NULL_RESOLVER,
+        "druid",
+        new CalciteRulesManager(ImmutableSet.of()),
+        CalciteTests.TEST_AUTHORIZER_MAPPER
+    );
+    PlannerContext context = PlannerContext.create(
+        toolbox,
+        "SELECT 1",
         null,
         Collections.emptyMap(),
-        joinableFactoryWrapper
+        null
     );
     boolean containsCustomRule = 
injector.getInstance(CalciteRulesManager.class)
                                          .druidConventionRuleSet(context)
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/planner/DruidRexExecutorTest.java
 
b/sql/src/test/java/org/apache/druid/sql/calcite/planner/DruidRexExecutorTest.java
index 3864056714..1d325c28b9 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/planner/DruidRexExecutorTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/planner/DruidRexExecutorTest.java
@@ -79,8 +79,7 @@ public class DruidRexExecutorTest extends 
InitializedNullHandlingTest
       .functionCategory(SqlFunctionCategory.USER_DEFINED_FUNCTION)
       .build();
 
-  private static final PlannerContext PLANNER_CONTEXT = PlannerContext.create(
-      "SELECT 1", // The actual query isn't important for this test
+  private static final PlannerToolbox PLANNER_TOOLBOX = new PlannerToolbox(
       new DruidOperatorTable(
           Collections.emptySet(),
           ImmutableSet.of(new DirectOperatorConversion(OPERATOR, 
"hyper_unique"))
@@ -95,9 +94,18 @@ public class DruidRexExecutorTest extends 
InitializedNullHandlingTest
               NamedViewSchema.NAME, new 
NamedViewSchema(EasyMock.createMock(ViewSchema.class))
           )
       ),
+      CalciteTests.createJoinableFactoryWrapper(),
+      CatalogResolver.NULL_RESOLVER,
+      "druid",
+      new CalciteRulesManager(ImmutableSet.of()),
+      CalciteTests.TEST_AUTHORIZER_MAPPER
+  );
+  private static final PlannerContext PLANNER_CONTEXT = PlannerContext.create(
+      PLANNER_TOOLBOX,
+      "SELECT 1", // The actual query isn't important for this test
       null, /* Don't need an engine */
       Collections.emptyMap(),
-      CalciteTests.createJoinableFactoryWrapper()
+      null
   );
 
   private final RexBuilder rexBuilder = new RexBuilder(new 
JavaTypeFactoryImpl());
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/planner/TrivialTest.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/planner/TrivialTest.java
new file mode 100644
index 0000000000..5d27690ad3
--- /dev/null
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/planner/TrivialTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.druid.sql.calcite.planner;
+
+import 
org.apache.druid.sql.calcite.table.DatasourceTable.PhysicalDatasourceMetadata;
+import org.apache.druid.sql.calcite.table.DruidTable;
+
+import java.util.Collections;
+import java.util.Set;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Test class to reference items that are otherwise unused in this package, and
+ * only used in extensions. Prevents GitHub CodeQL warnings.
+ */
+public class TrivialTest
+{
+  private static class DummyCatalogResolver implements CatalogResolver
+  {
+    @Override
+    public boolean ingestRequiresExistingTable()
+    {
+      return true;
+    }
+
+    @Override
+    public DruidTable resolveDatasource(String tableName, 
PhysicalDatasourceMetadata dsMetadata)
+    {
+      assertTrue("foo".equals(tableName));
+      return null;
+    }
+
+    @Override
+    public Set<String> getTableNames(Set<String> datasourceNames)
+    {
+      return Collections.emptySet();
+    }
+  }
+
+  /**
+   * This is a silly test. It exists only to create references to 
otherwise-unused
+   * method parameters.
+   */
+  public void testResolver()
+  {
+    CatalogResolver resolver = new DummyCatalogResolver();
+    assertTrue(resolver.ingestRequiresExistingTable());
+    assertNull(resolver.resolveDatasource("foo", null));
+    assertTrue(resolver.getTableNames(Collections.emptySet()).isEmpty());
+  }
+}
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/schema/DruidCalciteSchemaModuleTest.java
 
b/sql/src/test/java/org/apache/druid/sql/calcite/schema/DruidCalciteSchemaModuleTest.java
index 1596984b03..91c6121c3a 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/schema/DruidCalciteSchemaModuleTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/schema/DruidCalciteSchemaModuleTest.java
@@ -46,6 +46,7 @@ import org.apache.druid.server.QueryLifecycleFactory;
 import org.apache.druid.server.SegmentManager;
 import org.apache.druid.server.security.AuthorizerMapper;
 import org.apache.druid.server.security.Escalator;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
 import org.apache.druid.sql.calcite.util.CalciteTestBase;
 import org.apache.druid.sql.calcite.view.ViewManager;
@@ -122,6 +123,7 @@ public class DruidCalciteSchemaModuleTest extends 
CalciteTestBase
           
binder.bind(ObjectMapper.class).annotatedWith(Json.class).toInstance(objectMapper);
           binder.bindScope(LazySingleton.class, Scopes.SINGLETON);
           
binder.bind(LookupExtractorFactoryContainerProvider.class).toInstance(lookupReferencesManager);
+          
binder.bind(CatalogResolver.class).toInstance(CatalogResolver.NULL_RESOLVER);
           binder.bind(ServiceEmitter.class).toInstance(new ServiceEmitter("", 
"", null));
         },
         new LifecycleModule(),
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/util/QueryFrameworkUtils.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/util/QueryFrameworkUtils.java
index b95ca00a5c..a7a51ef29d 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/util/QueryFrameworkUtils.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/util/QueryFrameworkUtils.java
@@ -139,7 +139,13 @@ public class QueryFrameworkUtils
       final AuthorizerMapper authorizerMapper
   )
   {
-    DruidSchema druidSchema = createMockSchema(injector, conglomerate, walker, 
plannerConfig, druidSchemaManager);
+    DruidSchema druidSchema = createMockSchema(
+        injector,
+        conglomerate,
+        walker,
+        plannerConfig,
+        druidSchemaManager
+    );
     SystemSchema systemSchema =
         CalciteTests.createMockSystemSchema(druidSchema, walker, 
plannerConfig, authorizerMapper);
 
@@ -185,7 +191,15 @@ public class QueryFrameworkUtils
       final AuthorizerMapper authorizerMapper
   )
   {
-    return createMockRootSchema(injector, conglomerate, walker, plannerConfig, 
null, new NoopDruidSchemaManager(), authorizerMapper);
+    return createMockRootSchema(
+        injector,
+        conglomerate,
+        walker,
+        plannerConfig,
+        null,
+        new NoopDruidSchemaManager(),
+        authorizerMapper
+    );
   }
 
   private static DruidSchema createMockSchema(
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/util/SqlTestFramework.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/util/SqlTestFramework.java
index 287e5212b8..e51360adcd 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/util/SqlTestFramework.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/util/SqlTestFramework.java
@@ -47,6 +47,7 @@ import org.apache.druid.server.security.AuthorizerMapper;
 import org.apache.druid.sql.SqlStatementFactory;
 import org.apache.druid.sql.calcite.aggregation.SqlAggregationModule;
 import org.apache.druid.sql.calcite.planner.CalciteRulesManager;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.DruidOperatorTable;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
 import org.apache.druid.sql.calcite.planner.PlannerFactory;
@@ -357,6 +358,7 @@ public class SqlTestFramework
     private final QueryComponentSupplier componentSupplier;
     private int minTopNThreshold = TopNQueryConfig.DEFAULT_MIN_TOPN_THRESHOLD;
     private int mergeBufferCount;
+    private CatalogResolver catalogResolver = CatalogResolver.NULL_RESOLVER;
 
     public Builder(QueryComponentSupplier componentSupplier)
     {
@@ -375,6 +377,12 @@ public class SqlTestFramework
       return this;
     }
 
+    public Builder catalogResolver(CatalogResolver catalogResolver)
+    {
+      this.catalogResolver = catalogResolver;
+      return this;
+    }
+
     public SqlTestFramework build()
     {
       return new SqlTestFramework(this);
@@ -420,7 +428,8 @@ public class SqlTestFramework
           framework.queryJsonMapper(),
           CalciteTests.DRUID_SCHEMA_NAME,
           new CalciteRulesManager(componentSupplier.extensionCalciteRules()),
-          framework.injector.getInstance(JoinableFactoryWrapper.class)
+          framework.injector.getInstance(JoinableFactoryWrapper.class),
+          framework.builder.catalogResolver
       );
       componentSupplier.finalizePlanner(this);
       this.statementFactory = QueryFrameworkUtils.createSqlStatementFactory(
@@ -523,6 +532,7 @@ public class SqlTestFramework
 
   public static final DruidViewMacroFactory DRUID_VIEW_MACRO_FACTORY = new 
TestDruidViewMacroFactory();
 
+  private final Builder builder;
   private final QueryComponentSupplier componentSupplier;
   private final Closer resourceCloser = Closer.create();
   private final Injector injector;
@@ -531,6 +541,7 @@ public class SqlTestFramework
 
   private SqlTestFramework(Builder builder)
   {
+    this.builder = builder;
     this.componentSupplier = builder.componentSupplier;
     Properties properties = new Properties();
     this.componentSupplier.gatherProperties(properties);
diff --git a/sql/src/test/java/org/apache/druid/sql/guice/SqlModuleTest.java 
b/sql/src/test/java/org/apache/druid/sql/guice/SqlModuleTest.java
index 12b8d5f8a9..13a5226483 100644
--- a/sql/src/test/java/org/apache/druid/sql/guice/SqlModuleTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/guice/SqlModuleTest.java
@@ -60,6 +60,7 @@ import org.apache.druid.server.log.RequestLogger;
 import org.apache.druid.server.security.AuthorizerMapper;
 import org.apache.druid.server.security.Escalator;
 import org.apache.druid.server.security.NoopEscalator;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.PlannerFactory;
 import org.apache.druid.sql.calcite.util.CalciteTests;
 import org.apache.druid.sql.calcite.view.DruidViewMacro;
@@ -204,6 +205,7 @@ public class SqlModuleTest
                     .toProvider(QuerySchedulerProvider.class)
                     .in(LazySingleton.class);
               
binder.bind(ResponseContextConfig.class).toInstance(SqlResourceTest.TEST_RESPONSE_CONTEXT_CONFIG);
+              
binder.bind(CatalogResolver.class).toInstance(CatalogResolver.NULL_RESOLVER);
             },
             sqlModule,
             new TestViewManagerModule()
diff --git a/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java 
b/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java
index 9baba52555..a9cf6779e1 100644
--- a/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java
@@ -87,6 +87,7 @@ import org.apache.druid.sql.SqlStatementFactory;
 import org.apache.druid.sql.SqlToolbox;
 import org.apache.druid.sql.calcite.parser.DruidSqlInsert;
 import org.apache.druid.sql.calcite.planner.CalciteRulesManager;
+import org.apache.druid.sql.calcite.planner.CatalogResolver;
 import org.apache.druid.sql.calcite.planner.DruidOperatorTable;
 import org.apache.druid.sql.calcite.planner.DruidPlanner;
 import org.apache.druid.sql.calcite.planner.PlannerConfig;
@@ -236,7 +237,8 @@ public class SqlResourceTest extends CalciteTestBase
         CalciteTests.getJsonMapper(),
         CalciteTests.DRUID_SCHEMA_NAME,
         new CalciteRulesManager(ImmutableSet.of()),
-        CalciteTests.createJoinableFactoryWrapper()
+        CalciteTests.createJoinableFactoryWrapper(),
+        CatalogResolver.NULL_RESOLVER
     );
 
     lifecycleManager = new SqlLifecycleManager()


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to