You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by to...@apache.org on 2018/07/13 17:42:22 UTC

[3/3] impala git commit: IMPALA-7140 (part 7): small fixes to enable most queries on HDFS tables

IMPALA-7140 (part 7): small fixes to enable most queries on HDFS tables

This is a grab-bag of small fixes necessary to get most queries on HDFS
tables passing with the correct plans:

* Change the loading of tables to check for other table types before
  checking for FS tables, since without specific checks against
  various properties, other tables may look like FS tables and try to
  instantiate LocalFsTable incorrectly.

* Return -1 for extrapolated row count -- the previous 0 value was
  convincing the planner that it had a valid value.

* Fix up the handling of BuiltinsDb so that we don't depend on
  ImpaladCatalog to have been loaded in order to instantiate it.

* Properly handle the case where all partitions are pruned by a
  predicate.

With this change, about half of the tests in PlannerTest pass. The tests
that don't pass all rely on views, HBase tables, etc.

Change-Id: I6f603e62b7a013c148c0905ebdec2f4303f9c4e5
Reviewed-on: http://gerrit.cloudera.org:8080/10798
Tested-by: Impala Public Jenkins <im...@cloudera.com>
Reviewed-by: Todd Lipcon <to...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/impala/repo
Commit: http://git-wip-us.apache.org/repos/asf/impala/commit/7f8a4d3f
Tree: http://git-wip-us.apache.org/repos/asf/impala/tree/7f8a4d3f
Diff: http://git-wip-us.apache.org/repos/asf/impala/diff/7f8a4d3f

Branch: refs/heads/master
Commit: 7f8a4d3fff00c878327260cfe279bfec6ae14ab8
Parents: 540611e
Author: Todd Lipcon <to...@cloudera.com>
Authored: Wed Jun 20 16:31:56 2018 -0700
Committer: Todd Lipcon <to...@apache.org>
Committed: Fri Jul 13 17:39:06 2018 +0000

----------------------------------------------------------------------
 .../org/apache/impala/analysis/CastExpr.java    | 11 +++++-----
 .../java/org/apache/impala/analysis/Expr.java   |  4 ++--
 .../apache/impala/analysis/ExtractFromExpr.java |  4 ++--
 .../impala/analysis/FunctionCallExpr.java       |  4 ++--
 .../apache/impala/analysis/FunctionName.java    |  8 +++----
 .../org/apache/impala/catalog/BuiltinsDb.java   | 15 +++++++++++--
 .../apache/impala/catalog/ImpaladCatalog.java   | 10 +--------
 .../apache/impala/catalog/ScalarFunction.java   |  4 ++--
 .../impala/catalog/local/LocalCatalog.java      |  6 +++---
 .../impala/catalog/local/LocalFsTable.java      |  6 +++++-
 .../apache/impala/catalog/local/LocalTable.java | 22 +++++++++++++++++---
 fe/src/main/jflex/sql-scanner.flex              |  3 +--
 .../impala/analysis/AnalyzeExprsTest.java       |  8 +++----
 .../impala/catalog/local/LocalCatalogTest.java  |  2 ++
 14 files changed, 65 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/main/java/org/apache/impala/analysis/CastExpr.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/CastExpr.java b/fe/src/main/java/org/apache/impala/analysis/CastExpr.java
index c9a8511..932ffe1 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CastExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CastExpr.java
@@ -17,11 +17,10 @@
 
 package org.apache.impala.analysis;
 
-import org.apache.impala.catalog.Catalog;
+import org.apache.impala.catalog.BuiltinsDb;
 import org.apache.impala.catalog.Db;
 import org.apache.impala.catalog.Function;
 import org.apache.impala.catalog.Function.CompareMode;
-import org.apache.impala.catalog.ImpaladCatalog;
 import org.apache.impala.catalog.PrimitiveType;
 import org.apache.impala.catalog.ScalarFunction;
 import org.apache.impala.catalog.ScalarType;
