Repository: phoenix
Updated Branches:
  refs/heads/calcite f14d5a707 -> c1f4d90b7


PHOENIX-3256 Support CREATE SCHEMA in Phoenix-Calcite Integration(Rajeshbabu)


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

Branch: refs/heads/calcite
Commit: c1f4d90b7cbb1eba7accf44cfb745b4d9ad05493
Parents: f14d5a7
Author: Rajeshbabu Chintaguntla <rajeshb...@apache.org>
Authored: Fri Dec 2 22:00:04 2016 +0530
Committer: Rajeshbabu Chintaguntla <rajeshb...@apache.org>
Committed: Fri Dec 2 22:00:04 2016 +0530

----------------------------------------------------------------------
 .../org/apache/phoenix/end2end/UseSchemaIT.java |  2 +-
 phoenix-core/src/main/codegen/data/Parser.tdd   |  4 +
 .../src/main/codegen/includes/parserImpls.ftl   | 78 ++++++++++++++++++++
 .../phoenix/calcite/PhoenixPrepareImpl.java     | 31 +++++++-
 .../phoenix/calcite/parse/SqlCreateSchema.java  | 58 +++++++++++++++
 .../phoenix/calcite/parse/SqlDropSchema.java    | 60 +++++++++++++++
 .../phoenix/calcite/parse/SqlUseSchema.java     | 55 ++++++++++++++
 7 files changed, 286 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/c1f4d90b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UseSchemaIT.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UseSchemaIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UseSchemaIT.java
index 07ae77e..8c48c23 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UseSchemaIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UseSchemaIT.java
@@ -75,7 +75,7 @@ public class UseSchemaIT extends ParallelStatsDisabledIT {
         } catch (SQLException e) {
             assertEquals(SQLExceptionCode.SCHEMA_NOT_FOUND.getErrorCode(), 
e.getErrorCode());
         }
-        conn.createStatement().execute("use default");
+        conn.createStatement().execute("use " + "\"DEFAULT\"");
         ddl = "create table IF NOT EXISTS " + testTable + "(schema_name 
varchar primary key)";
         conn.createStatement().execute(ddl);
         conn.createStatement().executeUpdate("upsert into " + testTable + " 
values('"+SchemaUtil.SCHEMA_FOR_DEFAULT_NAMESPACE+"')");

http://git-wip-us.apache.org/repos/asf/phoenix/blob/c1f4d90b/phoenix-core/src/main/codegen/data/Parser.tdd
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/codegen/data/Parser.tdd 
b/phoenix-core/src/main/codegen/data/Parser.tdd
index 42c060a..0df9d8c 100644
--- a/phoenix-core/src/main/codegen/data/Parser.tdd
+++ b/phoenix-core/src/main/codegen/data/Parser.tdd
@@ -53,6 +53,7 @@
     "DEFAULTVALUE"
     "JARS"
     "UPLOAD"
+    "USE"
   ]
 
   # List of keywords from "keywords" section that are not reserved.
@@ -76,6 +77,9 @@
     "SqlUploadJarsNode()"
     "SqlDeleteJarNode()"
     "SqlAlterTable()"
+    "SqlCreateSchema()"
+    "SqlDropSchema()"
+    "SqlUseSchema()"
   ]
 
   # List of methods for parsing custom literals.

