You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2014/04/14 04:50:05 UTC
git commit: TAJO-755: ALTER TABLESPACE LOCATION support. (hyunsik)
Repository: tajo
Updated Branches:
refs/heads/master 5ae608b12 -> 898268409
TAJO-755: ALTER TABLESPACE LOCATION support. (hyunsik)
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/89826840
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/89826840
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/89826840
Branch: refs/heads/master
Commit: 898268409d658d5ae5b5320a0eaac0a95119ab1e
Parents: 5ae608b
Author: Hyunsik Choi <hy...@apache.org>
Authored: Mon Apr 14 10:19:05 2014 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Mon Apr 14 10:19:05 2014 +0900
----------------------------------------------------------------------
CHANGES.txt | 2 +
.../apache/tajo/algebra/AlterTablespace.java | 66 ++++++++++++
.../tajo/algebra/AlterTablespaceSetType.java | 22 ++++
.../java/org/apache/tajo/algebra/OpType.java | 1 +
.../tajo/catalog/AbstractCatalogClient.java | 30 ++++++
.../org/apache/tajo/catalog/CatalogService.java | 17 +++
.../src/main/proto/CatalogProtocol.proto | 2 +
.../src/main/proto/CatalogProtos.proto | 23 +++++
.../tajo/catalog/store/HCatalogStore.java | 42 ++++++--
.../org/apache/tajo/catalog/CatalogServer.java | 55 ++++++++++
.../tajo/catalog/store/AbstractDBStore.java | 60 +++++++++++
.../apache/tajo/catalog/store/CatalogStore.java | 6 ++
.../org/apache/tajo/catalog/store/MemStore.java | 31 ++++++
.../org/apache/tajo/catalog/TestCatalog.java | 75 ++++++++++++++
.../org/apache/tajo/engine/parser/SQLParser.g4 | 5 +
.../apache/tajo/engine/parser/SQLAnalyzer.java | 10 +-
.../tajo/engine/planner/AlgebraVisitor.java | 3 +-
.../engine/planner/AlterTablespaceNode.java | 103 +++++++++++++++++++
.../tajo/engine/planner/BaseAlgebraVisitor.java | 12 ++-
.../engine/planner/BasicLogicalPlanVisitor.java | 10 ++
.../engine/planner/LogicalPlanPreprocessor.java | 7 ++
.../tajo/engine/planner/LogicalPlanVisitor.java | 5 +-
.../tajo/engine/planner/LogicalPlanner.java | 11 +-
.../apache/tajo/engine/planner/PlannerUtil.java | 4 +-
.../tajo/engine/planner/logical/NodeType.java | 3 +
.../org/apache/tajo/master/GlobalEngine.java | 39 ++++++-
.../tajo/engine/query/TestAlterTable.java | 1 -
.../tajo/engine/query/TestAlterTablespace.java | 63 ++++++++++++
28 files changed, 688 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index a207f04..8d7127f 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -143,6 +143,8 @@ Release 0.8.0 - unreleased
IMPROVEMENTS
+ TAJO-755: ALTER TABLESPACE LOCATION support. (hyunsilk)
+
TAJO-732: Support executing LINUX shell command and HDFS command.
(hyoungjun kim via hyunsik)
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTablespace.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTablespace.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTablespace.java
new file mode 100644
index 0000000..ceec08b
--- /dev/null
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTablespace.java
@@ -0,0 +1,66 @@
+/**
+ * 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.tajo.algebra;
+
+
+import com.google.common.base.Objects;
+import org.apache.tajo.util.TUtil;
+
+public class AlterTablespace extends Expr {
+
+ private String tablespaceName;
+ private AlterTablespaceSetType setType;
+
+ private String uri;
+
+ public AlterTablespace(final String tablespaceName) {
+ super(OpType.AlterTablespace);
+ this.tablespaceName = tablespaceName;
+ }
+
+ public String getTablespaceName() {
+ return tablespaceName;
+ }
+
+ public AlterTablespaceSetType getSetType() {
+ return setType;
+ }
+
+ public String getLocation() {
+ return uri;
+ }
+
+ public void setLocation(String uri) {
+ this.setType = AlterTablespaceSetType.LOCATION;
+ this.uri = uri;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(tablespaceName, setType);
+ }
+
+ @Override
+ boolean equalsTo(Expr expr) {
+ AlterTablespace another = (AlterTablespace) expr;
+ return tablespaceName.equals(another.tablespaceName) &&
+ TUtil.checkEquals(setType, another.setType) &&
+ TUtil.checkEquals(uri, another.uri);
+ }
+}
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTablespaceSetType.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTablespaceSetType.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTablespaceSetType.java
new file mode 100644
index 0000000..aa5ad04
--- /dev/null
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/AlterTablespaceSetType.java
@@ -0,0 +1,22 @@
+/**
+ * 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.tajo.algebra;
+
+public enum AlterTablespaceSetType {
+ LOCATION
+}
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
index 0cb0527..a62ccfd 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
@@ -47,6 +47,7 @@ public enum OpType {
DropDatabase(DropDatabase.class),
CreateTable(CreateTable.class),
DropTable(DropTable.class),
+ AlterTablespace(AlterTablespace.class),
AlterTable(AlterTable.class),
// Insert or Update
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/AbstractCatalogClient.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/AbstractCatalogClient.java b/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/AbstractCatalogClient.java
index 60cce9a..542214b 100644
--- a/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/AbstractCatalogClient.java
+++ b/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/AbstractCatalogClient.java
@@ -124,6 +124,36 @@ public abstract class AbstractCatalogClient implements CatalogService {
}
@Override
+ public TablespaceProto getTablespace(final String tablespaceName) {
+ try {
+ return new ServerCallable<TablespaceProto>(pool, catalogServerAddr, CatalogProtocol.class, false) {
+ public TablespaceProto call(NettyClientBase client) throws ServiceException {
+ CatalogProtocolService.BlockingInterface stub = getStub(client);
+ return stub.getTablespace(null, ProtoUtil.convertString(tablespaceName));
+ }
+ }.withRetries();
+ } catch (ServiceException e) {
+ LOG.error(e.getMessage(), e);
+ return null;
+ }
+ }
+
+ @Override
+ public Boolean alterTablespace(final AlterTablespaceProto alterTablespace) {
+ try {
+ return new ServerCallable<Boolean>(pool, catalogServerAddr, CatalogProtocol.class, false) {
+ public Boolean call(NettyClientBase client) throws ServiceException {
+ CatalogProtocolService.BlockingInterface stub = getStub(client);
+ return stub.alterTablespace(null, alterTablespace).getValue();
+ }
+ }.withRetries();
+ } catch (ServiceException e) {
+ LOG.error(e.getMessage(), e);
+ return false;
+ }
+ }
+
+ @Override
public final Boolean createDatabase(final String databaseName, @Nullable final String tablespaceName) {
try {
return new ServerCallable<Boolean>(pool, catalogServerAddr, CatalogProtocol.class, false) {
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/CatalogService.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/CatalogService.java b/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/CatalogService.java
index f68f11a..667ee88 100644
--- a/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/CatalogService.java
+++ b/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/CatalogService.java
@@ -19,11 +19,14 @@
package org.apache.tajo.catalog;
import org.apache.tajo.catalog.partition.PartitionMethodDesc;
+import org.apache.tajo.catalog.proto.CatalogProtos;
import org.apache.tajo.common.TajoDataTypes.DataType;
import java.util.Collection;
+import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto;
import static org.apache.tajo.catalog.proto.CatalogProtos.FunctionType;
+import static org.apache.tajo.catalog.proto.CatalogProtos.TablespaceProto;
public interface CatalogService {
@@ -56,6 +59,20 @@ public interface CatalogService {
/**
*
+ * @param tablespaceName Tablespace name to get
+ * @return Tablespace description
+ */
+ TablespaceProto getTablespace(String tablespaceName);
+
+ /**
+ *
+ * @param alterTablespace AlterTablespace
+ * @return True if update is successfully.
+ */
+ Boolean alterTablespace(AlterTablespaceProto alterTablespace);
+
+ /**
+ *
* @param databaseName Database name to be created
* @return True if database is created successfully. Otherwise, it will return FALSE.
*/
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-catalog/tajo-catalog-client/src/main/proto/CatalogProtocol.proto
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-client/src/main/proto/CatalogProtocol.proto b/tajo-catalog/tajo-catalog-client/src/main/proto/CatalogProtocol.proto
index 0f34f7c..c5cb528 100644
--- a/tajo-catalog/tajo-catalog-client/src/main/proto/CatalogProtocol.proto
+++ b/tajo-catalog/tajo-catalog-client/src/main/proto/CatalogProtocol.proto
@@ -30,6 +30,8 @@ service CatalogProtocolService {
rpc dropTablespace(StringProto) returns (BoolProto);
rpc existTablespace(StringProto) returns (BoolProto);
rpc getAllTablespaceNames(NullProto) returns (StringListProto);
+ rpc getTablespace(StringProto) returns (TablespaceProto);
+ rpc alterTablespace(AlterTablespaceProto) returns (BoolProto);
rpc alterTable(AlterTableDescProto) returns (BoolProto);
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto b/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto
index b985ba7..7ec68c5 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto
+++ b/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto
@@ -270,6 +270,29 @@ message PartitionDescProto {
optional string path = 5;
}
+message TablespaceProto {
+ required string spaceName = 1;
+ required string uri = 2;
+}
+
+message AlterTablespaceProto {
+ required string spaceName = 1;
+ repeated AlterTablespaceCommand command = 2;
+
+ enum AlterTablespaceType {
+ LOCATION = 0;
+ }
+
+ message SetLocation {
+ required string uri = 1;
+ }
+
+ message AlterTablespaceCommand {
+ required AlterTablespaceType type = 1;
+ optional SetLocation location = 2;
+ }
+}
+
message AlterTableDescProto {
required string tableName = 1;
optional string newTableName = 2 ;
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogStore.java b/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogStore.java
index 755fca6..0fe255c 100644
--- a/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogStore.java
+++ b/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogStore.java
@@ -51,6 +51,7 @@ import java.io.IOException;
import java.util.*;
import static org.apache.tajo.catalog.proto.CatalogProtos.PartitionType;
+import static org.apache.tajo.catalog.proto.CatalogProtos.TablespaceProto;
public class HCatalogStore extends CatalogConstants implements CatalogStore {
protected final Log LOG = LogFactory.getLog(getClass());
@@ -91,7 +92,9 @@ public class HCatalogStore extends CatalogConstants implements CatalogStore {
throw new CatalogException(e);
}
} finally {
- client.release();
+ if (client != null) {
+ client.release();
+ }
}
return exist;
@@ -311,6 +314,23 @@ public class HCatalogStore extends CatalogConstants implements CatalogStore {
}
@Override
+ public TablespaceProto getTablespace(String spaceName) throws CatalogException {
+ if (spaceName.equals(TajoConstants.DEFAULT_TABLESPACE_NAME)) {
+ TablespaceProto.Builder builder = TablespaceProto.newBuilder();
+ builder.setSpaceName(TajoConstants.DEFAULT_TABLESPACE_NAME);
+ builder.setUri(defaultTableSpaceUri);
+ return builder.build();
+ } else {
+ throw new CatalogException("tablespace concept is not supported in HCatalogStore");
+ }
+ }
+
+ @Override
+ public void alterTablespace(CatalogProtos.AlterTablespaceProto alterProto) throws CatalogException {
+ throw new CatalogException("tablespace concept is not supported in HCatalogStore");
+ }
+
+ @Override
public void createDatabase(String databaseName, String tablespaceName) throws CatalogException {
HCatalogStoreClientPool.HCatalogStoreClient client = null;
@@ -535,7 +555,9 @@ public class HCatalogStore extends CatalogConstants implements CatalogStore {
} catch (Exception e) {
throw new CatalogException(e);
} finally {
- client.release();
+ if (client != null) {
+ client.release();
+ }
}
}
@@ -590,7 +612,9 @@ public class HCatalogStore extends CatalogConstants implements CatalogStore {
} catch (Exception e) {
throw new CatalogException(e);
} finally {
- client.release();
+ if (client != null) {
+ client.release();
+ }
}
}
@@ -613,7 +637,9 @@ public class HCatalogStore extends CatalogConstants implements CatalogStore {
} catch (Exception e) {
throw new CatalogException(e);
} finally {
- client.release();
+ if (client != null) {
+ client.release();
+ }
}
}
@@ -634,7 +660,9 @@ public class HCatalogStore extends CatalogConstants implements CatalogStore {
} catch (Exception e) {
throw new CatalogException(e);
} finally {
- client.release();
+ if (client != null) {
+ client.release();
+ }
}
}
@@ -778,7 +806,9 @@ public class HCatalogStore extends CatalogConstants implements CatalogStore {
} catch (Exception e) {
throw new CatalogException(e);
} finally {
- client.release();
+ if (client != null) {
+ client.release();
+ }
}
return exist;
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
index b32b4e9..b21bdf0 100644
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
+++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
@@ -19,15 +19,18 @@
package org.apache.tajo.catalog;
import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
import com.google.protobuf.RpcController;
import com.google.protobuf.ServiceException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.service.AbstractService;
+import org.apache.tajo.TajoConstants;
import org.apache.tajo.annotation.ThreadSafe;
import org.apache.tajo.catalog.CatalogProtocol.CatalogProtocolService;
import org.apache.tajo.catalog.exception.*;
+import org.apache.tajo.catalog.proto.CatalogProtos;
import org.apache.tajo.catalog.proto.CatalogProtos.*;
import org.apache.tajo.catalog.store.CatalogStore;
import org.apache.tajo.catalog.store.DerbyStore;
@@ -36,6 +39,7 @@ import org.apache.tajo.common.TajoDataTypes.DataType;
import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.conf.TajoConf.ConfVars;
import org.apache.tajo.rpc.BlockingRpcServer;
+import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos;
import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.BoolProto;
import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.NullProto;
import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.StringProto;
@@ -46,11 +50,13 @@ import org.apache.tajo.util.TUtil;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.net.InetSocketAddress;
+import java.net.URI;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
+import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto.AlterTablespaceCommand;
import static org.apache.tajo.catalog.proto.CatalogProtos.FunctionType.*;
import static org.apache.tajo.common.TajoDataTypes.Type;
import static org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.StringListProto;
@@ -243,6 +249,10 @@ public class CatalogServer extends AbstractService {
wlock.lock();
try {
+ if (tablespaceName.equals(TajoConstants.DEFAULT_TABLESPACE_NAME)) {
+ throw new CatalogException("default tablespace cannot be dropped.");
+ }
+
if (!store.existTablespace(tablespaceName)) {
throw new NoSuchTablespaceException(tablespaceName);
}
@@ -291,6 +301,51 @@ public class CatalogServer extends AbstractService {
}
@Override
+ public TablespaceProto getTablespace(RpcController controller, StringProto request) throws ServiceException {
+ rlock.lock();
+ try {
+ return store.getTablespace(request.getValue());
+ } catch (Exception e) {
+ LOG.error(e);
+ throw new ServiceException(e);
+ } finally {
+ rlock.unlock();
+ }
+ }
+
+ @Override
+ public BoolProto alterTablespace(RpcController controller, AlterTablespaceProto request) throws ServiceException {
+ wlock.lock();
+ try {
+ if (!store.existTablespace(request.getSpaceName())) {
+ throw new NoSuchTablespaceException(request.getSpaceName());
+ }
+
+ if (request.getCommandList().size() > 0) {
+ for (AlterTablespaceCommand command : request.getCommandList()) {
+ if (command.getType() == AlterTablespaceProto.AlterTablespaceType.LOCATION) {
+ try {
+ URI uri = URI.create(command.getLocation().getUri());
+ Preconditions.checkArgument(uri.getScheme() != null);
+ } catch (Exception e) {
+ throw new ServiceException("ALTER TABLESPACE's LOCATION must be a URI form (scheme:///.../), but "
+ + command.getLocation().getUri());
+ }
+ }
+ }
+ }
+
+ store.alterTablespace(request);
+ return ProtoUtil.TRUE;
+ } catch (Exception e) {
+ LOG.error(e);
+ throw new ServiceException(e);
+ } finally {
+ wlock.unlock();
+ }
+ }
+
+ @Override
public BoolProto createDatabase(RpcController controller, CreateDatabaseRequest request) throws ServiceException {
String databaseName = request.getDatabaseName();
String tablespaceName = request.getTablespaceName();
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/AbstractDBStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/AbstractDBStore.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/AbstractDBStore.java
index b1efc7f..5b26e14 100644
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/AbstractDBStore.java
+++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/AbstractDBStore.java
@@ -45,6 +45,8 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
+import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto.AlterTablespaceCommand;
+
public abstract class AbstractDBStore extends CatalogConstants implements CatalogStore {
protected final Log LOG = LogFactory.getLog(getClass());
protected final Configuration conf;
@@ -353,6 +355,64 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
}
@Override
+ public TablespaceProto getTablespace(String spaceName) throws CatalogException {
+ Connection conn = null;
+ PreparedStatement pstmt = null;
+ ResultSet resultSet = null;
+
+ try {
+ String sql = "SELECT SPACE_NAME, SPACE_URI FROM " + TB_SPACES + " WHERE SPACE_NAME=?";
+ conn = getConnection();
+ pstmt = conn.prepareStatement(sql);
+ pstmt.setString(1, spaceName);
+ resultSet = pstmt.executeQuery();
+
+ if (!resultSet.next()) {
+ throw new NoSuchTablespaceException(spaceName);
+ }
+
+ String retrieveSpaceName = resultSet.getString("SPACE_NAME");
+ String uri = resultSet.getString("SPACE_URI");
+
+ TablespaceProto.Builder builder = TablespaceProto.newBuilder();
+ builder.setSpaceName(retrieveSpaceName);
+ builder.setUri(uri);
+ return builder.build();
+
+ } catch (SQLException se) {
+ throw new CatalogException(se);
+ } finally {
+ CatalogUtil.closeQuietly(pstmt, resultSet);
+ }
+ }
+
+ @Override
+ public void alterTablespace(AlterTablespaceProto alterProto) throws CatalogException {
+ Connection conn;
+ PreparedStatement pstmt = null;
+
+ if (alterProto.getCommandList().size() == 1) {
+ AlterTablespaceCommand command = alterProto.getCommand(0);
+ if (command.getType() == AlterTablespaceProto.AlterTablespaceType.LOCATION) {
+ AlterTablespaceProto.SetLocation setLocation = command.getLocation();
+ try {
+ String sql = "UPDATE " + TB_SPACES + " SET SPACE_URI=? WHERE SPACE_NAME=?";
+
+ conn = getConnection();
+ pstmt = conn.prepareStatement(sql);
+ pstmt.setString(1, setLocation.getUri());
+ pstmt.setString(2, alterProto.getSpaceName());
+ pstmt.executeUpdate();
+ } catch (SQLException se) {
+ throw new CatalogException(se);
+ } finally {
+ CatalogUtil.closeQuietly(pstmt);
+ }
+ }
+ }
+ }
+
+ @Override
public void createDatabase(String databaseName, String tablespaceName) throws CatalogException {
Connection conn = null;
PreparedStatement pstmt = null;
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/CatalogStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/CatalogStore.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/CatalogStore.java
index e0c5a9d..5de9633 100644
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/CatalogStore.java
+++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/CatalogStore.java
@@ -28,7 +28,9 @@ import org.apache.tajo.catalog.exception.CatalogException;
import java.util.Collection;
import java.util.List;
+import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto;
import static org.apache.tajo.catalog.proto.CatalogProtos.PartitionMethodProto;
+import static org.apache.tajo.catalog.proto.CatalogProtos.TablespaceProto;
public interface CatalogStore extends Closeable {
/*************************** Tablespace ******************************/
@@ -40,6 +42,10 @@ public interface CatalogStore extends Closeable {
Collection<String> getAllTablespaceNames() throws CatalogException;
+ TablespaceProto getTablespace(String spaceName) throws CatalogException;
+
+ void alterTablespace(AlterTablespaceProto alterProto) throws CatalogException;
+
/*************************** Database ******************************/
void createDatabase(String databaseName, String tablespaceName) throws CatalogException;
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java
index ca29a6b..8940093 100644
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java
+++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java
@@ -34,6 +34,9 @@ import org.apache.tajo.catalog.proto.CatalogProtos.IndexDescProto;
import java.io.IOException;
import java.util.*;
+import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto.AlterTablespaceType;
+import static org.apache.tajo.catalog.proto.CatalogProtos.TablespaceProto;
+
/**
* CatalogServer guarantees that all operations are thread-safe.
* So, we don't need to consider concurrency problem here.
@@ -83,6 +86,34 @@ public class MemStore implements CatalogStore {
}
@Override
+ public TablespaceProto getTablespace(String spaceName) throws CatalogException {
+ if (!tablespaces.containsKey(spaceName)) {
+ throw new NoSuchTablespaceException(spaceName);
+ }
+
+ TablespaceProto.Builder builder = TablespaceProto.newBuilder();
+ builder.setSpaceName(spaceName);
+ builder.setUri(tablespaces.get(spaceName));
+ return builder.build();
+ }
+
+ @Override
+ public void alterTablespace(CatalogProtos.AlterTablespaceProto alterProto) throws CatalogException {
+ if (!tablespaces.containsKey(alterProto.getSpaceName())) {
+ throw new NoSuchTablespaceException(alterProto.getSpaceName());
+ }
+
+ if (alterProto.getCommandList().size() > 0) {
+ for (CatalogProtos.AlterTablespaceProto.AlterTablespaceCommand cmd : alterProto.getCommandList()) {
+ if(cmd.getType() == AlterTablespaceType.LOCATION) {
+ CatalogProtos.AlterTablespaceProto.SetLocation setLocation = cmd.getLocation();
+ tablespaces.put(alterProto.getSpaceName(), setLocation.getUri());
+ }
+ }
+ }
+ }
+
+ @Override
public void createDatabase(String databaseName, String tablespaceName) throws CatalogException {
if (databases.containsKey(databaseName)) {
throw new AlreadyExistsDatabaseException(databaseName);
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
index 1eefe29..e60cc09 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
@@ -45,6 +45,10 @@ import java.util.*;
import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME;
import static org.apache.tajo.catalog.CatalogConstants.CATALOG_URI;
+import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto;
+import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto.AlterTablespaceCommand;
+import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto.AlterTablespaceType;
+import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto.SetLocation;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
@@ -116,6 +120,77 @@ public class TestCatalog {
}
@Test
+ public void testGetTablespace() throws Exception {
+ //////////////////////////////////////////////////////////////////////////////
+ // Create two table spaces
+ //////////////////////////////////////////////////////////////////////////////
+
+ assertFalse(catalog.existTablespace("space1"));
+ assertTrue(catalog.createTablespace("space1", "hdfs://xxx.com/warehouse"));
+ assertTrue(catalog.existTablespace("space1"));
+
+ assertFalse(catalog.existTablespace("space2"));
+ assertTrue(catalog.createTablespace("space2", "hdfs://yyy.com/warehouse"));
+ assertTrue(catalog.existTablespace("space2"));
+
+ //////////////////////////////////////////////////////////////////////////////
+ // ALTER TABLESPACE space1
+ //////////////////////////////////////////////////////////////////////////////
+
+ // pre verification
+ CatalogProtos.TablespaceProto space1 = catalog.getTablespace("space1");
+ assertEquals("space1", space1.getSpaceName());
+ assertEquals("hdfs://xxx.com/warehouse", space1.getUri());
+
+ // ALTER TABLESPACE space1 LOCATION 'hdfs://zzz.com/warehouse';
+ AlterTablespaceProto.AlterTablespaceCommand.Builder commandBuilder =
+ AlterTablespaceProto.AlterTablespaceCommand.newBuilder();
+ commandBuilder.setType(AlterTablespaceType.LOCATION);
+ commandBuilder.setLocation(SetLocation.newBuilder().setUri("hdfs://zzz.com/warehouse"));
+ AlterTablespaceProto.Builder alter = AlterTablespaceProto.newBuilder();
+ alter.setSpaceName("space1");
+ alter.addCommand(commandBuilder.build());
+ catalog.alterTablespace(alter.build());
+
+ // Verify ALTER TABLESPACE space1
+ space1 = catalog.getTablespace("space1");
+ assertEquals("space1", space1.getSpaceName());
+ assertEquals("hdfs://zzz.com/warehouse", space1.getUri());
+
+ //////////////////////////////////////////////////////////////////////////////
+ // ALTER TABLESPACE space1
+ //////////////////////////////////////////////////////////////////////////////
+
+ // pre verification
+ CatalogProtos.TablespaceProto space2 = catalog.getTablespace("space2");
+ assertEquals("space2", space2.getSpaceName());
+ assertEquals("hdfs://yyy.com/warehouse", space2.getUri());
+
+ // ALTER TABLESPACE space1 LOCATION 'hdfs://zzz.com/warehouse';
+ commandBuilder = AlterTablespaceProto.AlterTablespaceCommand.newBuilder();
+ commandBuilder.setType(AlterTablespaceType.LOCATION);
+ commandBuilder.setLocation(SetLocation.newBuilder().setUri("hdfs://www.com/warehouse"));
+ alter = AlterTablespaceProto.newBuilder();
+ alter.setSpaceName("space2");
+ alter.addCommand(commandBuilder.build());
+ catalog.alterTablespace(alter.build());
+
+ // post verification
+ space1 = catalog.getTablespace("space2");
+ assertEquals("space2", space1.getSpaceName());
+ assertEquals("hdfs://www.com/warehouse", space1.getUri());
+
+
+ //////////////////////////////////////////////////////////////////////////////
+ // Clean up
+ //////////////////////////////////////////////////////////////////////////////
+ assertTrue(catalog.dropTablespace("space1"));
+ assertFalse(catalog.existTablespace("space1"));
+ assertTrue(catalog.dropTablespace("space2"));
+ assertFalse(catalog.existTablespace("space2"));
+ }
+
+ @Test
public void testCreateAndDropDatabases() throws Exception {
assertFalse(catalog.existDatabase("testCreateAndDropDatabases"));
assertTrue(catalog.createDatabase("testCreateAndDropDatabases", TajoConstants.DEFAULT_TABLESPACE_NAME));
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4 b/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
index 1249d57..f6385eb 100644
--- a/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
+++ b/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
@@ -62,6 +62,7 @@ schema_statement
| drop_database_statement
| create_table_statement
| drop_table_statement
+ | alter_tablespace_statement
| alter_table_statement
;
@@ -1386,6 +1387,10 @@ insert_statement
===============================================================================
*/
+alter_tablespace_statement
+ : ALTER TABLESPACE space_name=identifier LOCATION uri=Character_String_Literal
+ ;
+
alter_table_statement
: ALTER TABLE table_name RENAME TO table_name
| ALTER TABLE table_name RENAME COLUMN column_name TO column_name
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
index e95d5af..f28f7ca 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
@@ -32,6 +32,7 @@ import org.apache.tajo.catalog.CatalogConstants;
import org.apache.tajo.catalog.CatalogUtil;
import org.apache.tajo.engine.parser.SQLParser.*;
+import java.nio.charset.Charset;
import java.util.*;
import static org.apache.tajo.algebra.Aggregation.GroupElement;
@@ -1335,7 +1336,7 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
public static String escapeDelimiter(String value) {
try {
String delimiter = StringEscapeUtils.unescapeJava(value);
- delimiter = new String(new byte[]{Byte.valueOf(delimiter).byteValue()});
+ delimiter = new String(new byte[]{Byte.valueOf(delimiter).byteValue()}, Charset.defaultCharset());
return StringEscapeUtils.escapeJava(delimiter);
} catch (NumberFormatException e) {
}
@@ -1435,6 +1436,13 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
}
@Override
+ public Expr visitAlter_tablespace_statement(@NotNull SQLParser.Alter_tablespace_statementContext ctx) {
+ AlterTablespace alter = new AlterTablespace(ctx.space_name.getText());
+ alter.setLocation(stripQuote(ctx.uri.getText()));
+ return alter;
+ }
+
+ @Override
public Expr visitAlter_table_statement(SQLParser.Alter_table_statementContext ctx) {
final List<Table_nameContext> tables = ctx.table_name();
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
index 6aa4830..aa94801 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
@@ -46,6 +46,7 @@ public interface AlgebraVisitor<CONTEXT, RESULT> {
RESULT visitDropDatabase(CONTEXT ctx, Stack<Expr> stack, DropDatabase expr) throws PlanningException;
RESULT visitCreateTable(CONTEXT ctx, Stack<Expr> stack, CreateTable expr) throws PlanningException;
RESULT visitDropTable(CONTEXT ctx, Stack<Expr> stack, DropTable expr) throws PlanningException;
+ RESULT visitAlterTablespace(CONTEXT ctx, Stack<Expr> stack, AlterTablespace expr) throws PlanningException;
RESULT visitAlterTable(CONTEXT ctx, Stack<Expr> stack, AlterTable expr) throws PlanningException;
// Insert or Update
@@ -106,6 +107,4 @@ public interface AlgebraVisitor<CONTEXT, RESULT> {
RESULT visitTimestampLiteral(CONTEXT ctx, Stack<Expr> stack, TimestampLiteral expr) throws PlanningException;
RESULT visitTimeLiteral(CONTEXT ctx, Stack<Expr> stack, TimeLiteral expr) throws PlanningException;
RESULT visitDateLiteral(CONTEXT ctx, Stack<Expr> stack, DateLiteral expr) throws PlanningException;
-
-
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlterTablespaceNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlterTablespaceNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlterTablespaceNode.java
new file mode 100644
index 0000000..d64a89d
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlterTablespaceNode.java
@@ -0,0 +1,103 @@
+/**
+ * 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.tajo.engine.planner;
+
+
+import com.google.common.base.Objects;
+import com.google.gson.annotations.Expose;
+import org.apache.tajo.algebra.AlterTablespaceSetType;
+import org.apache.tajo.engine.planner.logical.LogicalNode;
+import org.apache.tajo.engine.planner.logical.LogicalNodeVisitor;
+import org.apache.tajo.engine.planner.logical.NodeType;
+
+public class AlterTablespaceNode extends LogicalNode implements Cloneable {
+
+ @Expose private String tablespaceName;
+ @Expose private AlterTablespaceSetType setType;
+ @Expose private String uri;
+
+
+ public AlterTablespaceNode(int pid) {
+ super(pid, NodeType.ALTER_TABLESPACE);
+ }
+
+ public String getTablespaceName() {
+ return tablespaceName;
+ }
+
+ public void setTablespaceName(String tablespaceName) {
+ this.tablespaceName = tablespaceName;
+ }
+
+ public AlterTablespaceSetType getSetType() {
+ return setType;
+ }
+
+ public String getLocation() {
+ return uri;
+ }
+
+ public void setLocation(String uri) {
+ this.setType = AlterTablespaceSetType.LOCATION;
+ this.uri = uri;
+ }
+
+ @Override
+ public PlanString getPlanString() {
+ return new PlanString(this);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof AlterTablespaceNode) {
+ AlterTablespaceNode other = (AlterTablespaceNode) obj;
+ return super.equals(other);
+ } else {
+ return false;
+ }
+ }
+
+ public int hashCode() {
+ return Objects.hashCode(tablespaceName, setType, uri);
+ }
+
+ @Override
+ public Object clone() throws CloneNotSupportedException {
+ AlterTablespaceNode alter = (AlterTablespaceNode) super.clone();
+ alter.tablespaceName = tablespaceName;
+ alter.setType = setType;
+ alter.uri = uri;
+ return alter;
+ }
+
+ @Override
+ public String toString() {
+ return "AlterTablespace (space=" + tablespaceName + ")";
+ }
+
+ @Override
+ public void preOrder(LogicalNodeVisitor visitor) {
+ visitor.visit(this);
+ }
+
+ @Override
+ public void postOrder(LogicalNodeVisitor visitor) {
+ visitor.visit(this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java
index 44adf12..b8f3311 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java
@@ -112,6 +112,9 @@ public class BaseAlgebraVisitor<CONTEXT, RESULT> implements AlgebraVisitor<CONTE
case DropTable:
current = visitDropTable(ctx, stack, (DropTable) expr);
break;
+ case AlterTablespace:
+ current = visitAlterTablespace(ctx, stack, (AlterTablespace) expr);
+ break;
case AlterTable:
current = visitAlterTable(ctx, stack, (AlterTable) expr);
break;
@@ -449,9 +452,14 @@ public class BaseAlgebraVisitor<CONTEXT, RESULT> implements AlgebraVisitor<CONTE
}
@Override
+ public RESULT visitAlterTablespace(CONTEXT ctx, Stack<Expr> stack, AlterTablespace expr) throws PlanningException {
+ return null;
+ }
+
+ @Override
public RESULT visitAlterTable(CONTEXT ctx, Stack<Expr> stack, AlterTable expr) throws PlanningException {
- return null;
- }
+ return null;
+ }
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Insert or Update Section
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java
index d569758..0f758bf 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BasicLogicalPlanVisitor.java
@@ -116,6 +116,9 @@ public class BasicLogicalPlanVisitor<CONTEXT, RESULT> implements LogicalPlanVisi
case DROP_TABLE:
current = visitDropTable(context, plan, block, (DropTableNode) node, stack);
break;
+ case ALTER_TABLESPACE:
+ current = visitAlterTablespace(context, plan, block, (AlterTablespaceNode) node, stack);
+ break;
case ALTER_TABLE:
current = visitAlterTable(context, plan, block, (AlterTableNode) node, stack);
break;
@@ -301,6 +304,13 @@ public class BasicLogicalPlanVisitor<CONTEXT, RESULT> implements LogicalPlanVisi
Stack<LogicalNode> stack) {
return null;
}
+
+ @Override
+ public RESULT visitAlterTablespace(CONTEXT context, LogicalPlan plan, LogicalPlan.QueryBlock block,
+ AlterTablespaceNode node, Stack<LogicalNode> stack) throws PlanningException {
+ return null;
+ }
+
@Override
public RESULT visitAlterTable(CONTEXT context, LogicalPlan plan, LogicalPlan.QueryBlock block, AlterTableNode node,
Stack<LogicalNode> stack) {
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanPreprocessor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanPreprocessor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanPreprocessor.java
index 540d45b..56863f7 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanPreprocessor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanPreprocessor.java
@@ -414,6 +414,13 @@ class LogicalPlanPreprocessor extends BaseAlgebraVisitor<LogicalPlanPreprocessor
}
@Override
+ public LogicalNode visitAlterTablespace(PreprocessContext ctx, Stack<Expr> stack, AlterTablespace expr)
+ throws PlanningException {
+ AlterTablespaceNode alterTablespace = ctx.plan.createNode(AlterTablespaceNode.class);
+ return alterTablespace;
+ }
+
+ @Override
public LogicalNode visitAlterTable(PreprocessContext ctx, Stack<Expr> stack, AlterTable expr)
throws PlanningException {
AlterTableNode alterTableNode = ctx.plan.createNode(AlterTableNode.class);
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanVisitor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanVisitor.java
index 7f38026..17b5d0a 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanVisitor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanVisitor.java
@@ -83,6 +83,9 @@ public interface LogicalPlanVisitor<CONTEXT, RESULT> {
RESULT visitDropTable(CONTEXT context, LogicalPlan plan, LogicalPlan.QueryBlock block, DropTableNode node,
Stack<LogicalNode> stack) throws PlanningException;
- RESULT visitAlterTable(CONTEXT context, LogicalPlan plan, LogicalPlan.QueryBlock block, AlterTableNode node,
+ RESULT visitAlterTablespace(CONTEXT context, LogicalPlan plan, LogicalPlan.QueryBlock block, AlterTablespaceNode node,
Stack<LogicalNode> stack) throws PlanningException;
+
+ RESULT visitAlterTable(CONTEXT context, LogicalPlan plan, LogicalPlan.QueryBlock block, AlterTableNode node,
+ Stack<LogicalNode> stack) throws PlanningException;
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
index 6336f50..8946c02 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
@@ -68,7 +68,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
this.normalizer = new ExprNormalizer();
}
- public class PlanContext {
+ public static class PlanContext {
Session session;
LogicalPlan plan;
@@ -697,7 +697,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
return groupingNode;
}
- public static final Column[] ALL= Lists.newArrayList().toArray(new Column[0]);
+ private static final Column[] ALL= Lists.newArrayList().toArray(new Column[0]);
public static List<Column[]> generateCuboids(Column[] columns) {
int numCuboids = (int) Math.pow(2, columns.length);
@@ -1471,6 +1471,13 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
return dropTableNode;
}
+ public LogicalNode visitAlterTablespace(PlanContext context, Stack<Expr> stack, AlterTablespace alterTablespace) {
+ AlterTablespaceNode alter = context.queryBlock.getNodeFromExpr(alterTablespace);
+ alter.setTablespaceName(alterTablespace.getTablespaceName());
+ alter.setLocation(alterTablespace.getLocation());
+ return alter;
+ }
+
@Override
public LogicalNode visitAlterTable(PlanContext context, Stack<Expr> stack, AlterTable alterTable) {
AlterTableNode alterTableNode = context.queryBlock.getNodeFromExpr(alterTable);
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PlannerUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PlannerUtil.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PlannerUtil.java
index 68578e8..5b43c5b 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PlannerUtil.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/PlannerUtil.java
@@ -51,7 +51,9 @@ public class PlannerUtil {
type == NodeType.CREATE_DATABASE ||
type == NodeType.DROP_DATABASE ||
(type == NodeType.CREATE_TABLE && !((CreateTableNode) baseNode).hasSubQuery()) ||
- baseNode.getType() == NodeType.DROP_TABLE || baseNode.getType() == NodeType.ALTER_TABLE;
+ baseNode.getType() == NodeType.DROP_TABLE ||
+ baseNode.getType() == NodeType.ALTER_TABLESPACE ||
+ baseNode.getType() == NodeType.ALTER_TABLE;
}
/**
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/NodeType.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/NodeType.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/NodeType.java
index 375926e..f498231 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/NodeType.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/NodeType.java
@@ -22,6 +22,8 @@
package org.apache.tajo.engine.planner.logical;
+import org.apache.tajo.engine.planner.AlterTablespaceNode;
+
/**
* This indicates a logical node type.
*/
@@ -49,6 +51,7 @@ public enum NodeType {
DROP_DATABASE(DropDatabaseNode.class),
CREATE_TABLE(CreateTableNode.class),
DROP_TABLE(DropTableNode.class),
+ ALTER_TABLESPACE (AlterTablespaceNode.class),
ALTER_TABLE (AlterTableNode.class);
private final Class<? extends LogicalNode> baseClass;
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java
index cbb8f37..8acf2b2 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java
@@ -28,11 +28,13 @@ import org.apache.hadoop.service.AbstractService;
import org.apache.hadoop.util.StringUtils;
import org.apache.tajo.QueryId;
import org.apache.tajo.QueryIdFactory;
+import org.apache.tajo.algebra.AlterTablespaceSetType;
import org.apache.tajo.algebra.Expr;
import org.apache.tajo.annotation.Nullable;
import org.apache.tajo.catalog.*;
import org.apache.tajo.catalog.exception.*;
import org.apache.tajo.catalog.partition.PartitionMethodDesc;
+import org.apache.tajo.catalog.proto.CatalogProtos;
import org.apache.tajo.catalog.statistics.TableStats;
import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.conf.TajoConf;
@@ -59,6 +61,8 @@ import java.util.List;
import static org.apache.tajo.TajoConstants.DEFAULT_TABLESPACE_NAME;
+import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto;
+import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto.AlterTablespaceCommand;
import static org.apache.tajo.ipc.ClientProtos.SubmitQueryResponse;
import static org.apache.tajo.ipc.ClientProtos.SubmitQueryResponse.SerializedResultSet;
@@ -263,8 +267,8 @@ public class GlobalEngine extends AbstractService {
responseBuilder.setQueryMasterHost(queryInfo.getQueryMasterHost());
}
responseBuilder.setQueryMasterPort(queryInfo.getQueryMasterClientPort());
+ LOG.info("Query is forwarded to " + queryInfo.getQueryMasterHost() + ":" + queryInfo.getQueryMasterPort());
}
- LOG.info("Query is forwarded to " + queryInfo.getQueryMasterHost() + ":" + queryInfo.getQueryMasterPort());
}
SubmitQueryResponse response = responseBuilder.build();
return response;
@@ -310,10 +314,14 @@ public class GlobalEngine extends AbstractService {
DropTableNode dropTable = (DropTableNode) root;
dropTable(session, dropTable.getTableName(), dropTable.isIfExists(), dropTable.isPurge());
return true;
+ case ALTER_TABLESPACE:
+ AlterTablespaceNode alterTablespace = (AlterTablespaceNode) root;
+ alterTablespace(session, alterTablespace);
+ return true;
case ALTER_TABLE:
- AlterTableNode alterTable = (AlterTableNode) root;
- alterTable(session,alterTable);
- return true;
+ AlterTableNode alterTable = (AlterTableNode) root;
+ alterTable(session,alterTable);
+ return true;
default:
throw new InternalError("updateQuery cannot handle such query: \n" + root.toJson());
}
@@ -356,6 +364,29 @@ public class GlobalEngine extends AbstractService {
/**
* Alter a given table
*/
+ public void alterTablespace(final Session session, final AlterTablespaceNode alterTablespace) {
+
+ final CatalogService catalog = context.getCatalog();
+ final String spaceName = alterTablespace.getTablespaceName();
+
+ AlterTablespaceProto.Builder builder = AlterTablespaceProto.newBuilder();
+ builder.setSpaceName(spaceName);
+ if (alterTablespace.getSetType() == AlterTablespaceSetType.LOCATION) {
+ AlterTablespaceCommand.Builder commandBuilder = AlterTablespaceCommand.newBuilder();
+ commandBuilder.setType(AlterTablespaceProto.AlterTablespaceType.LOCATION);
+ commandBuilder.setLocation(AlterTablespaceProto.SetLocation.newBuilder().setUri(alterTablespace.getLocation()));
+ commandBuilder.build();
+ builder.addCommand(commandBuilder);
+ } else {
+ throw new RuntimeException("This 'ALTER TABLESPACE' is not supported yet.");
+ }
+
+ catalog.alterTablespace(builder.build());
+ }
+
+ /**
+ * Alter a given table
+ */
public void alterTable(final Session session, final AlterTableNode alterTable) throws IOException {
final CatalogService catalog = context.getCatalog();
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestAlterTable.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestAlterTable.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestAlterTable.java
index 5779347..57d8b32 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestAlterTable.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestAlterTable.java
@@ -33,7 +33,6 @@ public class TestAlterTable extends QueryTestCaseBase {
assertTableExists(createdNames.get(0));
executeDDL("alter_table_rename_table_ddl.sql", null);
assertTableExists("DEF");
-
}
@Test
http://git-wip-us.apache.org/repos/asf/tajo/blob/89826840/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestAlterTablespace.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestAlterTablespace.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestAlterTablespace.java
new file mode 100644
index 0000000..f827ab7
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/query/TestAlterTablespace.java
@@ -0,0 +1,63 @@
+/**
+ * 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.tajo.engine.query;
+
+import org.apache.tajo.IntegrationTest;
+import org.apache.tajo.QueryTestCaseBase;
+import org.apache.tajo.catalog.proto.CatalogProtos;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+@Category(IntegrationTest.class)
+public class TestAlterTablespace extends QueryTestCaseBase {
+
+ @Test
+ public final void testAlterLocation() throws Exception {
+ if (!testingCluster.isHCatalogStoreRunning()) {
+ //////////////////////////////////////////////////////////////////////////////
+ // Create two table spaces
+ //////////////////////////////////////////////////////////////////////////////
+
+ assertFalse(catalog.existTablespace("space1"));
+ assertTrue(catalog.createTablespace("space1", "hdfs://xxx.com/warehouse"));
+ assertTrue(catalog.existTablespace("space1"));
+
+ // pre verification
+ CatalogProtos.TablespaceProto space1 = catalog.getTablespace("space1");
+ assertEquals("space1", space1.getSpaceName());
+ assertEquals("hdfs://xxx.com/warehouse", space1.getUri());
+
+ executeString("ALTER TABLESPACE space1 LOCATION 'hdfs://yyy.com/warehouse';");
+
+ // Verify ALTER TABLESPACE space1
+ space1 = catalog.getTablespace("space1");
+ assertEquals("space1", space1.getSpaceName());
+ assertEquals("hdfs://yyy.com/warehouse", space1.getUri());
+
+ assertTrue(catalog.dropTablespace("space1"));
+ assertFalse(catalog.existTablespace("space1"));
+ }
+ }
+}