You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2015/08/01 00:42:51 UTC

[14/50] [abbrv] incubator-calcite git commit: First swipe at [CALCITE-522] (Xavier Leong)

First swipe at [CALCITE-522] (Xavier Leong)

Build static DatabaseProperties map, name change on Meta enum, cache
DatabaseProperties lookup at RemoteMeta.

Close apache/incubator-calcite#77


Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/93c2ff51
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/93c2ff51
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/93c2ff51

Branch: refs/heads/branch-release
Commit: 93c2ff517f44ca35285811130ce86f1a022956bb
Parents: a357e91
Author: Xavier Leong <le...@persistent.my>
Authored: Thu Apr 16 11:25:10 2015 +0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Sat Apr 25 17:01:51 2015 -0700

----------------------------------------------------------------------
 .../apache/calcite/avatica/jdbc/JdbcMeta.java   | 37 ++++------
 .../calcite/avatica/RemoteDriverTest.java       | 43 +++++++++++
 .../avatica/AvaticaDatabaseMetaData.java        | 10 +--
 .../java/org/apache/calcite/avatica/Meta.java   | 46 ++++++++++--
 .../org/apache/calcite/avatica/MetaImpl.java    | 18 +----
 .../calcite/avatica/remote/JsonService.java     |  8 ++
 .../calcite/avatica/remote/LocalService.java    |  7 ++
 .../calcite/avatica/remote/RemoteMeta.java      | 14 ++++
 .../apache/calcite/avatica/remote/Service.java  | 33 ++++++++-
 .../apache/calcite/jdbc/CalciteMetaImpl.java    | 23 +-----
 .../apache/calcite/jdbc/DatabaseProperties.java | 78 ++++++++++++++++++++
 .../calcite/jdbc/CalciteRemoteDriverTest.java   | 33 +++++++++
 12 files changed, 276 insertions(+), 74 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/93c2ff51/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java b/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
index 2beeadf..e790e9f 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
@@ -348,34 +348,27 @@ public class JdbcMeta implements Meta {
     }
   }
 