http://git-wip-us.apache.org/repos/asf/phoenix/blob/c1f4d90b/phoenix-core/src/main/codegen/includes/parserImpls.ftl
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/codegen/includes/parserImpls.ftl 
b/phoenix-core/src/main/codegen/includes/parserImpls.ftl
index 984009e..50e1c7a 100644
--- a/phoenix-core/src/main/codegen/includes/parserImpls.ftl
+++ b/phoenix-core/src/main/codegen/includes/parserImpls.ftl
@@ -457,6 +457,84 @@ SqlNode SqlDropSequence() :
 
 /**
  * Parses statement
+ *   CREATE SCHEMA
+ */
+SqlNode SqlCreateSchema() :
+{
+    SqlParserPos pos;
+    SqlIdentifier schemaName;
+    boolean ifNotExists;
+}
+{
+    <CREATE> { pos = getPos(); } <SCHEMA>
+    (
+        <IF> <NOT> <EXISTS> { ifNotExists = true; }
+        |
+        {
+            ifNotExists = false;
+        }
+    )
+    schemaName = SimpleIdentifier()
+    {
+        return new SqlCreateSchema(pos.plus(getPos()), schemaName,
+            SqlLiteral.createBoolean(ifNotExists, SqlParserPos.ZERO));
+    }
+}
+
+/**
+ * Parses statement
+ *   DROP SCHEMA
+ */
+SqlNode SqlDropSchema() :
+{
+    SqlParserPos pos;
+    SqlIdentifier schemaName;
+    boolean ifExists;
+    boolean cascade;
+}
+{
+    <DROP> { pos = getPos(); } <SCHEMA>
+    (
+        <IF> <EXISTS> { ifExists = true; }
+        |
+        {
+            ifExists = false;
+        }
+    )
+    schemaName = SimpleIdentifier()
+    (
+        <CASCADE> { cascade = true; }
+        |
+        {
+            cascade = false;
+        }
+    )
+    {
+        return new SqlDropSchema(pos.plus(getPos()), schemaName,
+            SqlLiteral.createBoolean(ifExists, SqlParserPos.ZERO), 
+            SqlLiteral.createBoolean(cascade, SqlParserPos.ZERO));
+    }
+}
+
+/**
+ * Parses statement
+ *   USE SCHEMA
+ */
+SqlNode SqlUseSchema() :
+{
+    SqlParserPos pos;
+    SqlIdentifier schemaName;
+}
+{
+    <USE> { pos = getPos(); }
+    schemaName = SimpleIdentifier()
+    {
+        return new SqlUseSchema(pos.plus(getPos()), schemaName);
+    }
+}
+
+/**
+ * Parses statement
  *   UPDATE STATISTICS
  */
 SqlNode SqlUpdateStatistics() :

http://git-wip-us.apache.org/repos/asf/phoenix/blob/c1f4d90b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixPrepareImpl.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixPrepareImpl.java 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixPrepareImpl.java
index 1489ae8..c907dac 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixPrepareImpl.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixPrepareImpl.java
@@ -49,15 +49,18 @@ import org.apache.hadoop.hbase.util.Pair;
 import org.apache.phoenix.calcite.parse.SqlAlterTable;
 import org.apache.phoenix.calcite.parse.SqlCreateFunction;
 import org.apache.phoenix.calcite.parse.SqlCreateIndex;
+import org.apache.phoenix.calcite.parse.SqlCreateSchema;
 import org.apache.phoenix.calcite.parse.SqlCreateSequence;
 import org.apache.phoenix.calcite.parse.SqlCreateTable;
 import org.apache.phoenix.calcite.parse.SqlDeleteJarNode;
 import org.apache.phoenix.calcite.parse.SqlDropFunction;
 import org.apache.phoenix.calcite.parse.SqlDropIndex;
+import org.apache.phoenix.calcite.parse.SqlDropSchema;
 import org.apache.phoenix.calcite.parse.SqlDropSequence;
 import org.apache.phoenix.calcite.parse.SqlDropTable;
 import org.apache.phoenix.calcite.parse.SqlUpdateStatistics;
 import org.apache.phoenix.calcite.parse.SqlUploadJarsNode;
+import org.apache.phoenix.calcite.parse.SqlUseSchema;
 import org.apache.phoenix.calcite.parser.PhoenixParserImpl;
 import org.apache.phoenix.calcite.rel.PhoenixRel;
 import org.apache.phoenix.calcite.rel.PhoenixServerProject;
@@ -87,11 +90,13 @@ import org.apache.phoenix.parse.ColumnDefInPkConstraint;
 import org.apache.phoenix.parse.ColumnName;
 import org.apache.phoenix.parse.CreateFunctionStatement;
 import org.apache.phoenix.parse.CreateIndexStatement;
+import org.apache.phoenix.parse.CreateSchemaStatement;
 import org.apache.phoenix.parse.CreateSequenceStatement;
 import org.apache.phoenix.parse.CreateTableStatement;
 import org.apache.phoenix.parse.DropColumnStatement;
 import org.apache.phoenix.parse.DropFunctionStatement;
 import org.apache.phoenix.parse.DropIndexStatement;