@@ -259,19 +258,19 @@ public class CastExpr extends Expr {
     noOp_ = childType.equals(type_);
     if (noOp_) return;
 
-    FunctionName fnName = new FunctionName(ImpaladCatalog.BUILTINS_DB, getFnName(type_));
+    FunctionName fnName = new FunctionName(BuiltinsDb.NAME, getFnName(type_));
     Type[] args = { childType };
     Function searchDesc = new Function(fnName, args, Type.INVALID, false);
     if (isImplicit_) {
-      fn_ = ImpaladCatalog.getBuiltinsDb().getFunction(searchDesc,
+      fn_ = BuiltinsDb.getInstance().getFunction(searchDesc,
           CompareMode.IS_NONSTRICT_SUPERTYPE_OF);
       Preconditions.checkState(fn_ != null);
     } else {
-      fn_ = ImpaladCatalog.getBuiltinsDb().getFunction(searchDesc,
+      fn_ = BuiltinsDb.getInstance().getFunction(searchDesc,
           CompareMode.IS_IDENTICAL);
       if (fn_ == null) {
         // allow for promotion from CHAR to STRING; only if no exact match is found
-        fn_ =  ImpaladCatalog.getBuiltinsDb().getFunction(
+        fn_ =  BuiltinsDb.getInstance().getFunction(
             searchDesc.promoteCharsToStrings(), CompareMode.IS_IDENTICAL);
       }
     }

http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/main/java/org/apache/impala/analysis/Expr.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/Expr.java b/fe/src/main/java/org/apache/impala/analysis/Expr.java
index e34a58c..77797bc 100644
--- a/fe/src/main/java/org/apache/impala/analysis/Expr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/Expr.java
@@ -26,9 +26,9 @@ import java.util.ListIterator;
 import java.util.Set;
 
 import org.apache.impala.analysis.BinaryPredicate.Operator;
+import org.apache.impala.catalog.BuiltinsDb;
 import org.apache.impala.catalog.Function;
 import org.apache.impala.catalog.Function.CompareMode;
-import org.apache.impala.catalog.ImpaladCatalog;
 import org.apache.impala.catalog.PrimitiveType;
 import org.apache.impala.catalog.ScalarType;
 import org.apache.impala.catalog.Type;
@@ -417,7 +417,7 @@ abstract public class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
    */
   protected Function getBuiltinFunction(Analyzer analyzer, String name,
       Type[] argTypes, CompareMode mode) throws AnalysisException {
-    FunctionName fnName = new FunctionName(ImpaladCatalog.BUILTINS_DB, name);
+    FunctionName fnName = new FunctionName(BuiltinsDb.NAME, name);
     Function searchDesc = new Function(fnName, argTypes, Type.INVALID, false);
     return analyzer.getCatalog().getFunction(searchDesc, mode);
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/main/java/org/apache/impala/analysis/ExtractFromExpr.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/ExtractFromExpr.java b/fe/src/main/java/org/apache/impala/analysis/ExtractFromExpr.java
index eea48f8..40020e0 100644
--- a/fe/src/main/java/org/apache/impala/analysis/ExtractFromExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/ExtractFromExpr.java
@@ -19,8 +19,8 @@ package org.apache.impala.analysis;
 
 import java.util.Set;
 
+import org.apache.impala.catalog.BuiltinsDb;
 import org.apache.impala.catalog.Catalog;
-import org.apache.impala.catalog.ImpaladCatalog;
 import org.apache.impala.catalog.Type;
 import org.apache.impala.common.AnalysisException;
 import org.apache.impala.thrift.TExtractField;
@@ -74,7 +74,7 @@ public class ExtractFromExpr extends FunctionCallExpr {
           + " does not accept the keyword FROM.");
     }
     if ((getFnName().getDb() != null)
-        && !getFnName().getDb().equals(ImpaladCatalog.BUILTINS_DB)) {
+        && !getFnName().getDb().equals(BuiltinsDb.NAME)) {
       throw new AnalysisException("Function " + getFnName().toString() + " conflicts " +
           "with the EXTRACT builtin.");
     }

http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java b/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java
index d8d44ec..216f543 100644
--- a/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java
@@ -21,11 +21,11 @@ import java.util.List;
 
 import org.apache.impala.authorization.Privilege;
 import org.apache.impala.catalog.AggregateFunction;
+import org.apache.impala.catalog.BuiltinsDb;
 import org.apache.impala.catalog.Catalog;
 import org.apache.impala.catalog.Db;
 import org.apache.impala.catalog.FeDb;
 import org.apache.impala.catalog.Function;
-import org.apache.impala.catalog.ImpaladCatalog;
 import org.apache.impala.catalog.ScalarFunction;
 import org.apache.impala.catalog.ScalarType;
 import org.apache.impala.catalog.Type;
@@ -113,7 +113,7 @@ public class FunctionCallExpr extends Expr {
     return fnName.getFnNamePath().size() == 1
            && fnName.getFnNamePath().get(0).equalsIgnoreCase(name)
         || fnName.getFnNamePath().size() == 2
-           && fnName.getFnNamePath().get(0).equals(ImpaladCatalog.BUILTINS_DB)
+           && fnName.getFnNamePath().get(0).equals(BuiltinsDb.NAME)
            && fnName.getFnNamePath().get(1).equalsIgnoreCase(name);
   }
 

http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/main/java/org/apache/impala/analysis/FunctionName.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/FunctionName.java b/fe/src/main/java/org/apache/impala/analysis/FunctionName.java
index 3ec4e63..aeaa6e1 100644
--- a/fe/src/main/java/org/apache/impala/analysis/FunctionName.java
+++ b/fe/src/main/java/org/apache/impala/analysis/FunctionName.java
@@ -19,9 +19,9 @@ package org.apache.impala.analysis;
 
 import java.util.ArrayList;
 
+import org.apache.impala.catalog.BuiltinsDb;
 import org.apache.impala.catalog.Catalog;
 import org.apache.impala.catalog.Db;
-import org.apache.impala.catalog.ImpaladCatalog;
 import org.apache.impala.common.AnalysisException;
 import org.apache.impala.thrift.TFunctionName;
 import com.google.common.base.Joiner;
@@ -119,15 +119,15 @@ public class FunctionName {
     }
 
     // Resolve the database for this function.
-    Db builtinDb = ImpaladCatalog.getBuiltinsDb();
+    Db builtinDb = BuiltinsDb.getInstance();
     if (!isFullyQualified()) {
       db_ = analyzer.getDefaultDb();
       if (preferBuiltinsDb && builtinDb.containsFunction(fn_)) {
-        db_ = ImpaladCatalog.BUILTINS_DB;
+        db_ = BuiltinsDb.NAME;
       }
     }
     Preconditions.checkNotNull(db_);
-    isBuiltin_ = db_.equals(ImpaladCatalog.BUILTINS_DB) &&
+    isBuiltin_ = db_.equals(BuiltinsDb.NAME) &&
         builtinDb.containsFunction(fn_);
     isAnalyzed_ = true;
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/main/java/org/apache/impala/catalog/BuiltinsDb.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/catalog/BuiltinsDb.java b/fe/src/main/java/org/apache/impala/catalog/BuiltinsDb.java
index a95435e..e60fbc5 100644
--- a/fe/src/main/java/org/apache/impala/catalog/BuiltinsDb.java
+++ b/fe/src/main/java/org/apache/impala/catalog/BuiltinsDb.java
@@ -56,8 +56,19 @@ public class BuiltinsDb extends Db {
   // Size in bytes of RankState used for rank() and dense_rank().
   private static final int RANK_INTERMEDIATE_SIZE = 16;
 
-  public BuiltinsDb(String name) {
-    super(name, createMetastoreDb(name));
+  private static BuiltinsDb INSTANCE;
+
+  public static final String NAME = "_impala_builtins";
+
+  public static synchronized Db getInstance() {
+    if (INSTANCE == null) {
+      INSTANCE = new BuiltinsDb();
+    }
+    return INSTANCE;
+  }
+
+  private BuiltinsDb() {
+    super(NAME, createMetastoreDb(NAME));
     setIsSystemDb(true);
     initBuiltins();
   }

http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/main/java/org/apache/impala/catalog/ImpaladCatalog.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/catalog/ImpaladCatalog.java b/fe/src/main/java/org/apache/impala/catalog/ImpaladCatalog.java
index fe5244d..db05cb7 100644
--- a/fe/src/main/java/org/apache/impala/catalog/ImpaladCatalog.java
+++ b/fe/src/main/java/org/apache/impala/catalog/ImpaladCatalog.java
@@ -75,8 +75,6 @@ import com.google.common.base.Preconditions;
 public class ImpaladCatalog extends Catalog implements FeCatalog {
   private static final Logger LOG = Logger.getLogger(ImpaladCatalog.class);
   private static final TUniqueId INITIAL_CATALOG_SERVICE_ID = new TUniqueId(0L, 0L);
-  public static final String BUILTINS_DB = "_impala_builtins";
-
   // The last known Catalog Service ID. If the ID changes, it indicates the CatalogServer
   // has restarted.
   private TUniqueId catalogServiceId_ = INITIAL_CATALOG_SERVICE_ID;
@@ -98,13 +96,9 @@ public class ImpaladCatalog extends Catalog implements FeCatalog {
   // Used during table creation.
   private final String defaultKuduMasterHosts_;
 
-  // DB that contains all builtins
-  private static Db builtinsDb_;
-
   public ImpaladCatalog(String defaultKuduMasterHosts) {
     super();
-    builtinsDb_ = new BuiltinsDb(BUILTINS_DB);
-    addDb(builtinsDb_);
+    addDb(BuiltinsDb.getInstance());
     defaultKuduMasterHosts_ = defaultKuduMasterHosts;
     // Ensure the contents of the CatalogObjectVersionQueue instance are cleared when a
     // new instance of ImpaladCatalog is created (see IMPALA-6486).
@@ -525,6 +519,4 @@ public class ImpaladCatalog extends Catalog implements FeCatalog {
 
   @Override
   public TUniqueId getCatalogServiceId() { return catalogServiceId_; }
-
-  public static Db getBuiltinsDb() { return builtinsDb_; }
 }

http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/main/java/org/apache/impala/catalog/ScalarFunction.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/catalog/ScalarFunction.java b/fe/src/main/java/org/apache/impala/catalog/ScalarFunction.java
index 1d24bc9..9b4fa68 100644
--- a/fe/src/main/java/org/apache/impala/catalog/ScalarFunction.java
+++ b/fe/src/main/java/org/apache/impala/catalog/ScalarFunction.java
@@ -73,7 +73,7 @@ public class ScalarFunction extends Function {
       String prepareFnSymbol, String closeFnSymbol, boolean userVisible) {
     Preconditions.checkNotNull(symbol);
     ScalarFunction fn = new ScalarFunction(
-        new FunctionName(ImpaladCatalog.BUILTINS_DB, name), argTypes, retType, hasVarArgs);
+        new FunctionName(BuiltinsDb.NAME, name), argTypes, retType, hasVarArgs);
     fn.setBinaryType(TFunctionBinaryType.BUILTIN);
     fn.setUserVisible(userVisible);
     fn.setIsPersistent(true);
@@ -222,7 +222,7 @@ public class ScalarFunction extends Function {
       ArrayList<Type> argTypes, boolean hasVarArgs, Type retType,
       boolean userVisible) {
     ScalarFunction fn = new ScalarFunction(
-        new FunctionName(ImpaladCatalog.BUILTINS_DB, name), argTypes, retType, hasVarArgs);
+        new FunctionName(BuiltinsDb.NAME, name), argTypes, retType, hasVarArgs);
     fn.setBinaryType(TFunctionBinaryType.BUILTIN);
     fn.setUserVisible(userVisible);
     fn.setIsPersistent(true);

http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/main/java/org/apache/impala/catalog/local/LocalCatalog.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/catalog/local/LocalCatalog.java b/fe/src/main/java/org/apache/impala/catalog/local/LocalCatalog.java
index 007450d..542ec32 100644
--- a/fe/src/main/java/org/apache/impala/catalog/local/LocalCatalog.java
+++ b/fe/src/main/java/org/apache/impala/catalog/local/LocalCatalog.java
@@ -38,7 +38,6 @@ import org.apache.impala.catalog.FeTable;
 import org.apache.impala.catalog.Function;
 import org.apache.impala.catalog.Function.CompareMode;
 import org.apache.impala.catalog.HdfsCachePool;
-import org.apache.impala.catalog.ImpaladCatalog;
 import org.apache.impala.thrift.TCatalogObject;
 import org.apache.impala.thrift.TPartitionKeyValue;
 import org.apache.impala.thrift.TUniqueId;
@@ -67,7 +66,6 @@ public class LocalCatalog implements FeCatalog {
   private final MetaProvider metaProvider_;
   private Map<String, FeDb> dbs_ = Maps.newHashMap();
   private String nullPartitionKeyValue_;
-  private static final Db builtinsDb_ = new BuiltinsDb(ImpaladCatalog.BUILTINS_DB);
 
   public static FeCatalog create(String defaultKuduMasterHosts) {
     // TODO(todd): store the kudu master hosts
@@ -101,7 +99,9 @@ public class LocalCatalog implements FeCatalog {
         dbs.put(dbName, new LocalDb(this, dbName));
       }
     }
-    dbs.put(builtinsDb_.getName(), builtinsDb_);
+
+    Db bdb = BuiltinsDb.getInstance();
+    dbs.put(bdb.getName(), bdb);
     dbs_ = dbs;
   }
 

http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/main/java/org/apache/impala/catalog/local/LocalFsTable.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/catalog/local/LocalFsTable.java b/fe/src/main/java/org/apache/impala/catalog/local/LocalFsTable.java
index 42d3b03..8a6c0f6 100644
--- a/fe/src/main/java/org/apache/impala/catalog/local/LocalFsTable.java
+++ b/fe/src/main/java/org/apache/impala/catalog/local/LocalFsTable.java
@@ -155,7 +155,7 @@ public class LocalFsTable extends LocalTable implements FeFsTable {
   @Override
   public long getExtrapolatedNumRows(long totalBytes) {
     // TODO Auto-generated method stub
-    return 0;
+    return -1;
   }
 
   @Override
@@ -245,6 +245,10 @@ public class LocalFsTable extends LocalTable implements FeFsTable {
     Preconditions.checkState(partitionSpecs_ != null,
         "Cannot load partitions without having fetched partition IDs " +
         "from the same LocalFsTable instance");
+
+    // Possible in the case that all partitions were pruned.
+    if (ids.isEmpty()) return Collections.emptyList();
+
     List<String> names = Lists.newArrayList();
     for (Long id : ids) {
       LocalPartitionSpec spec = partitionSpecs_.get(id);

http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/main/java/org/apache/impala/catalog/local/LocalTable.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/catalog/local/LocalTable.java b/fe/src/main/java/org/apache/impala/catalog/local/LocalTable.java
index ae697b5..4b57cb8 100644
--- a/fe/src/main/java/org/apache/impala/catalog/local/LocalTable.java
+++ b/fe/src/main/java/org/apache/impala/catalog/local/LocalTable.java
@@ -22,20 +22,25 @@ import java.util.List;
 
 import javax.annotation.concurrent.Immutable;
 
+import org.apache.hadoop.hive.metastore.TableType;
 import org.apache.hadoop.hive.metastore.api.ColumnStatisticsObj;
 import org.apache.hadoop.hive.metastore.api.Table;
 import org.apache.hadoop.hive.serde.serdeConstants;
 import org.apache.impala.analysis.TableName;
 import org.apache.impala.catalog.ArrayType;
 import org.apache.impala.catalog.Column;
+import org.apache.impala.catalog.DataSourceTable;
 import org.apache.impala.catalog.FeCatalogUtils;
 import org.apache.impala.catalog.FeDb;
 import org.apache.impala.catalog.FeFsTable;
 import org.apache.impala.catalog.FeTable;
+import org.apache.impala.catalog.HBaseTable;
 import org.apache.impala.catalog.HdfsFileFormat;
+import org.apache.impala.catalog.KuduTable;
 import org.apache.impala.catalog.StructField;
 import org.apache.impala.catalog.StructType;
 import org.apache.impala.catalog.TableLoadingException;
+import org.apache.impala.catalog.View;
 import org.apache.impala.thrift.TCatalogObjectType;
 import org.apache.impala.thrift.TTableStats;
 import org.apache.log4j.Logger;
@@ -65,11 +70,22 @@ abstract class LocalTable implements FeTable {
     // In order to know which kind of table subclass to instantiate, we need
     // to eagerly grab and parse the top-level Table object from the HMS.
     SchemaInfo schemaInfo = SchemaInfo.load(db, tblName);
-    LocalTable t;
-    if (HdfsFileFormat.isHdfsInputFormatClass(
+    LocalTable t = null;
+    Table msTbl = schemaInfo.msTable_;
+    if (TableType.valueOf(msTbl.getTableType()) == TableType.VIRTUAL_VIEW) {
+      // TODO(todd) support View
+    } else if (HBaseTable.isHBaseTable(msTbl)) {
+      // TODO(todd) support HBase table
+    } else if (KuduTable.isKuduTable(msTbl)) {
+      // TODO(todd) support kudu table
+    } else if (DataSourceTable.isDataSourceTable(msTbl)) {
+      // TODO(todd) support datasource table
+    } else if (HdfsFileFormat.isHdfsInputFormatClass(
         schemaInfo.msTable_.getSd().getInputFormat())) {
       t = new LocalFsTable(db, tblName, schemaInfo);
-    } else {
+    }
+
+    if (t == null) {
       throw new LocalCatalogException("Unknown table type for table " +
           db.getName() + "." + tblName);
     }

http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/main/jflex/sql-scanner.flex
----------------------------------------------------------------------
diff --git a/fe/src/main/jflex/sql-scanner.flex b/fe/src/main/jflex/sql-scanner.flex
index c993884..5536b16 100644
--- a/fe/src/main/jflex/sql-scanner.flex
+++ b/fe/src/main/jflex/sql-scanner.flex
@@ -31,7 +31,6 @@ import java.util.HashSet;
 import com.google.common.base.Preconditions;
 import org.apache.impala.analysis.SqlParserSymbols;
 import org.apache.impala.catalog.BuiltinsDb;
-import static org.apache.impala.catalog.ImpaladCatalog.BUILTINS_DB;
 import org.apache.impala.service.BackendConfig;
 import org.apache.impala.thrift.TReservedWordsVersion;
 
@@ -363,7 +362,7 @@ import org.apache.impala.thrift.TReservedWordsVersion;
         "varying", "versioning", "whenever", "width_bucket", "window", "within",
         "without", "year"}));
     // Remove impala builtin function names
-    reservedWords.removeAll(new BuiltinsDb(BUILTINS_DB).getAllFunctions().keySet());
+    reservedWords.removeAll(BuiltinsDb.getInstance().getAllFunctions().keySet());
     // Remove whitelist words. These words might be heavily used in production, and
     // impala is unlikely to implement SQL features around these words in the near future.
     reservedWords.removeAll(Arrays.asList(new String[] {

http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/test/java/org/apache/impala/analysis/AnalyzeExprsTest.java
----------------------------------------------------------------------
diff --git a/fe/src/test/java/org/apache/impala/analysis/AnalyzeExprsTest.java b/fe/src/test/java/org/apache/impala/analysis/AnalyzeExprsTest.java
index 791883b..a0dec83 100644
--- a/fe/src/test/java/org/apache/impala/analysis/AnalyzeExprsTest.java
+++ b/fe/src/test/java/org/apache/impala/analysis/AnalyzeExprsTest.java
@@ -28,13 +28,13 @@ import java.util.List;
 
 import org.apache.impala.analysis.TimestampArithmeticExpr.TimeUnit;
 import org.apache.impala.catalog.AggregateFunction;
+import org.apache.impala.catalog.BuiltinsDb;
 import org.apache.impala.catalog.Catalog;
 import org.apache.impala.catalog.CatalogException;
 import org.apache.impala.catalog.Column;
 import org.apache.impala.catalog.Db;
 import org.apache.impala.catalog.Function;
 import org.apache.impala.catalog.Function.CompareMode;
-import org.apache.impala.catalog.ImpaladCatalog;
 import org.apache.impala.catalog.PrimitiveType;
 import org.apache.impala.catalog.ScalarFunction;
 import org.apache.impala.catalog.ScalarType;
@@ -2794,7 +2794,7 @@ public class AnalyzeExprsTest extends AnalyzerTest {
   @Test
   // IMPALA-2233: Regression test for loss of precision through implicit casts.
   public void TestImplicitArgumentCasts() throws AnalysisException {
-    FunctionName fnName = new FunctionName(ImpaladCatalog.BUILTINS_DB, "greatest");
+    FunctionName fnName = new FunctionName(BuiltinsDb.NAME, "greatest");
     Function tinyIntFn = new Function(fnName, new Type[] {ScalarType.DOUBLE},
         Type.DOUBLE, true);
     Function decimalFn = new Function(fnName,
@@ -2804,7 +2804,7 @@ public class AnalyzeExprsTest extends AnalyzerTest {
     Assert.assertTrue(tinyIntFn.compare(decimalFn,
         CompareMode.IS_NONSTRICT_SUPERTYPE_OF));
     // Check that this resolves to the decimal version of the function.
-    Db db = catalog_.getDb(ImpaladCatalog.BUILTINS_DB);
+    Db db = catalog_.getDb(BuiltinsDb.NAME);
     Function foundFn = db.getFunction(decimalFn, CompareMode.IS_NONSTRICT_SUPERTYPE_OF);
     assertNotNull(foundFn);
     Assert.assertTrue(foundFn.getArgs()[0].isDecimal());
@@ -2837,7 +2837,7 @@ public class AnalyzeExprsTest extends AnalyzerTest {
     Assert.assertNotNull(foundFn);
     Assert.assertEquals(Type.DOUBLE, foundFn.getArgs()[0]);
 
-    FunctionName lagFnName = new FunctionName(ImpaladCatalog.BUILTINS_DB, "lag");
+    FunctionName lagFnName = new FunctionName(BuiltinsDb.NAME, "lag");
     // Timestamp should not be converted to string if string overload available.
     Function lagStringFn = new Function(lagFnName,
         new Type[] {ScalarType.STRING, Type.TINYINT}, Type.INVALID, false);

http://git-wip-us.apache.org/repos/asf/impala/blob/7f8a4d3f/fe/src/test/java/org/apache/impala/catalog/local/LocalCatalogTest.java
----------------------------------------------------------------------
diff --git a/fe/src/test/java/org/apache/impala/catalog/local/LocalCatalogTest.java b/fe/src/test/java/org/apache/impala/catalog/local/LocalCatalogTest.java
index 100ba47..e334d20 100644
--- a/fe/src/test/java/org/apache/impala/catalog/local/LocalCatalogTest.java
+++ b/fe/src/test/java/org/apache/impala/catalog/local/LocalCatalogTest.java
@@ -31,6 +31,7 @@ import org.apache.impala.catalog.FeFsTable;
 import org.apache.impala.catalog.FeTable;
 import org.apache.impala.catalog.HdfsPartition.FileDescriptor;
 import org.apache.impala.catalog.Type;
+import org.apache.impala.service.FeSupport;
 import org.apache.impala.thrift.TResultSet;
 import org.apache.impala.util.MetaStoreUtil;
 import org.apache.impala.util.PatternMatcher;
@@ -46,6 +47,7 @@ public class LocalCatalogTest {
 
   @Before
   public void setupCatalog() {
+    FeSupport.loadLibrary();
     catalog_ = new LocalCatalog(new DirectMetaProvider());
   }