-  public String getSqlKeywords() {
+  public String getDatabaseProperties(Meta.DatabaseProperties propertyName) {
     try {
-      return connection.getMetaData().getSQLKeywords();
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  public String getNumericFunctions() {
-    try {
-      return connection.getMetaData().getNumericFunctions();
+      switch(propertyName) {
+      case NUMERIC_FUNCTIONS:
+        return connection.getMetaData().getNumericFunctions();
+      case SYSTEM_FUNCTIONS:
+        return connection.getMetaData().getSystemFunctions();
+      case TIME_DATE_FUNCTIONS:
+        return connection.getMetaData().getTimeDateFunctions();
+      case STRING_FUNCTIONS:
+        return connection.getMetaData().getStringFunctions();
+      case SQL_KEYWORDS:
+        return connection.getMetaData().getSQLKeywords();
+      default:
+        return "";
+      }
     } catch (SQLException e) {
       throw new RuntimeException(e);
     }
   }
 
-  public String getStringFunctions() {
-    return null;
-  }
-
-  public String getSystemFunctions() {
-    return null;
-  }
-
-  public String getTimeDateFunctions() {
-    return null;
-  }
-
   public MetaResultSet getTables(String catalog, Pat schemaPattern,
       Pat tableNamePattern, List<String> typeList) {
     try {

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/93c2ff51/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java b/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
index 3fbd8a7..7ec10d8 100644
--- a/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
+++ b/avatica-server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
@@ -109,6 +109,49 @@ public class RemoteDriverTest {
     connection.close();
   }
 
+  @Test public void testDatabaseProperties() throws Exception {
+    final Connection connection = ljs();
+    for (Meta.DatabaseProperties p : Meta.DatabaseProperties.values()) {
+      switch(p) {
+      case NUMERIC_FUNCTIONS:
+        assertEquals("Fail to get NUMERIC_FUNCTIONS",
+          "ABS,ACOS,ASIN,ATAN,ATAN2,BITAND,BITOR,BITXOR,"
+          + "CEILING,COS,COT,DEGREES,EXP,FLOOR,LOG,LOG10,MOD,"
+          + "PI,POWER,RADIANS,RAND,ROUND,ROUNDMAGIC,SIGN,SIN,"
+          + "SQRT,TAN,TRUNCATE",
+          connection.getMetaData().getNumericFunctions());
+        break;
+      case SYSTEM_FUNCTIONS:
+        assertEquals("Fail to get SYSTEM_FUNCTIONS",
+          "DATABASE,IFNULL,USER",
+          connection.getMetaData().getSystemFunctions());
+        break;
+      case TIME_DATE_FUNCTIONS:
+        assertEquals("Fail to get TIME_DATE_FUNCTIONS",
+          "CURDATE,CURTIME,DATEDIFF,DAYNAME,DAYOFMONTH,DAYOFWEEK,"
+          + "DAYOFYEAR,HOUR,MINUTE,MONTH,MONTHNAME,NOW,QUARTER,SECOND,"
+          + "SECONDS_SINCE_MIDNIGHT,TIMESTAMPADD,TIMESTAMPDIFF,"
+          + "TO_CHAR,WEEK,YEAR",
+          connection.getMetaData().getTimeDateFunctions());
+        break;
+      case SQL_KEYWORDS:
+        assertEquals("Fail to get SQL_KEYWORDS",
+          "", //No SQL keywords return for HSQLDB
+          connection.getMetaData().getSQLKeywords());
+        break;
+      case STRING_FUNCTIONS:
+        assertEquals("Fail to get STRING_FUNCTIONS",
+          "ASCII,CHAR,CONCAT,DIFFERENCE,HEXTORAW,INSERT,LCASE,"
+          + "LEFT,LENGTH,LOCATE,LTRIM,RAWTOHEX,REPEAT,REPLACE,"
+          + "RIGHT,RTRIM,SOUNDEX,SPACE,SUBSTR,UCASE",
+          connection.getMetaData().getStringFunctions());
+        break;
+      default:
+      }
+    }
+    connection.close();
+  }
+
   @Test public void testTables() throws Exception {
     final Connection connection = mjs();
     final ResultSet resultSet =

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/93c2ff51/avatica/src/main/java/org/apache/calcite/avatica/AvaticaDatabaseMetaData.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaDatabaseMetaData.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaDatabaseMetaData.java
index 915a0b4..32f7e37 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaDatabaseMetaData.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaDatabaseMetaData.java
@@ -182,23 +182,23 @@ public class AvaticaDatabaseMetaData implements DatabaseMetaData {
   }
 
   public String getSQLKeywords() throws SQLException {
-    return connection.meta.getSqlKeywords();
+    return connection.meta.getDatabaseProperties(Meta.DatabaseProperties.SQL_KEYWORDS);
   }
 
   public String getNumericFunctions() throws SQLException {
-    return connection.meta.getNumericFunctions();
+    return connection.meta.getDatabaseProperties(Meta.DatabaseProperties.NUMERIC_FUNCTIONS);
   }
 
   public String getStringFunctions() throws SQLException {
-    return connection.meta.getStringFunctions();
+    return connection.meta.getDatabaseProperties(Meta.DatabaseProperties.STRING_FUNCTIONS);
   }
 
   public String getSystemFunctions() throws SQLException {
-    return connection.meta.getSystemFunctions();
+    return connection.meta.getDatabaseProperties(Meta.DatabaseProperties.SYSTEM_FUNCTIONS);
   }
 
   public String getTimeDateFunctions() throws SQLException {
-    return connection.meta.getTimeDateFunctions();
+    return connection.meta.getDatabaseProperties(Meta.DatabaseProperties.TIME_DATE_FUNCTIONS);
   }
 
   public String getSearchStringEscape() throws SQLException {

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/93c2ff51/avatica/src/main/java/org/apache/calcite/avatica/Meta.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/Meta.java b/avatica/src/main/java/org/apache/calcite/avatica/Meta.java
index c796d32..0c9e8ad 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/Meta.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/Meta.java
@@ -40,15 +40,15 @@ import java.util.Objects;
  * that each provider must implement. This is not ideal.</p>
  */
 public interface Meta {
-  String getSqlKeywords();
 
-  String getNumericFunctions();
-
-  String getStringFunctions();
-
-  String getSystemFunctions();
-
-  String getTimeDateFunctions();
+  /**
+   * Return database static properties, deprecating single function call getNumericFunctions,
+   * getStringFunctions, getSystemFunctions, getSqlKeywords and getTimeDateFunctions
+   *
+   * @param DatabaseProperty to get
+   * @return CSV String of the supported function/keyword
+   */
+  String getDatabaseProperties(DatabaseProperties databaseProperty);
 
   MetaResultSet getTables(String catalog,
       Pat schemaPattern,
@@ -238,6 +238,36 @@ public interface Meta {
     }
   }
 
+  /** Database Properties Enum for Meta#{@link Meta#getDatabaseProperties(DatabaseProperties)}}
+   */
+  enum DatabaseProperties {
+    NUMERIC_FUNCTIONS,
+    STRING_FUNCTIONS,
+    SYSTEM_FUNCTIONS,
+    TIME_DATE_FUNCTIONS,
+    SQL_KEYWORDS;
+  }
+
+  /** POJO for Meta#{@link Meta#getDatabaseProperties(PropertyName)}}
+   *
+   * <p>Payload for {@link Service.DatabasePropertyRequest} and
+   * {@link Service.DatabasePropertyResponse}
+   *
+   * For {@link Service.Request}, the value is set to null
+   */
+  class DatabaseProperty {
+    public final DatabaseProperties databaseProperty;
+    public final String value;
+
+    @JsonCreator
+    public DatabaseProperty(
+      @JsonProperty("propertyName") DatabaseProperties dbProp,
+      @JsonProperty("value") String value) {
+      this.databaseProperty = dbProp;
+      this.value = value;
+    }
+  }
+
   /** Response from execute.
    *
    * <p>Typically a query will have a result set and rowCount = -1;

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/93c2ff51/avatica/src/main/java/org/apache/calcite/avatica/MetaImpl.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/MetaImpl.java b/avatica/src/main/java/org/apache/calcite/avatica/MetaImpl.java
index 4371047..c310a9f 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/MetaImpl.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/MetaImpl.java
@@ -510,23 +510,7 @@ public abstract class MetaImpl implements Meta {
   public static class MetaSuperTable {
   }
 
-  public String getSqlKeywords() {
-    return "";
-  }
-
-  public String getNumericFunctions() {
-    return "";
-  }
-
-  public String getStringFunctions() {
-    return "";
-  }
-
-  public String getSystemFunctions() {
-    return "";
-  }
-
-  public String getTimeDateFunctions() {
+  public String getDatabaseProperties(Meta.DatabaseProperties propName) {
     return "";
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/93c2ff51/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java
index ccc74f8..cabd6c1 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/JsonService.java
@@ -249,6 +249,14 @@ public abstract class JsonService implements Service {
       throw handle(e);
     }
   }
+
+  public DatabasePropertyResponse apply(DatabasePropertyRequest request) {
+    try {
+      return decode(apply(encode(request)), DatabasePropertyResponse.class);
+    } catch (IOException e) {
+      throw handle(e);
+    }
+  }
 }
 
 // End JsonService.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/93c2ff51/avatica/src/main/java/org/apache/calcite/avatica/remote/LocalService.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/LocalService.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/LocalService.java
index bea1664..c43fbc5 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/LocalService.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/LocalService.java
@@ -191,6 +191,13 @@ public class LocalService implements Service {
         meta.connectionSync(new Meta.ConnectionHandle(request.connectionId), request.connProps);
     return new ConnectionSyncResponse(connProps);
   }
+
+  public DatabasePropertyResponse apply(DatabasePropertyRequest request) {
+    final Meta.DatabaseProperty dbProperty = new Meta.DatabaseProperty(
+        request.dbProps.databaseProperty,
+        meta.getDatabaseProperties(request.dbProps.databaseProperty));
+    return new DatabasePropertyResponse(dbProperty);
+  }
 }
 
 // End LocalService.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/93c2ff51/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java
index 4267186..fc6e912 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java
@@ -36,6 +36,7 @@ import java.util.Map;
 class RemoteMeta extends MetaImpl {
   final Service service;
   final Map<String, ConnectionPropertiesImpl> propsMap = new HashMap<>();
+  private final Map<Meta.DatabaseProperties, String> dbPropMap = new HashMap<>();
 
   public RemoteMeta(AvaticaConnection connection, Service service) {
     super(connection);
@@ -61,6 +62,19 @@ class RemoteMeta extends MetaImpl {
         response.ownStatement, signature0, response.firstFrame);
   }
 
+  @Override public String getDatabaseProperties(Meta.DatabaseProperties databaseProperty) {
+    String dbProp = dbPropMap.get(databaseProperty);
+    if (dbProp == null) {
+      final Meta.DatabaseProperty dbProps =
+          new Meta.DatabaseProperty(databaseProperty, null);
+      final Service.DatabasePropertyResponse response =
+        service.apply(new Service.DatabasePropertyRequest(dbProps));
+      dbPropMap.put(databaseProperty, response.dbProps.value);
+      dbProp = response.dbProps.value;
+    }
+    return dbProp;
+  }
+
   @Override public StatementHandle createStatement(ConnectionHandle ch) {
     connectionSync(ch, new ConnectionPropertiesImpl()); // sync connection state if necessary
     final Service.CreateStatementResponse response =

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/93c2ff51/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java
index 3e9f24f..1014dfd 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/Service.java
@@ -42,6 +42,7 @@ public interface Service {
   CloseStatementResponse apply(CloseStatementRequest request);
   CloseConnectionResponse apply(CloseConnectionRequest request);
   ConnectionSyncResponse apply(ConnectionSyncRequest request);
+  DatabasePropertyResponse apply(DatabasePropertyRequest request);
 
   /** Factory that creates a {@code Service}. */
   interface Factory {
@@ -70,7 +71,8 @@ public interface Service {
           name = "closeStatement"),
       @JsonSubTypes.Type(value = CloseConnectionRequest.class,
           name = "closeConnection"),
-      @JsonSubTypes.Type(value = ConnectionSyncRequest.class, name = "connectionSync") })
+      @JsonSubTypes.Type(value = ConnectionSyncRequest.class, name = "connectionSync"),
+      @JsonSubTypes.Type(value = DatabasePropertyRequest.class, name = "databaseProperties") })
   abstract class Request {
     abstract Response accept(Service service);
   }
@@ -90,7 +92,8 @@ public interface Service {
           name = "closeStatement"),
       @JsonSubTypes.Type(value = CloseConnectionResponse.class,
           name = "closeConnection"),
-      @JsonSubTypes.Type(value = ConnectionSyncResponse.class, name = "connectionSync") })
+      @JsonSubTypes.Type(value = ConnectionSyncResponse.class, name = "connectionSync"),
+      @JsonSubTypes.Type(value = DatabasePropertyResponse.class, name = "databaseProperties") })
   abstract class Response {
   }
 
@@ -103,6 +106,21 @@ public interface Service {
   }
 
   /** Request for
+   * {@link org.apache.calcite.avatica.Meta#getDatabaseProperties()}. */
+  class DatabasePropertyRequest extends Request {
+    public final Meta.DatabaseProperty dbProps;
+
+    @JsonCreator
+    public DatabasePropertyRequest(@JsonProperty("dbProps") Meta.DatabaseProperty dbProps) {
+      this.dbProps = dbProps;
+    }
+
+    DatabasePropertyResponse accept(Service service) {
+      return service.apply(this);
+    }
+  }
+
+  /** Request for
    * {@link Meta#getSchemas(String, org.apache.calcite.avatica.Meta.Pat)}. */
   class SchemasRequest extends Request {
     public final String catalog;
@@ -434,6 +452,17 @@ public interface Service {
       this.connProps = connProps;
     }
   }
+
+  /** Response for
+   * {@link Meta#getDatabaseProperties(Meta.DatabaseProperty)}. */
+  class DatabasePropertyResponse extends Response {
+    public final Meta.DatabaseProperty dbProps;
+
+    @JsonCreator
+    public DatabasePropertyResponse(@JsonProperty("dbProps") Meta.DatabaseProperty dbProps) {
+      this.dbProps = dbProps;
+    }
+  }
 }
 
 // End Service.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/93c2ff51/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