+import org.apache.phoenix.parse.DropSchemaStatement;
 import org.apache.phoenix.parse.DropSequenceStatement;
 import org.apache.phoenix.parse.DropTableStatement;
 import org.apache.phoenix.parse.IndexKeyConstraint;
@@ -107,12 +112,14 @@ import org.apache.phoenix.parse.SQLParser;
 import org.apache.phoenix.parse.TableName;
 import org.apache.phoenix.parse.UDFParseNode;
 import org.apache.phoenix.parse.UpdateStatisticsStatement;
+import org.apache.phoenix.parse.UseSchemaStatement;
 import org.apache.phoenix.query.QueryConstants;
 import org.apache.phoenix.schema.MetaDataClient;
 import org.apache.phoenix.schema.PTable.IndexType;
 import org.apache.phoenix.schema.PTableType;
 import org.apache.phoenix.schema.Sequence;
 import org.apache.phoenix.schema.SortOrder;
+import org.apache.phoenix.util.SchemaUtil;
 
 import com.google.common.base.Function;
 import com.google.common.collect.ArrayListMultimap;
@@ -602,6 +609,29 @@ public class PhoenixPrepareImpl extends CalcitePrepareImpl 
{
                             new 
PhoenixStatement.ExecutableDeleteJarStatement(jarPath).compilePlan(phoenixStatement,
                                 Sequence.ValueOp.VALIDATE_SEQUENCE);
                     ((BaseMutationPlan) compilePlan).execute();
+                } else if( node instanceof SqlCreateSchema) {
+                    SqlCreateSchema createSchemaNode = (SqlCreateSchema) node;
+                    CreateSchemaStatement createSchema =
+                            
nodeFactory.createSchema(createSchemaNode.schemaName.getSimple(),
+                                createSchemaNode.ifNotExists.booleanValue());
+                    MetaDataClient client = new MetaDataClient(connection);
+                    client.createSchema(createSchema);
+                } else if( node instanceof SqlDropSchema) {
+                    SqlDropSchema dropSchemaNode = (SqlDropSchema) node;
+                    DropSchemaStatement dropSchema =
+                            
nodeFactory.dropSchema(dropSchemaNode.schemaName.getSimple(),
+                                dropSchemaNode.ifExists.booleanValue(),
+                                dropSchemaNode.cascade.booleanValue());
+                    MetaDataClient client = new MetaDataClient(connection);
+                    client.dropSchema(dropSchema);
+                } else if( node instanceof SqlUseSchema) {
+                    SqlUseSchema useSchemaNode = (SqlUseSchema) node;
+                    UseSchemaStatement useSchema =
+                            
nodeFactory.useSchema(useSchemaNode.schemaName.getSimple().equals(
+                                SchemaUtil.SCHEMA_FOR_DEFAULT_NAMESPACE) ? null
+                                    : useSchemaNode.schemaName.getSimple());
+                    MetaDataClient client = new MetaDataClient(connection);
+                    client.useSchema(useSchema);
                 } else {
                     throw new AssertionError("unknown DDL node " + 
node.getClass());                    
                 }
@@ -667,7 +697,6 @@ public class PhoenixPrepareImpl extends CalcitePrepareImpl {
             } catch (ClassCastException e) {
             }
         }
-
         throw new RuntimeException("Phoenix schema not found.");
     }
 }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/c1f4d90b/phoenix-core/src/main/java/org/apache/phoenix/calcite/parse/SqlCreateSchema.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/calcite/parse/SqlCreateSchema.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/parse/SqlCreateSchema.java
