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 2016/04/30 03:25:04 UTC

[2/3] calcite git commit: [CALCITE-1168] Add DESCRIBE statement (Arina Ielchiieva)

[CALCITE-1168] Add DESCRIBE statement (Arina Ielchiieva)


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

Branch: refs/heads/master
Commit: a065200ad714ed5f9015e8a00b534c10f9fa6a15
Parents: b7fbb35
Author: Arina Ielchiieva <ar...@gmail.com>
Authored: Mon Mar 28 19:13:22 2016 +0300
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Apr 29 16:53:38 2016 -0700

----------------------------------------------------------------------
 core/src/main/codegen/templates/Parser.jj       |  41 ++++++++
 .../apache/calcite/sql/SqlDescribeSchema.java   |  77 ++++++++++++++
 .../apache/calcite/sql/SqlDescribeTable.java    | 104 +++++++++++++++++++
 .../java/org/apache/calcite/sql/SqlKind.java    |   5 +
 .../calcite/sql/parser/SqlParserTest.java       |  18 ++++
 site/_docs/reference.md                         |   6 ++
 6 files changed, 251 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/a065200a/core/src/main/codegen/templates/Parser.jj
----------------------------------------------------------------------
diff --git a/core/src/main/codegen/templates/Parser.jj b/core/src/main/codegen/templates/Parser.jj
index c1df4cb..3419abc 100644
--- a/core/src/main/codegen/templates/Parser.jj
+++ b/core/src/main/codegen/templates/Parser.jj
@@ -48,6 +48,8 @@ import org.apache.calcite.sql.SqlCollation;
 import org.apache.calcite.sql.SqlDataTypeSpec;
 import org.apache.calcite.sql.SqlDateLiteral;
 import org.apache.calcite.sql.SqlDelete;
+import org.apache.calcite.sql.SqlDescribeSchema;
+import org.apache.calcite.sql.SqlDescribeTable;
 import org.apache.calcite.sql.SqlDynamicParam;
 import org.apache.calcite.sql.SqlExplain;
 import org.apache.calcite.sql.SqlExplainLevel;
@@ -928,6 +930,8 @@ SqlNode SqlStmt() :
         |
         stmt = SqlExplain()
         |
+        stmt = SqlDescribe()
+        |
         stmt = SqlInsert()
         |
         stmt = SqlDelete()
@@ -1126,6 +1130,41 @@ SqlExplainLevel ExplainDetailLevel() :
 }
 
 /**
+* Parsers DESCRIBE statement call
+*/
+SqlNode SqlDescribe() :
+{
+   SqlParserPos pos;
+   SqlIdentifier table;
+   SqlIdentifier column = null;
+   SqlNode columnQualifier = null;
+}
+{
+(
+    <DESCRIBE> { pos = getPos(); }
+   (<SCHEMA> | <DATABASE>)
+    {
+        return new SqlDescribeSchema(pos, CompoundIdentifier());
+    }
+)
+    |
+(
+    <DESCRIBE> { pos = getPos(); }
+    table = CompoundIdentifier()
+    (
+        column = CompoundIdentifier()
+        |
+        columnQualifier = StringLiteral()
+        |
+        E()
+    )
+    {
+        return new SqlDescribeTable(pos, table, column, columnQualifier);
+    }
+)
+}
+
+/**
  * Parses a CALL statement.
  */
 SqlNode SqlProcedureCall() :
@@ -4838,6 +4877,7 @@ SqlPostfixOperator PostfixRowOperator() :
     | < CURSOR_NAME: "CURSOR_NAME" >
     | < CYCLE: "CYCLE" >
     | < DATA: "DATA" >
+    | < DATABASE: "DATABASE" >
     | < DATE: "DATE" >
     | < DATETIME_INTERVAL_CODE: "DATETIME_INTERVAL_CODE" >
     | < DATETIME_INTERVAL_PRECISION: "DATETIME_INTERVAL_PRECISION" >
@@ -5340,6 +5380,7 @@ String CommonNonReservedKeyWord() :
         | <CONTINUE>
         | <CURSOR_NAME>
         | <DATA>