index e08e6a2..18dd609 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
@@ -44,8 +44,6 @@ import org.apache.calcite.schema.SchemaPlus;
 import org.apache.calcite.schema.Table;
 import org.apache.calcite.schema.impl.AbstractTableQueryable;
 import org.apache.calcite.server.CalciteServerStatement;
-import org.apache.calcite.sql.SqlJdbcFunctionCall;
-import org.apache.calcite.sql.parser.SqlParser;
 import org.apache.calcite.util.Util;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -53,6 +51,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
+
 import java.lang.reflect.Field;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
@@ -210,24 +209,8 @@ public class CalciteMetaImpl extends MetaImpl {
     return (CalciteConnectionImpl) connection;
   }
 
-  public String getSqlKeywords() {
-    return SqlParser.create("").getMetadata().getJdbcKeywords();
-  }
-
-  public String getNumericFunctions() {
-    return SqlJdbcFunctionCall.getNumericFunctions();
-  }
-
-  public String getStringFunctions() {
-    return SqlJdbcFunctionCall.getStringFunctions();
-  }
-
-  public String getSystemFunctions() {
-    return SqlJdbcFunctionCall.getSystemFunctions();
-  }
-
-  public String getTimeDateFunctions() {
-    return SqlJdbcFunctionCall.getTimeDateFunctions();
+  @Override public String getDatabaseProperties(Meta.DatabaseProperties dbProp) {
+    return org.apache.calcite.jdbc.DatabaseProperties.getProperty(dbProp);
   }
 
   public MetaResultSet getTables(String catalog,

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/93c2ff51/core/src/main/java/org/apache/calcite/jdbc/DatabaseProperties.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/jdbc/DatabaseProperties.java b/core/src/main/java/org/apache/calcite/jdbc/DatabaseProperties.java
new file mode 100644
index 0000000..59c231b
--- /dev/null
+++ b/core/src/main/java/org/apache/calcite/jdbc/DatabaseProperties.java
@@ -0,0 +1,78 @@
+/*
+ * 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.calcite.jdbc;
+
+import org.apache.calcite.avatica.AvaticaDatabaseMetaData;
+import org.apache.calcite.avatica.Meta;
+import org.apache.calcite.sql.SqlJdbcFunctionCall;
+import org.apache.calcite.sql.parser.SqlParser;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * Definition of a database static properties.
+ * {@link Meta.PropertyName} enumerates current database properties,
+ * supporting some of the static String properties return via
+ * {@link AvaticaDatabaseMetaData}
+ */
+public enum DatabaseProperties {
+  NUMERIC_FUNCTIONS(Meta.DatabaseProperties.NUMERIC_FUNCTIONS,
+    SqlJdbcFunctionCall.getNumericFunctions()),
+  STRING_FUNCTIONS(Meta.DatabaseProperties.STRING_FUNCTIONS,
+    SqlJdbcFunctionCall.getStringFunctions()),
+  SYSTEM_FUNCTIONS(Meta.DatabaseProperties.SYSTEM_FUNCTIONS,
+    SqlJdbcFunctionCall.getSystemFunctions()),
+  TIME_DATE_FUNCTIONS(Meta.DatabaseProperties.TIME_DATE_FUNCTIONS,
+    SqlJdbcFunctionCall.getTimeDateFunctions()),
+  SQL_KEYWORDS(Meta.DatabaseProperties.SQL_KEYWORDS,
+    SqlParser.create("").getMetadata().getJdbcKeywords());
+
+  private Meta.DatabaseProperties databaseProperty;
+  private String defaultValue;
+  private static final Map<Meta.DatabaseProperties, DatabaseProperties> NAME_TO_PROPS;
+
+  static {
+    NAME_TO_PROPS = new HashMap<Meta.DatabaseProperties, DatabaseProperties>();
+    for (DatabaseProperties p : DatabaseProperties.values()) {
+      NAME_TO_PROPS.put(p.databaseProperty, p);
+    }
+  }
+
+  DatabaseProperties(Meta.DatabaseProperties dbProp, String defaultValue) {
+    this.databaseProperty = dbProp;
+    this.defaultValue = defaultValue;
+  }
+
+  public Meta.DatabaseProperties databaseProperty() {
+    return this.databaseProperty;
+  }
+
+  public String defaultValue() {
+    return this.defaultValue;
+  }
+
+  public static String getProperty(Meta.DatabaseProperties dbProps) {
+    final DatabaseProperties dbProp = NAME_TO_PROPS.get(dbProps);
+    if (dbProp != null) {
+      return dbProp.defaultValue;
+    } else {
+      return "";
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/93c2ff51/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java b/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
index f0b3b93..db71914 100644
--- a/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
+++ b/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
@@ -194,6 +194,39 @@ public class CalciteRemoteDriverTest {
     assertThat(connection.isClosed(), is(true));
   }
 
+  @Test public void testMetaFunctionsLocal() throws Exception {
+    final Connection connection =
+        CalciteAssert.hr().connect();
+    assertThat(connection.isClosed(), is(false));
+    for (DatabaseProperties p : DatabaseProperties.values()) {
+      switch(p.databaseProperty()) {
+      case NUMERIC_FUNCTIONS:
+        assertThat(connection.getMetaData().getNumericFunctions(),
+          is(p.defaultValue()));
+        break;
+      case SYSTEM_FUNCTIONS:
+        assertThat(connection.getMetaData().getSystemFunctions(),
+          is(p.defaultValue()));
+        break;
+      case TIME_DATE_FUNCTIONS:
+        assertThat(connection.getMetaData().getTimeDateFunctions(),
+          is(p.defaultValue()));
+        break;
+      case SQL_KEYWORDS:
+        assertThat(connection.getMetaData().getSQLKeywords(),
+          is(p.defaultValue()));
+        break;
+      case STRING_FUNCTIONS:
+        assertThat(connection.getMetaData().getStringFunctions(),
+          is(p.defaultValue()));
+        break;
+      default:
+      }
+    }
+    connection.close();
+    assertThat(connection.isClosed(), is(true));
+  }
+
   @Test public void testRemoteCatalogs() throws Exception {
     CalciteAssert.hr().with(REMOTE_CONNECTION_FACTORY)
         .metaData(GET_CATALOGS)