new file mode 100644
index 0000000..17820d9
--- /dev/null
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/parse/SqlCreateSchema.java
@@ -0,0 +1,58 @@
+/*
+ * 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.phoenix.calcite.parse;
+
+import java.util.List;
+
+import org.apache.calcite.sql.SqlCall;
+import org.apache.calcite.sql.SqlIdentifier;
+import org.apache.calcite.sql.SqlKind;
+import org.apache.calcite.sql.SqlLiteral;
+import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.SqlOperator;
+import org.apache.calcite.sql.parser.SqlParserPos;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Parse tree node for SQL {@code CREATE SCHEMA} command.
+ */
+public class SqlCreateSchema extends SqlCall {
+    public final SqlOperator operator;
+
+    public final SqlIdentifier schemaName;
+    public final SqlLiteral ifNotExists;
+
+    /** Creates a CREATE SCHEMA. */
+    public SqlCreateSchema(SqlParserPos pos, SqlIdentifier schemaName, 
SqlLiteral ifNotExists) {
+        super(pos);
+        this.operator = new SqlDdlOperator("CREATE SCHEMA", SqlKind.OTHER_DDL);
+        this.schemaName = schemaName;
+        this.ifNotExists = ifNotExists;
+    }
+
+    @Override
+    public SqlOperator getOperator() {
+        return this.operator;
+    }
+
+    @Override
+    public List<SqlNode> getOperandList() {
+        return ImmutableList.of(schemaName, ifNotExists);        
+    }
+}

http://git-wip-us.apache.org/repos/asf/phoenix/blob/c1f4d90b/phoenix-core/src/main/java/org/apache/phoenix/calcite/parse/SqlDropSchema.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/calcite/parse/SqlDropSchema.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/parse/SqlDropSchema.java
new file mode 100644
index 0000000..9812a97
--- /dev/null
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/parse/SqlDropSchema.java
@@ -0,0 +1,60 @@
+/*
+ * 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.phoenix.calcite.parse;
+
+import java.util.List;
+
+import org.apache.calcite.sql.SqlCall;
+import org.apache.calcite.sql.SqlIdentifier;
+import org.apache.calcite.sql.SqlKind;
+import org.apache.calcite.sql.SqlLiteral;
+import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.SqlOperator;
+import org.apache.calcite.sql.parser.SqlParserPos;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Parse tree node for SQL {@code DROP SCHEMA} command.
+ */
+public class SqlDropSchema extends SqlCall {
+    public final SqlOperator operator;
+
+    public final SqlIdentifier schemaName;
+    public final SqlLiteral ifExists;
+    public final SqlLiteral cascade;
+
+    /** Creates a DROP SCHEMA. */
+    public SqlDropSchema(SqlParserPos pos, SqlIdentifier schemaName, 
SqlLiteral ifExists, SqlLiteral cascade) {
+        super(pos);
+        this.operator = new SqlDdlOperator("DROP SCHEMA", SqlKind.OTHER_DDL);
+        this.schemaName = schemaName;
+        this.ifExists = ifExists;
+        this.cascade = cascade;
+    }
+
+    @Override
+    public SqlOperator getOperator() {
+        return this.operator;
+    }
+
+    @Override
+    public List<SqlNode> getOperandList() {
+        return ImmutableList.of(schemaName, ifExists, cascade);        
+    }
+}

http://git-wip-us.apache.org/repos/asf/phoenix/blob/c1f4d90b/phoenix-core/src/main/java/org/apache/phoenix/calcite/parse/SqlUseSchema.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/calcite/parse/SqlUseSchema.java 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/parse/SqlUseSchema.java
new file mode 100644
index 0000000..bb116a8
--- /dev/null
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/parse/SqlUseSchema.java
@@ -0,0 +1,55 @@
+/*
+ * 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.phoenix.calcite.parse;
+
+import java.util.List;
+
+import org.apache.calcite.sql.SqlCall;
+import org.apache.calcite.sql.SqlIdentifier;
+import org.apache.calcite.sql.SqlKind;
+import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.SqlOperator;
+import org.apache.calcite.sql.parser.SqlParserPos;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Parse tree node for SQL {@code USE SCHEMA} command.
+ */
+public class SqlUseSchema extends SqlCall {
+    public final SqlOperator operator;
+
+    public final SqlIdentifier schemaName;
+
+    /** Creates a USE SCHEMA. */
+    public SqlUseSchema(SqlParserPos pos, SqlIdentifier schemaName) {
+        super(pos);
+        this.operator = new SqlDdlOperator("USE SCHEMA", SqlKind.OTHER_DDL);
+        this.schemaName = schemaName;
+    }
+
+    @Override
+    public SqlOperator getOperator() {
+        return this.operator;
+    }
+
+    @Override
+    public List<SqlNode> getOperandList() {
+        return ImmutableList.of((SqlNode)schemaName); 
+    }
+}
\ No newline at end of file

Reply via email to