+        | <DATABASE>
         | <DATETIME_INTERVAL_CODE>
         | <DATETIME_INTERVAL_PRECISION>
         | <DEFAULTS>

http://git-wip-us.apache.org/repos/asf/calcite/blob/a065200a/core/src/main/java/org/apache/calcite/sql/SqlDescribeSchema.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDescribeSchema.java b/core/src/main/java/org/apache/calcite/sql/SqlDescribeSchema.java
new file mode 100644
index 0000000..f69b31e
--- /dev/null
+++ b/core/src/main/java/org/apache/calcite/sql/SqlDescribeSchema.java
@@ -0,0 +1,77 @@
+/*
+ * 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.sql;
+
+import org.apache.calcite.sql.parser.SqlParserPos;
+import org.apache.calcite.util.ImmutableNullableList;
+
+import java.util.List;
+
+/**
+ * A <code>SqlDescribeSchema</code> is a node of a parse tree which represents an
+ * DESCRIBE SCHEMA statement.
+ */
+public class SqlDescribeSchema extends SqlCall {
+
+  public static final SqlSpecialOperator OPERATOR =
+      new SqlSpecialOperator("DESCRIBE_SCHEMA", SqlKind.DESCRIBE) {
+        @Override public SqlCall createCall(SqlLiteral functionQualifier,
+                                        SqlParserPos pos, SqlNode... operands) {
+          return new SqlDescribeSchema(pos, (SqlIdentifier) operands[0]);
+        }
+      };
+
+  SqlIdentifier schema;
+
+  public SqlDescribeSchema(SqlParserPos pos, SqlIdentifier schema) {
+    super(pos);
+    this.schema = schema;
+  }
+
+  @Override public void unparse(SqlWriter writer, int leftPrec, int rightPrec) {
+    writer.keyword("DESCRIBE");
+    writer.keyword("SCHEMA");
+    schema.unparse(writer, leftPrec, rightPrec);
+  }
+
+  @Override public void setOperand(int i, SqlNode operand) {
+    switch (i) {
+    case 0:
+      schema = (SqlIdentifier) operand;
+      break;
+    default:
+      throw new AssertionError(i);
+    }
+  }
+
+  @Override public SqlKind getKind() {
+    return SqlKind.DESCRIBE;
+  }
+
+  @Override public SqlOperator getOperator() {
+    return OPERATOR;
+  }
+
+  @Override public List<SqlNode> getOperandList() {
+    return ImmutableNullableList.of((SqlNode) schema);
+  }
+
+  public SqlIdentifier getSchema() { return schema; }
+}
+
+// End SqlDescribeSchema.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/a065200a/core/src/main/java/org/apache/calcite/sql/SqlDescribeTable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDescribeTable.java b/core/src/main/java/org/apache/calcite/sql/SqlDescribeTable.java
new file mode 100644
index 0000000..e058e07
--- /dev/null
+++ b/core/src/main/java/org/apache/calcite/sql/SqlDescribeTable.java
@@ -0,0 +1,104 @@
+/*
+ * 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.sql;
+
+import org.apache.calcite.sql.parser.SqlParserPos;
+import org.apache.calcite.util.ImmutableNullableList;
+
+import java.util.List;
+
+/**
+ * A <code>SqlDescribeTable</code> is a node of a parse tree which represents an
+ * DESCRIBE table statement.
+ */
+public class SqlDescribeTable extends SqlCall {
+
+  public static final SqlSpecialOperator OPERATOR =
+      new SqlSpecialOperator("DESCRIBE_TABLE", SqlKind.DESCRIBE) {
+        @Override public SqlCall createCall(SqlLiteral functionQualifier,
+                              SqlParserPos pos,
+                              SqlNode... operands) {
+          return new SqlDescribeTable(pos,
+                      (SqlIdentifier) operands[0],
+                      (SqlIdentifier) operands[1],
+                      operands[2]);
+        }
+      };
+
+  SqlIdentifier table;
+  SqlIdentifier column;
+  SqlNode columnQualifier;
+
+  public SqlDescribeTable(SqlParserPos pos,
+                          SqlIdentifier table,
+                          SqlIdentifier column,
+                          SqlNode columnQualifier) {
+    super(pos);
+    this.table = table;
+    this.column = column;
+    this.columnQualifier = columnQualifier;
+  }
+
+  @Override public void unparse(SqlWriter writer, int leftPrec, int rightPrec) {
+    writer.keyword("DESCRIBE");
+    table.unparse(writer, leftPrec, rightPrec);
+    if (column != null) {
+      column.unparse(writer, leftPrec, rightPrec);
+    }
+    if (columnQualifier != null) {
+      columnQualifier.unparse(writer, leftPrec, rightPrec);
+    }
+  }
+
+
+  @Override public void setOperand(int i, SqlNode operand) {
+    switch (i) {
+    case 0:
+      table = (SqlIdentifier) operand;
+      break;
+    case 1:
+      column = (SqlIdentifier) operand;
+      break;
+    case 2:
+      columnQualifier = operand;
+      break;
+    default:
+      throw new AssertionError(i);
+    }
+  }
+
+  @Override public SqlKind getKind() {
+    return SqlKind.DESCRIBE;
+  }
+
+  @Override public SqlOperator getOperator() {
+    return OPERATOR;
+  }
+
+  @Override public List<SqlNode> getOperandList() {
+    return ImmutableNullableList.of(table, column, columnQualifier);
+  }
+
+  public SqlIdentifier getTable() { return table; }
+
+  public SqlIdentifier getColumn() { return column; }
+
+  public SqlNode getColumnQualifier() { return columnQualifier; }
+}
+
+// End SqlDescribeTable.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/a065200a/core/src/main/java/org/apache/calcite/sql/SqlKind.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlKind.java b/core/src/main/java/org/apache/calcite/sql/SqlKind.java
index bb84547..dbd6a47 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlKind.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlKind.java
@@ -122,6 +122,11 @@ public enum SqlKind {
   EXPLAIN,
 
   /**
+   * DESCRIBE statement
+   */
+  DESCRIBE,
+
+  /**
    * INSERT statement
    */
   INSERT,

http://git-wip-us.apache.org/repos/asf/calcite/blob/a065200a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
index 0d7d614..2a5725d 100644
--- a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
@@ -2178,6 +2178,24 @@ public class SqlParserTest {
             + "(VALUES (ROW(TRUE)))");
   }
 
+  @Test public void testDescribeSchema() {
+    check(
+        "describe schema A",
+        "DESCRIBE SCHEMA `A`");
+    check(
+        "describe database A",
+        "DESCRIBE SCHEMA `A`");
+  }
+
+  @Test public void testDescribeTable() {
+    check("describe emps",
+        "DESCRIBE `EMPS`");
+    check("describe emps col1",
+        "DESCRIBE `EMPS` `COL1`");
+    check("describe emps 'col_'",
+        "DESCRIBE `EMPS` 'col_'");
+  }
+
   @Test public void testInsertSelect() {
     check(
         "insert into emps select * from emps",

http://git-wip-us.apache.org/repos/asf/calcite/blob/a065200a/site/_docs/reference.md
----------------------------------------------------------------------
diff --git a/site/_docs/reference.md b/site/_docs/reference.md
index aabc42f..952788d 100644
--- a/site/_docs/reference.md
+++ b/site/_docs/reference.md
@@ -34,6 +34,7 @@ statement:
       setStatement
   |   resetStatement
   |   explain
+  |   describe
   |   insert
   |   update
   |   merge
@@ -53,6 +54,10 @@ explain:
       [ EXCLUDING ATTRIBUTES | INCLUDING [ ALL ] ATTRIBUTES ]
       FOR ( insert | update | merge | delete | query )
 
+describe:
+      DESCRIBE (SCHEMA | DATABASE) identifier
+   |  DESCRIBE table (column | columnQualifier)
+
 insert:
       ( INSERT | UPSERT ) INTO tablePrimary
       [ '(' column [, column ]* ')' ]
@@ -310,6 +315,7 @@ CONTINUE,
 CURSOR_NAME,
 **CYCLE**,
 DATA,
+DATABASE,
 **DATE**,
 DATETIME_INTERVAL_CODE,
 DATETIME_INTERVAL_PRECISION,