TAJO-1813: Allow external catalog store for unit testing. Closes #749
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/7d97284a Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/7d97284a Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/7d97284a Branch: refs/heads/master Commit: 7d97284a97a1ca7338406ef70747af4993329f02 Parents: 59fe678 Author: Jihoon Son <[email protected]> Authored: Wed Sep 16 12:33:10 2015 +0900 Committer: Jihoon Son <[email protected]> Committed: Wed Sep 16 12:33:10 2015 +0900 ---------------------------------------------------------------------- CHANGES | 2 + .../tajo/catalog/AbstractCatalogClient.java | 32 +- .../org/apache/tajo/catalog/CatalogService.java | 38 +- .../org/apache/tajo/catalog/CatalogUtil.java | 2 +- .../java/org/apache/tajo/catalog/Schema.java | 5 +- .../org/apache/tajo/catalog/CatalogServer.java | 15 +- .../tajo/catalog/LinkedMetadataManager.java | 15 + .../apache/tajo/catalog/MiniCatalogServer.java | 49 -- .../tajo/catalog/store/AbstractDBStore.java | 191 +++++-- .../apache/tajo/catalog/store/CatalogStore.java | 2 +- .../src/main/resources/schemas/derby/derby.xml | 14 +- .../main/resources/schemas/mariadb/mariadb.xml | 8 +- .../src/main/resources/schemas/mysql/mysql.xml | 19 +- .../main/resources/schemas/oracle/oracle.xml | 21 +- .../resources/schemas/postgresql/postgresql.xml | 17 +- .../apache/tajo/catalog/CatalogTestingUtil.java | 171 ++++++- .../apache/tajo/catalog/MiniCatalogServer.java | 106 ++++ .../org/apache/tajo/catalog/TestCatalog.java | 111 +---- .../TestCatalogAgainstCaseSensitivity.java | 492 +++++++++++++++++++ .../tajo/catalog/TestCatalogExceptions.java | 293 +++++++++++ .../tajo/catalog/TestLinkedMetadataManager.java | 27 +- .../org/apache/tajo/TajoTestingCluster.java | 16 +- .../apache/tajo/exception/ExceptionUtil.java | 3 +- .../apache/tajo/engine/eval/ExprTestBase.java | 3 +- .../tajo/engine/eval/TestEvalTreeUtil.java | 2 +- .../engine/planner/TestJoinOrderAlgorithm.java | 2 +- .../engine/planner/TestLogicalOptimizer.java | 2 +- .../tajo/engine/planner/TestLogicalPlan.java | 2 +- .../tajo/engine/planner/TestLogicalPlanner.java | 3 +- .../tajo/engine/planner/TestPlannerUtil.java | 2 +- .../planner/physical/TestExternalSortExec.java | 3 +- .../physical/TestFullOuterHashJoinExec.java | 3 +- .../physical/TestFullOuterMergeJoinExec.java | 3 +- .../planner/physical/TestHashAntiJoinExec.java | 3 +- .../planner/physical/TestHashJoinExec.java | 3 +- .../planner/physical/TestHashSemiJoinExec.java | 3 +- .../physical/TestLeftOuterHashJoinExec.java | 3 +- .../planner/physical/TestMergeJoinExec.java | 3 +- .../planner/physical/TestPhysicalPlanner.java | 2 +- .../physical/TestProgressExternalSortExec.java | 3 +- .../physical/TestRightOuterHashJoinExec.java | 3 +- .../physical/TestRightOuterMergeJoinExec.java | 3 +- .../planner/physical/TestSortIntersectExec.java | 3 +- .../tajo/master/TestExecutionBlockCursor.java | 2 +- .../apache/tajo/master/exec/DDLExecutor.java | 19 +- .../java/org/apache/tajo/querymaster/Query.java | 8 +- .../apache/tajo/jdbc/TestTajoJdbcNegative.java | 1 - 47 files changed, 1413 insertions(+), 320 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index 5b85848..5603c34 100644 --- a/CHANGES +++ b/CHANGES @@ -539,6 +539,8 @@ Release 0.11.0 - unreleased TASKS + TAJO-1813: Allow external catalog store for unit testing. (jihoon) + TAJO-1845: Enforcers in the master plan should be printed in a fixed order. (jihoon) http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/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 f74de82..1dc7a71 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 @@ -21,6 +21,7 @@ package org.apache.tajo.catalog; import com.google.protobuf.ServiceException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.tajo.TajoConstants; import org.apache.tajo.annotation.Nullable; import org.apache.tajo.catalog.CatalogProtocol.CatalogProtocolService.BlockingInterface; import org.apache.tajo.catalog.CatalogProtocol.*; @@ -42,6 +43,7 @@ import java.util.List; import static org.apache.tajo.catalog.CatalogUtil.buildTableIdentifier; import static org.apache.tajo.error.Errors.ResultCode.*; +import static org.apache.tajo.exception.ExceptionUtil.throwIfError; import static org.apache.tajo.exception.ExceptionUtil.throwsIfThisError; import static org.apache.tajo.exception.ReturnStateUtil.*; @@ -80,13 +82,15 @@ public abstract class AbstractCatalogClient implements CatalogService, Closeable } @Override - public final void dropTablespace(final String tablespaceName) throws UndefinedTablespaceException { + public final void dropTablespace(final String tablespaceName) + throws UndefinedTablespaceException, InsufficientPrivilegeException { try { final BlockingInterface stub = getStub(); final ReturnState state = stub.dropTablespace(null, ProtoUtil.convertString(tablespaceName)); throwsIfThisError(state, UndefinedTablespaceException.class); + throwsIfThisError(state, InsufficientPrivilegeException.class); ensureOk(state); } catch (ServiceException e) { @@ -196,13 +200,15 @@ public abstract class AbstractCatalogClient implements CatalogService, Closeable } @Override - public final void dropDatabase(final String databaseName) throws UndefinedDatabaseException { + public final void dropDatabase(final String databaseName) + throws UndefinedDatabaseException, InsufficientPrivilegeException { try { final BlockingInterface stub = getStub(); final ReturnState state = stub.dropDatabase(null, ProtoUtil.convertString(databaseName)); throwsIfThisError(state, UndefinedDatabaseException.class); + throwsIfThisError(state, InsufficientPrivilegeException.class); ensureOk(state); } catch (ServiceException e) { @@ -598,18 +604,18 @@ public abstract class AbstractCatalogClient implements CatalogService, Closeable } @Override - public final boolean createIndex(final IndexDesc index) { + public final void createIndex(final IndexDesc index) + throws DuplicateIndexException, UndefinedDatabaseException, UndefinedTableException { try { final BlockingInterface stub = getStub(); final ReturnState state = stub.createIndex(null, index.getProto()); - if (isSuccess(state)) { - return true; - } else { - // TODO - return false; - } + + throwsIfThisError(state, DuplicateIndexException.class); + throwsIfThisError(state, UndefinedTableException.class); + throwsIfThisError(state, UndefinedDatabaseException.class); + ensureOk(state); } catch (ServiceException e) { throw new RuntimeException(e); @@ -745,7 +751,8 @@ public abstract class AbstractCatalogClient implements CatalogService, Closeable } @Override - public boolean dropIndex(final String dbName, final String indexName) { + public void dropIndex(final String dbName, final String indexName) + throws UndefinedIndexException, UndefinedDatabaseException { try { final IndexNameProto request = IndexNameProto.newBuilder() .setDatabaseName(dbName) @@ -753,8 +760,11 @@ public abstract class AbstractCatalogClient implements CatalogService, Closeable .build(); final BlockingInterface stub = getStub(); + final ReturnState state = stub.dropIndex(null, request); - return isSuccess(stub.dropIndex(null, request)); + throwsIfThisError(state, UndefinedIndexException.class); + throwsIfThisError(state, UndefinedDatabaseException.class); + ensureOk(state); } catch (ServiceException e) { throw new RuntimeException(e); http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogService.java ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogService.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogService.java index 95ff641..b031313 100644 --- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogService.java +++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogService.java @@ -137,7 +137,11 @@ public interface CatalogService { * @see TableDesc * @throws DuplicateTableException */ - void createTable(TableDesc desc) throws DuplicateTableException, InsufficientPrivilegeException, DuplicateDatabaseException, UndefinedDatabaseException; + void createTable(TableDesc desc) throws + DuplicateTableException, + InsufficientPrivilegeException, + DuplicateDatabaseException, + UndefinedDatabaseException; /** @@ -147,13 +151,19 @@ public interface CatalogService { * @throws UndefinedTableException * @throws InsufficientPrivilegeException */ - void dropTable(String tableName) throws UndefinedTableException, InsufficientPrivilegeException, UndefinedDatabaseException; + void dropTable(String tableName) throws + UndefinedTableException, + InsufficientPrivilegeException, + UndefinedDatabaseException; boolean existsTable(String databaseName, String tableName); boolean existsTable(String tableName); - PartitionMethodDesc getPartitionMethod(String databaseName, String tableName) throws UndefinedPartitionMethodException, UndefinedTableException, UndefinedDatabaseException; + PartitionMethodDesc getPartitionMethod(String databaseName, String tableName) throws + UndefinedPartitionMethodException, + UndefinedTableException, + UndefinedDatabaseException; boolean existPartitionMethod(String databaseName, String tableName) throws UndefinedTableException, UndefinedDatabaseException; @@ -167,9 +177,13 @@ public interface CatalogService { List<TablePartitionProto> getAllPartitions(); void addPartitions(String databaseName, String tableName, List<PartitionDescProto> partitions - , boolean ifNotExists) throws UndefinedTableException, DuplicatePartitionException, UndefinedPartitionMethodException, UndefinedDatabaseException; + , boolean ifNotExists) throws + UndefinedTableException, + DuplicatePartitionException, + UndefinedPartitionMethodException, + UndefinedDatabaseException; - boolean createIndex(IndexDesc index); + void createIndex(IndexDesc index) throws DuplicateIndexException, UndefinedDatabaseException, UndefinedTableException; boolean existIndexByName(String databaseName, String indexName); @@ -187,7 +201,7 @@ public interface CatalogService { Collection<IndexDesc> getAllIndexesByTable(String databaseName, String tableName); - boolean dropIndex(String databaseName, String indexName); + void dropIndex(String databaseName, String indexName) throws UndefinedIndexException, UndefinedDatabaseException; void createFunction(FunctionDesc funcDesc) throws DuplicateFunctionException; @@ -215,8 +229,16 @@ public interface CatalogService { * @see AlterTableDesc */ void alterTable(AlterTableDesc desc) - throws DuplicateColumnException, DuplicateTableException, InsufficientPrivilegeException, - UndefinedColumnException, UndefinedTableException, DuplicateDatabaseException, DuplicatePartitionException, UndefinedDatabaseException, UndefinedPartitionMethodException, UndefinedPartitionException; + throws DuplicateColumnException, + DuplicateTableException, + InsufficientPrivilegeException, + UndefinedColumnException, + UndefinedTableException, + DuplicateDatabaseException, + DuplicatePartitionException, + UndefinedDatabaseException, + UndefinedPartitionMethodException, + UndefinedPartitionException; void updateTableStats(UpdateTableStatsProto stats) throws UndefinedTableException, InsufficientPrivilegeException; } http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java index a6487b4..4e52de1 100644 --- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java +++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java @@ -198,7 +198,7 @@ public class CatalogUtil { public static String [] splitFQTableName(String qualifiedName) { String [] splitted = CatalogUtil.splitTableName(qualifiedName); if (splitted.length == 1) { - throw new IllegalArgumentException("createTable() requires a qualified table name, but it is \"" + throw new IllegalArgumentException("Table name is expected to be qualified, but was \"" + qualifiedName + "\"."); } return splitted; http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java index bd64eb0..abd3bca 100644 --- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java +++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java @@ -21,16 +21,14 @@ package org.apache.tajo.catalog; import com.google.common.base.Objects; import com.google.common.collect.ImmutableList; import com.google.gson.annotations.Expose; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.apache.tajo.catalog.SchemaUtil.ColumnVisitor; -import org.apache.tajo.exception.DuplicateColumnException; import org.apache.tajo.catalog.json.CatalogGsonHelper; import org.apache.tajo.catalog.proto.CatalogProtos.ColumnProto; import org.apache.tajo.catalog.proto.CatalogProtos.SchemaProto; import org.apache.tajo.common.ProtoObject; import org.apache.tajo.common.TajoDataTypes.DataType; import org.apache.tajo.common.TajoDataTypes.Type; +import org.apache.tajo.exception.DuplicateColumnException; import org.apache.tajo.exception.TajoRuntimeException; import org.apache.tajo.json.GsonObject; import org.apache.tajo.util.StringUtils; @@ -39,7 +37,6 @@ import org.apache.tajo.util.TUtil; import java.util.*; public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject { - private static final Log LOG = LogFactory.getLog(Schema.class); @Expose protected List<Column> fields = null; @Expose protected Map<String, Integer> fieldsByQualifiedName = null; http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/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 477e49f..dff292f 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 @@ -84,8 +84,8 @@ public class CatalogServer extends AbstractService { private Map<String, List<FunctionDescProto>> functions = new ConcurrentHashMap<String, List<FunctionDescProto>>(); - private final LinkedMetadataManager linkedMetadataManager; - private final InfoSchemaMetadataDictionary metaDictionary = new InfoSchemaMetadataDictionary(); + protected final LinkedMetadataManager linkedMetadataManager; + protected final InfoSchemaMetadataDictionary metaDictionary = new InfoSchemaMetadataDictionary(); // RPC variables private BlockingRpcServer rpcServer; @@ -270,7 +270,7 @@ public class CatalogServer extends AbstractService { return StringListResponse.newBuilder() .setState(OK) .addAllValues(linkedMetadataManager.getTablespaceNames()) - .addAllValues(store.getAllDatabaseNames()) + .addAllValues(store.getAllTablespaceNames()) .build(); } catch (Throwable t) { @@ -466,13 +466,17 @@ public class CatalogServer extends AbstractService { String databaseName = request.getValue(); if (linkedMetadataManager.existsDatabase(databaseName)) { - return errInsufficientPrivilege("alter a table in database '" + databaseName + "'"); + return errInsufficientPrivilege("drop a table in database '" + databaseName + "'"); } if (metaDictionary.isSystemDatabase(databaseName)) { return errInsufficientPrivilege("drop a table in database '" + databaseName + "'"); } + if (databaseName.equals(TajoConstants.DEFAULT_DATABASE_NAME)) { + return errInsufficientPrivilege("drop a table in database '" + databaseName + "'"); + } + wlock.lock(); try { store.dropDatabase(databaseName); @@ -812,6 +816,7 @@ public class CatalogServer extends AbstractService { try { return GetColumnsResponse .newBuilder() + .setState(OK) .addAllColumn(store.getAllColumns()) .build(); @@ -1275,7 +1280,7 @@ public class CatalogServer extends AbstractService { public IndexListResponse getAllIndexes(RpcController controller, NullProto request) throws ServiceException { rlock.lock(); try { - return IndexListResponse.newBuilder().addAllIndexDesc(store.getAllIndexes()).build(); + return IndexListResponse.newBuilder().setState(OK).addAllIndexDesc(store.getAllIndexes()).build(); } catch (Throwable t) { printStackTraceIfError(LOG, t); http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/LinkedMetadataManager.java ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/LinkedMetadataManager.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/LinkedMetadataManager.java index 122c1af..6d4af1f 100644 --- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/LinkedMetadataManager.java +++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/LinkedMetadataManager.java @@ -108,6 +108,21 @@ public class LinkedMetadataManager { } /** + * Check if the tablespace exists. + * + * @param tablespaceName + * @return True if the tablespace exists. + */ + public boolean existsTablespace(String tablespaceName) { + for (MetadataProvider provider : providerMap.values()) { + if (provider.getTablespaceName().equals(tablespaceName)) { + return true; + } + } + return false; + } + + /** * Return all database names * * @return A collection of database names http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/MiniCatalogServer.java ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/MiniCatalogServer.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/MiniCatalogServer.java deleted file mode 100644 index 70ed314..0000000 --- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/MiniCatalogServer.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * 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.catalog; - -import org.apache.tajo.conf.TajoConf; - -import java.io.IOException; - -public class MiniCatalogServer { - private CatalogServer catalogServers; - - public MiniCatalogServer(TajoConf conf) throws IOException { - catalogServers = new CatalogServer(); - catalogServers.init(conf); - catalogServers.start(); - } - - public MiniCatalogServer(CatalogServer server) { - this.catalogServers = server; - } - - public void shutdown() { - this.catalogServers.stop(); - } - - public CatalogServer getCatalogServer() { - return this.catalogServers; - } - - public CatalogService getCatalog() { - return new LocalCatalogWrapper(this.catalogServers); - } -} http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/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 f33b621..0b1b120 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 @@ -302,7 +302,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo } @Override - public void createTablespace(String spaceName, String spaceUri) { + public void createTablespace(String spaceName, String spaceUri) throws DuplicateTablespaceException { Connection conn = null; PreparedStatement pstmt = null; ResultSet res = null; @@ -310,7 +310,18 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo try { conn = getConnection(); conn.setAutoCommit(false); - String sql = String.format("INSERT INTO %s (SPACE_NAME, SPACE_URI) VALUES (?, ?)", TB_SPACES); + + String sql = String.format("SELECT SPACE_ID FROM %s WHERE SPACE_NAME=(?)", TB_SPACES); + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, spaceName); + res = pstmt.executeQuery(); + if (res.next()) { + throw new DuplicateTablespaceException(spaceName); + } + res.close(); + pstmt.close(); + + sql = String.format("INSERT INTO %s (SPACE_NAME, SPACE_URI) VALUES (?, ?)", TB_SPACES); if (LOG.isDebugEnabled()) { LOG.debug(sql); @@ -476,7 +487,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo ResultSet resultSet = null; try { - String sql = "SELECT SPACE_NAME, SPACE_URI FROM " + TB_SPACES + " WHERE SPACE_NAME=?"; + String sql = "SELECT * FROM " + TB_SPACES + " WHERE SPACE_NAME=?"; conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, spaceName); @@ -486,13 +497,18 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo throw new UndefinedTablespaceException(spaceName); } + int spaceId = resultSet.getInt(COL_TABLESPACE_PK); String retrieveSpaceName = resultSet.getString("SPACE_NAME"); + String handler = resultSet.getString("SPACE_HANDLER"); String uri = resultSet.getString("SPACE_URI"); - TablespaceProto.Builder builder = TablespaceProto.newBuilder(); - builder.setSpaceName(retrieveSpaceName); - builder.setUri(uri); - return builder.build(); + return TablespaceProto.newBuilder(). + setId(spaceId). + setSpaceName(retrieveSpaceName). + setHandler(handler). + setUri(uri). + build(); + } catch (SQLException se) { throw new TajoInternalError(se); @@ -502,9 +518,25 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo } @Override - public void alterTablespace(AlterTablespaceProto alterProto) { + public void alterTablespace(AlterTablespaceProto alterProto) throws UndefinedTablespaceException { Connection conn; PreparedStatement pstmt = null; + ResultSet res = null; + + try { + conn = getConnection(); + String sql = String.format("SELECT SPACE_NAME FROM %s WHERE SPACE_NAME=?", TB_SPACES); + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, alterProto.getSpaceName()); + res = pstmt.executeQuery(); + if (!res.next()) { + throw new UndefinedTablespaceException(alterProto.getSpaceName()); + } + } catch (SQLException e) { + throw new TajoInternalError(e); + } finally { + CatalogUtil.closeQuietly(pstmt, res); + } if (alterProto.getCommandList().size() == 1) { AlterTablespaceCommand command = alterProto.getCommand(0); @@ -513,7 +545,6 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo 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()); @@ -1002,7 +1033,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo public void alterTable(CatalogProtos.AlterTableDescProto alterTableDescProto) throws UndefinedDatabaseException, DuplicateTableException, DuplicateColumnException, DuplicatePartitionException, UndefinedPartitionException, UndefinedColumnException, UndefinedTableException, - UndefinedPartitionMethodException { + UndefinedPartitionMethodException, AmbiguousTableException { String[] splitted = CatalogUtil.splitTableName(alterTableDescProto.getTableName()); if (splitted.length == 1) { @@ -1019,13 +1050,14 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo switch (alterTableDescProto.getAlterTableType()) { case RENAME_TABLE: - if (existTable(databaseName, alterTableDescProto.getNewTableName())) { + String simpleNewTableName = CatalogUtil.extractSimpleName(alterTableDescProto.getNewTableName()); + if (existTable(databaseName, simpleNewTableName)) { throw new DuplicateTableException(alterTableDescProto.getNewTableName()); } if (alterTableDescProto.hasNewTablePath()) { - renameManagedTable(tableId, alterTableDescProto.getNewTableName(), alterTableDescProto.getNewTablePath()); + renameManagedTable(tableId, simpleNewTableName, alterTableDescProto.getNewTablePath()); } else { - renameExternalTable(tableId, alterTableDescProto.getNewTableName()); + renameExternalTable(tableId, simpleNewTableName); } break; case RENAME_COLUMN: @@ -1189,7 +1221,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo } private void renameColumn(final int tableId, final CatalogProtos.AlterColumnProto alterColumnProto) - throws UndefinedColumnException { + throws UndefinedColumnException, AmbiguousTableException { final String selectColumnSql = "SELECT COLUMN_NAME, DATA_TYPE, TYPE_LENGTH, ORDINAL_POSITION, NESTED_FIELD_NUM from " + TB_COLUMNS + @@ -1215,10 +1247,19 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo conn = getConnection(); conn.setAutoCommit(false); + String tableName = CatalogUtil.extractQualifier(alterColumnProto.getOldColumnName()); + String simpleOldColumnName = CatalogUtil.extractSimpleName(alterColumnProto.getOldColumnName()); + String simpleNewColumnName = CatalogUtil.extractSimpleName(alterColumnProto.getNewColumnName()); + + if (!tableName.equals(CatalogUtil.extractQualifier(alterColumnProto.getNewColumnName()))) { + throw new AmbiguousTableException( + tableName + ", " + CatalogUtil.extractQualifier(alterColumnProto.getNewColumnName())); + } + //SELECT COLUMN pstmt = conn.prepareStatement(selectColumnSql); pstmt.setInt(1, tableId); - pstmt.setString(2, alterColumnProto.getOldColumnName()); + pstmt.setString(2, simpleOldColumnName); resultSet = pstmt.executeQuery(); CatalogProtos.ColumnProto columnProto = null; @@ -1242,14 +1283,14 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo //DELETE COLUMN pstmt = conn.prepareStatement(deleteColumnNameSql); pstmt.setInt(1, tableId); - pstmt.setString(2, alterColumnProto.getOldColumnName()); + pstmt.setString(2, simpleOldColumnName); pstmt.executeUpdate(); pstmt.close(); //INSERT COLUMN pstmt = conn.prepareStatement(insertNewColumnSql); pstmt.setInt(1, tableId); - pstmt.setString(2, CatalogUtil.extractSimpleName(columnProto.getName())); + pstmt.setString(2, simpleNewColumnName); pstmt.setInt(3, ordinalPosition); pstmt.setInt(4, nestedFieldNum); pstmt.setString(5, columnProto.getDataType().getType().name()); @@ -1266,7 +1307,14 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo } } - private void addNewColumn(int tableId, CatalogProtos.ColumnProto columnProto) { + private void addNewColumn(int tableId, CatalogProtos.ColumnProto columnProto) throws DuplicateColumnException { + + Connection conn; + PreparedStatement pstmt = null; + ResultSet resultSet = null; + + final String existColumnSql = + String.format("SELECT COLUMN_NAME FROM %s WHERE TID=? AND COLUMN_NAME=?", TB_COLUMNS); final String insertNewColumnSql = "INSERT INTO " + TB_COLUMNS + @@ -1274,17 +1322,19 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo final String columnCountSql = "SELECT MAX(ORDINAL_POSITION) AS POSITION FROM " + TB_COLUMNS + " WHERE TID = ?"; - if (LOG.isDebugEnabled()) { - LOG.debug(insertNewColumnSql); - LOG.debug(columnCountSql); - } - - Connection conn; - PreparedStatement pstmt = null; - ResultSet resultSet = null; - try { conn = getConnection(); + pstmt = conn.prepareStatement(existColumnSql); + pstmt.setInt(1, tableId); + pstmt.setString(2, CatalogUtil.extractSimpleName(columnProto.getName())); + resultSet = pstmt.executeQuery(); + + if (resultSet.next()) { + throw new DuplicateColumnException(columnProto.getName()); + } + pstmt.close(); + resultSet.close(); + pstmt = conn.prepareStatement(columnCountSql); pstmt.setInt(1 , tableId); resultSet = pstmt.executeQuery(); @@ -1918,9 +1968,12 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo resultSet = stmt.executeQuery(sql); while (resultSet.next()) { ColumnProto.Builder builder = ColumnProto.newBuilder(); - - builder.setTid(resultSet.getInt("TID")); - builder.setName(resultSet.getString("COLUMN_NAME")); + + int tid = resultSet.getInt("TID"); + String databaseName = getDatabaseNameOfTable(conn, tid); + String tableName = getTableName(conn, tid); + builder.setTid(tid); + builder.setName(CatalogUtil.buildFQName(databaseName, tableName, resultSet.getString("COLUMN_NAME"))); int nestedFieldNum = resultSet.getInt("NESTED_FIELD_NUM"); @@ -2322,7 +2375,8 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo } @Override - public void createIndex(final IndexDescProto proto) throws UndefinedDatabaseException, UndefinedTableException { + public void createIndex(final IndexDescProto proto) + throws UndefinedDatabaseException, UndefinedTableException, DuplicateIndexException { Connection conn = null; PreparedStatement pstmt = null; @@ -2330,11 +2384,27 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo final String tableName = CatalogUtil.extractSimpleName(proto.getTableIdentifier().getTableName()); try { + // indexes table int databaseId = getDatabaseId(databaseName); int tableId = getTableId(databaseId, databaseName, tableName); - String sql = "INSERT INTO " + TB_INDEXES + + String sql = String.format("SELECT INDEX_NAME FROM %s WHERE DB_ID=? AND INDEX_NAME=?", TB_INDEXES); + + conn = getConnection(); + conn.setAutoCommit(false); + + pstmt = conn.prepareStatement(sql); + pstmt.setInt(1, databaseId); + pstmt.setString(2, proto.getIndexName()); + ResultSet res = pstmt.executeQuery(); + if (res.next()) { + throw new DuplicateIndexException(proto.getIndexName()); + } + pstmt.close(); + res.close(); + + sql = "INSERT INTO " + TB_INDEXES + " (" + COL_DATABASES_PK + ", " + COL_TABLES_PK + ", INDEX_NAME, " + "INDEX_TYPE, PATH, COLUMN_NAMES, DATA_TYPES, ORDERS, NULL_ORDERS, IS_UNIQUE, IS_CLUSTERED) " + "VALUES (?,?,?,?,?,?,?,?,?,?,?)"; @@ -2362,12 +2432,9 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo } columnNamesBuilder.deleteCharAt(columnNamesBuilder.length()-1); dataTypesBuilder.deleteCharAt(dataTypesBuilder.length()-1); - ordersBuilder.deleteCharAt(ordersBuilder.length()-1); + ordersBuilder.deleteCharAt(ordersBuilder.length() - 1); nullOrdersBuilder.deleteCharAt(nullOrdersBuilder.length()-1); - conn = getConnection(); - conn.setAutoCommit(false); - pstmt = conn.prepareStatement(sql); pstmt.setInt(1, databaseId); pstmt.setInt(2, tableId); @@ -2390,19 +2457,34 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo } @Override - public void dropIndex(String databaseName, final String indexName) throws UndefinedDatabaseException { - Connection conn = null; + public void dropIndex(String databaseName, final String indexName) + throws UndefinedDatabaseException, UndefinedIndexException { + Connection conn; PreparedStatement pstmt = null; try { int databaseId = getDatabaseId(databaseName); - String sql = "DELETE FROM " + TB_INDEXES + " WHERE " + COL_DATABASES_PK + "=? AND INDEX_NAME=?"; + + String sql = String.format("SELECT INDEX_NAME FROM %s WHERE %s=? AND INDEX_NAME=?", TB_INDEXES, COL_DATABASES_PK); + + conn = getConnection(); + pstmt = conn.prepareStatement(sql); + pstmt.setInt(1, databaseId); + pstmt.setString(2, indexName); + ResultSet res = pstmt.executeQuery(); + if (!res.next()) { + throw new UndefinedIndexException(CatalogUtil.buildFQName(databaseName, indexName)); + } + pstmt.close(); + res.close(); + + sql = "DELETE FROM " + TB_INDEXES + " WHERE " + COL_DATABASES_PK + "=? AND INDEX_NAME=?"; if (LOG.isDebugEnabled()) { LOG.debug(sql); } - conn = getConnection(); + pstmt = conn.prepareStatement(sql); pstmt.setInt(1, databaseId); pstmt.setString(2, indexName); @@ -2432,6 +2514,35 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo } } + public static String getDatabaseNameOfTable(Connection conn, int tid) throws SQLException { + ResultSet res = null; + PreparedStatement pstmt = null; + + try { + pstmt = + conn.prepareStatement("SELECT " + COL_DATABASES_PK + " FROM " + TB_TABLES + " WHERE " + COL_TABLES_PK + "=?"); + pstmt.setInt(1, tid); + res = pstmt.executeQuery(); + if (!res.next()) { + throw new TajoInternalError("Inconsistent data: no table corresponding to TID " + tid); + } + int dbId = res.getInt(1); + res.close(); + pstmt.close(); + + pstmt = conn.prepareStatement("SELECT DB_NAME FROM " + TB_DATABASES + " WHERE " + COL_DATABASES_PK + "=?"); + pstmt.setInt(1, dbId); + res = pstmt.executeQuery(); + if (!res.next()) { + throw new TajoInternalError("Inconsistent data: no database corresponding to DB_ID " + dbId); + } + + return res.getString(1); + } finally { + CatalogUtil.closeQuietly(pstmt, res); + } + } + final static String GET_INDEXES_SQL = "SELECT * FROM " + TB_INDEXES; http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/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 38d734f..a067a53 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 @@ -71,7 +71,7 @@ public interface CatalogStore extends Closeable { void alterTable(CatalogProtos.AlterTableDescProto alterTableDescProto) throws UndefinedDatabaseException, DuplicateTableException, DuplicateColumnException, DuplicatePartitionException, UndefinedPartitionException, - UndefinedTableException, UndefinedColumnException, UndefinedPartitionMethodException; + UndefinedTableException, UndefinedColumnException, UndefinedPartitionMethodException, AmbiguousTableException; List<TableDescriptorProto> getAllTables(); http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/derby.xml ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/derby.xml b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/derby.xml index 3ce7e2f..c48c078 100644 --- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/derby.xml +++ b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/derby.xml @@ -19,6 +19,7 @@ <tns:store xmlns:tns="http://tajo.apache.org/catalogstore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition.xsd "> <!-- Catalog base version history + * 9 - 2015-09-12: Allow external catalog store for unit testing (TAJO-1813) * 8 - 2015-09-02: Wrong table type problem in catalog (TAJO-1808) * 7 - 2015-07-30: Add a column and index for partition keys (TAJO-1346) * 6 - 2015-07-24: Merge the index branch into the master branch (TAJO-1300) @@ -28,7 +29,7 @@ * 2 - 2014-06-09: First versioning * 1- Before 2013-03-20 --> - <tns:base version="8"> + <tns:base version="9"> <tns:objects> <tns:Object order="0" type="table" name="META"> <tns:sql><![CDATA[CREATE TABLE META (VERSION INT NOT NULL)]]></tns:sql> @@ -54,8 +55,8 @@ )]]> </tns:sql> </tns:Object> - <tns:Object order="3" type="index" name="IDX_DATABASE_DB_ID" dependsOn="DATABASES_"> - <tns:sql><![CDATA[CREATE UNIQUE INDEX idx_database_db_id on DATABASES_ (DB_ID)]]></tns:sql> + <tns:Object order="3" type="index" name="IDX_DATABASE_DB_NAME" dependsOn="DATABASES_"> + <tns:sql><![CDATA[CREATE UNIQUE INDEX idx_database_db_id on DATABASES_ (DB_NAME)]]></tns:sql> </tns:Object> <tns:Object order="4" type="table" name="TABLES"> <tns:sql><![CDATA[ @@ -89,6 +90,11 @@ CONSTRAINT COLUMNS_PK PRIMARY KEY (TID, ORDINAL_POSITION) )]]> </tns:sql> + <!-- + The constraint for guaranteeing the unique column name should be added to COLUMNS table. However, it can + make this table's schema complicated due to nested fields. Fortunately, columns are always converted + into 'schema' which has a functionality of checking duplicated column names. + --> </tns:Object> <tns:Object order="8" type="index" name="IDX_FK_COLUMNS_TABLE_NAME" dependsOn="COLUMNS"> <tns:sql><![CDATA[CREATE UNIQUE INDEX idx_fk_columns_table_name on COLUMNS (TID, ORDINAL_POSITION)]]></tns:sql> @@ -99,7 +105,7 @@ TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE, KEY_ VARCHAR(255) NOT NULL, VALUE_ VARCHAR(4000) NOT NULL, - CONSTRAINT C_OPTIONS_UNIQUE UNIQUE (TID, KEY_, VALUE_) + CONSTRAINT OPTIONS_PKEY PRIMARY KEY (TID, KEY_) )]]> </tns:sql> </tns:Object> http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/mariadb/mariadb.xml ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/mariadb/mariadb.xml b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/mariadb/mariadb.xml index e71043e..0bde634 100644 --- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/mariadb/mariadb.xml +++ b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/mariadb/mariadb.xml @@ -19,6 +19,7 @@ <tns:store xmlns:tns="http://tajo.apache.org/catalogstore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition.xsd "> <!-- Catalog base version history + * 9 - 2015-09-12: Allow external catalog store for unit testing (TAJO-1813) * 8 - 2015-09-02: Wrong table type problem in catalog (TAJO-1808) * 7 - 2015-07-30: Add a column and index for partition keys (TAJO-1346) * 6 - 2015-07-24: Merge the index branch into the master branch (TAJO-1300) @@ -28,7 +29,7 @@ * 2 - 2014-06-09: First versioning * 1- Before 2013-03-20 --> - <tns:base version="8"> + <tns:base version="9"> <tns:objects> <tns:Object order="0" type="table" name="META"> <tns:sql><![CDATA[CREATE TABLE META (VERSION INT NOT NULL)]]></tns:sql> @@ -83,6 +84,11 @@ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE )]]> </tns:sql> + <!-- + The constraint for guaranteeing the unique column name should be added to COLUMNS table. However, it can + make this table's schema complicated due to nested fields. Fortunately, columns are always converted + into 'schema' which has a functionality of checking duplicated column names. + --> </tns:Object> <tns:Object order="5" type="table" name="OPTIONS"> <tns:sql><![CDATA[ http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/mysql/mysql.xml ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/mysql/mysql.xml b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/mysql/mysql.xml index ccf71b0..1251693 100644 --- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/mysql/mysql.xml +++ b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/mysql/mysql.xml @@ -19,6 +19,7 @@ <tns:store xmlns:tns="http://tajo.apache.org/catalogstore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition.xsd "> <!-- Catalog base version history + * 9 - 2015-09-12: Allow external catalog store for unit testing (TAJO-1813) * 8 - 2015-09-02: Wrong table type problem in catalog (TAJO-1808) * 7 - 2015-07-30: Add a column and index for partition keys (TAJO-1346) * 6 - 2015-07-24: Merge the index branch into the master branch (TAJO-1300) @@ -28,7 +29,7 @@ * 2 - 2014-06-09: First versioning * 1- Before 2013-03-20 --> - <tns:base version="8"> + <tns:base version="9"> <tns:objects> <tns:Object order="0" type="table" name="META"> <tns:sql><![CDATA[CREATE TABLE META (VERSION INT NOT NULL)]]></tns:sql> @@ -83,6 +84,11 @@ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE )]]> </tns:sql> + <!-- + The constraint for guaranteeing the unique column name should be added to COLUMNS table. However, it can + make this table's schema complicated due to nested fields. Fortunately, columns are always converted + into 'schema' which has a functionality of checking duplicated column names. + --> </tns:Object> <tns:Object order="5" type="table" name="OPTIONS"> <tns:sql><![CDATA[ @@ -117,7 +123,10 @@ )]]> </tns:sql> </tns:Object> - <tns:Object order="7" type="table" name="STATS"> + <tns:Object order="7" type="index" name="INDEXES_IDX_TID_COLUMN_NAME" dependsOn="INDEXES"> + <tns:sql><![CDATA[CREATE INDEX INDEXES_IDX_TID_COLUMN_NAME on INDEXES (DB_ID, TID, COLUMN_NAMES)]]></tns:sql> + </tns:Object> + <tns:Object order="8" type="table" name="STATS"> <tns:sql><![CDATA[ CREATE TABLE STATS ( TID INT NOT NULL PRIMARY KEY, @@ -127,7 +136,7 @@ )]]> </tns:sql> </tns:Object> - <tns:Object order="8" type="table" name="PARTITION_METHODS"> + <tns:Object order="9" type="table" name="PARTITION_METHODS"> <tns:sql><![CDATA[ CREATE TABLE PARTITION_METHODS ( TID INT NOT NULL PRIMARY KEY, @@ -138,7 +147,7 @@ )]]> </tns:sql> </tns:Object> - <tns:Object order="9" type="table" name="PARTITIONS"> + <tns:Object order="10" type="table" name="PARTITIONS"> <tns:sql><![CDATA[ CREATE TABLE PARTITIONS ( PARTITION_ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, @@ -150,7 +159,7 @@ )]]> </tns:sql> </tns:Object> - <tns:Object order="10" type="table" name="PARTITION_KEYS"> + <tns:Object order="11" type="table" name="PARTITION_KEYS"> <tns:sql><![CDATA[ CREATE TABLE PARTITION_KEYS ( PARTITION_ID INT NOT NULL, http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/oracle/oracle.xml ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/oracle/oracle.xml b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/oracle/oracle.xml index 01cf1ae..1c09231 100644 --- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/oracle/oracle.xml +++ b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/oracle/oracle.xml @@ -19,6 +19,7 @@ <tns:store xmlns:tns="http://tajo.apache.org/catalogstore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition.xsd "> <!-- Catalog base version history + * 9 - 2015-09-12: Allow external catalog store for unit testing (TAJO-1813) * 8 - 2015-09-02: Wrong table type problem in catalog (TAJO-1808) * 7 - 2015-07-30: Add a column and index for partition keys (TAJO-1346) * 6 - 2015-07-24: Merge the index branch into the master branch (TAJO-1300) @@ -28,7 +29,7 @@ * 2 - 2014-06-09: First versioning * 1- Before 2013-03-20 --> - <tns:base version="8"> + <tns:base version="9"> <tns:objects> <tns:Object order="0" type="table" name="meta"> <tns:sql><![CDATA[ @@ -95,7 +96,8 @@ TABLE_TYPE VARCHAR2(128) NOT NULL, PATH VARCHAR2(4000), STORE_TYPE CHAR(16), - FOREIGN KEY (DB_ID) REFERENCES DATABASES_ (DB_ID) + FOREIGN KEY (DB_ID) REFERENCES DATABASES_ (DB_ID), + CONSTRAINT C_TABLE_ID_UNIQ UNIQUE (DB_ID, TABLE_NAME) )]]> </tns:sql> </tns:Object> @@ -135,6 +137,11 @@ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE )]]> </tns:sql> + <!-- + The constraint for guaranteeing the unique column name should be added to COLUMNS table. However, it can + make this table's schema complicated due to nested fields. Fortunately, columns are always converted + into 'schema' which has a functionality of checking duplicated column names. + --> </tns:Object> <tns:Object order="13" type="table" name="OPTIONS"> <tns:sql><![CDATA[ @@ -164,12 +171,13 @@ IS_CLUSTERED CHAR NOT NULL, IS_ASCENDING CHAR NOT NULL, FOREIGN KEY (DB_ID) REFERENCES DATABASES_ (DB_ID) ON DELETE CASCADE, - FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE + FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE, + CONSTRAINT C_INDEXES_UNIQ UNIQUE (DB_ID, INDEX_NAME) )]]> </tns:sql> </tns:Object> - <tns:Object order="15" type="index" name="INDEXES_IDX_TID_COLUMN_NAME" dependsOn="INDEXES"> - <tns:sql><![CDATA[CREATE INDEX INDEXES_IDX_TID_COLUMN_NAME on INDEXES (TID, COLUMN_NAME)]]></tns:sql> + <tns:Object order="15" type="index" name="IDX_INDEXES_COLUMNS" dependsOn="INDEXES"> + <tns:sql><![CDATA[CREATE INDEX idx_col_names ON INDEXES (DB_ID,TID,column_names)]]></tns:sql> </tns:Object> <tns:Object order="16" type="table" name="STATS"> <tns:sql><![CDATA[ @@ -199,7 +207,8 @@ TID INT NOT NULL, PARTITION_NAME VARCHAR2(767), PATH VARCHAR2(4000), - FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE + FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE, + CONSTRAINT C_PARTITIONS_UNIQ UNIQUE (TID, PARTITION_NAME) )]]> </tns:sql> </tns:Object> http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/postgresql.xml ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/postgresql.xml b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/postgresql.xml index 8c73ee4..feb6656 100644 --- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/postgresql.xml +++ b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/postgresql.xml @@ -21,6 +21,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition.xsd "> <!-- Catalog base version history + * 9 - 2015-09-12: Allow external catalog store for unit testing (TAJO-1813) * 8 - 2015-09-02: Wrong table type problem in catalog (TAJO-1808) * 7 - 2015-07-30: Add a column and index for partition keys (TAJO-1346) * 6 - 2015-07-24: Merge the index branch into the master branch (TAJO-1300) @@ -31,7 +32,7 @@ xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition. * 2 - 2014-06-09: First versioning * 1- Before 2013-03-20 --> - <tns:base version="8"> + <tns:base version="9"> <tns:objects> <tns:Object name="META" type="table" order="0"> <tns:sql><![CDATA[CREATE TABLE META (VERSION INT NOT NULL)]]></tns:sql> @@ -72,7 +73,8 @@ xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition. TABLE_TYPE VARCHAR(128) NOT NULL, PATH VARCHAR(4096), STORE_TYPE CHAR(16), - FOREIGN KEY (DB_ID) REFERENCES DATABASES_ (DB_ID) + FOREIGN KEY (DB_ID) REFERENCES DATABASES_ (DB_ID), + UNIQUE (DB_ID, TABLE_NAME) )]]> </tns:sql> </tns:Object> @@ -95,6 +97,11 @@ xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition. FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE )]]> </tns:sql> + <!-- + The constraint for guaranteeing the unique column name should be added to COLUMNS table. However, it can + make this table's schema complicated due to nested fields. Fortunately, columns are always converted + into 'schema' which has a functionality of checking duplicated column names. + --> </tns:Object> <tns:Object name="OPTIONS" type="table" order="9"> <tns:sql><![CDATA[ @@ -123,7 +130,8 @@ xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition. IS_UNIQUE BOOLEAN NOT NULL, IS_CLUSTERED BOOLEAN NOT NULL, FOREIGN KEY (DB_ID) REFERENCES DATABASES_ (DB_ID) ON DELETE CASCADE, - FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE + FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE, + UNIQUE (DB_ID, INDEX_NAME) )]]> </tns:sql> </tns:Object> @@ -162,7 +170,8 @@ xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition. PARTITION_NAME VARCHAR(128), PARTITION_VALUE VARCHAR(1024), PATH VARCHAR(4096), - FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE + FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE, + UNIQUE (TID, PARTITION_NAME) )]]> </tns:sql> </tns:Object> http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/CatalogTestingUtil.java ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/CatalogTestingUtil.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/CatalogTestingUtil.java index 22fc23a..07130cc 100644 --- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/CatalogTestingUtil.java +++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/CatalogTestingUtil.java @@ -18,12 +18,32 @@ package org.apache.tajo.catalog; +import com.google.common.base.Preconditions; +import org.apache.hadoop.fs.Path; +import org.apache.tajo.TajoConstants; import org.apache.tajo.annotation.NotNull; import org.apache.tajo.annotation.Nullable; +import org.apache.tajo.catalog.partition.PartitionDesc; +import org.apache.tajo.catalog.partition.PartitionMethodDesc; +import org.apache.tajo.catalog.proto.CatalogProtos; +import org.apache.tajo.catalog.proto.CatalogProtos.IndexMethod; +import org.apache.tajo.catalog.proto.CatalogProtos.PartitionKeyProto; +import org.apache.tajo.catalog.statistics.TableStats; import org.apache.tajo.catalog.store.*; +import org.apache.tajo.common.TajoDataTypes.Type; import org.apache.tajo.conf.TajoConf; import org.apache.tajo.conf.TajoConf.ConfVars; import org.apache.tajo.exception.UnsupportedCatalogStore; +import org.apache.tajo.util.KeyValueSet; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME; public class CatalogTestingUtil { @@ -32,9 +52,36 @@ public class CatalogTestingUtil { String driverClassName = System.getProperty(CatalogConstants.STORE_CLASS); final boolean useDefaultCatalog = driverClassName == null; - conf = initializeDerbyStore(conf, testDirPath); + if (useDefaultCatalog) { + conf = initializeDerbyStore(conf, testDirPath); + + } else { + Class clazz; + try { + clazz = Class.forName(driverClassName); + } catch (ClassNotFoundException e) { + throw new UnsupportedCatalogStore(driverClassName); + } + Class<? extends CatalogStore> catalogClass = clazz; + + String catalogURI = System.getProperty(CatalogConstants.CATALOG_URI); + if (catalogURI == null) { + catalogURI = getCatalogURI(catalogClass, null, testDirPath); + } - // TODO: if useDefaultCatalog is false, use external database as catalog + configureCatalogClassAndUri(conf, catalogClass, catalogURI); + + if (requireAuth(catalogClass)) { + String connectionId = System.getProperty(CatalogConstants.CONNECTION_ID); + String connectionPasswd = System.getProperty(CatalogConstants.CONNECTION_PASSWORD); + + assert connectionId != null; + conf.set(CatalogConstants.CONNECTION_ID, connectionId); + if (connectionPasswd != null) { + conf.set(CatalogConstants.CONNECTION_PASSWORD, connectionPasswd); + } + } + } return conf; } @@ -90,4 +137,124 @@ public class CatalogTestingUtil { throw new UnsupportedCatalogStore(clazz.getCanonicalName()); } } + + public static PartitionDesc buildPartitionDesc(String partitionName) { + PartitionDesc partitionDesc = new PartitionDesc(); + partitionDesc.setPartitionName(partitionName); + + String[] partitionNames = partitionName.split("/"); + + List<PartitionKeyProto> partitionKeyList = new ArrayList<>(); + for(int i = 0; i < partitionNames.length; i++) { + String [] splits = partitionNames[i].split("="); + String columnName = "", partitionValue = ""; + if (splits.length == 2) { + columnName = splits[0]; + partitionValue = splits[1]; + } else if (splits.length == 1) { + if (partitionNames[i].charAt(0) == '=') { + partitionValue = splits[0]; + } else { + columnName = ""; + } + } + + PartitionKeyProto.Builder builder = PartitionKeyProto.newBuilder(); + builder.setColumnName(partitionValue); + builder.setPartitionValue(columnName); + partitionKeyList.add(builder.build()); + } + + partitionDesc.setPartitionKeys(partitionKeyList); + + partitionDesc.setPath("hdfs://xxx.com/warehouse/" + partitionName); + return partitionDesc; + } + + public static void prepareBaseData(CatalogService catalog, String testDir) throws Exception { + catalog.createTablespace("space1", "hdfs://xxx.com/warehouse"); + catalog.createTablespace("SpAcE1", "hdfs://xxx.com/warehouse"); + + catalog.createDatabase("TestDatabase1", "space1"); + catalog.createDatabase("testDatabase1", "SpAcE1"); + + catalog.createTable(buildTableDesc("TestDatabase1", "TestTable1", testDir)); + catalog.createTable(buildTableDesc("TestDatabase1", "testTable1", testDir)); + catalog.createTable(buildPartitionTableDesc("TestDatabase1", "TestPartition1", testDir)); + catalog.createTable(buildPartitionTableDesc("TestDatabase1", "testPartition1", testDir)); + } + + public static void cleanupBaseData(CatalogService catalog) throws Exception { + catalog.dropTable(CatalogUtil.buildFQName("TestDatabase1", "testPartition1")); + catalog.dropTable(CatalogUtil.buildFQName("TestDatabase1", "TestPartition1")); + catalog.dropTable(CatalogUtil.buildFQName("TestDatabase1", "TestTable1")); + catalog.dropTable(CatalogUtil.buildFQName("TestDatabase1", "testTable1")); + + catalog.dropDatabase("TestDatabase1"); + catalog.dropDatabase("testDatabase1"); + + catalog.dropTablespace("space1"); + catalog.dropTablespace("SpAcE1"); + } + + public static TableDesc buildTableDesc(String databaseName, String tableName, String testDir) throws IOException { + Schema schema = new Schema(); + schema.addColumn(CatalogUtil.buildFQName(tableName, "Column"), Type.BLOB); + schema.addColumn(CatalogUtil.buildFQName(tableName, "column"), Type.INT4); + schema.addColumn(CatalogUtil.buildFQName(tableName, "cOlumn"), Type.INT8); + Path path = new Path(testDir + "/" + UUID.randomUUID().toString(), tableName); + TableDesc desc = new TableDesc( + CatalogUtil.buildFQName(databaseName, tableName), + schema, + new TableMeta("TEXT", new KeyValueSet()), + path.toUri(), true); + desc.setStats(buildTableStats()); + desc.getMeta().setOptions(buildOptions()); + return desc; + } + + public static TableDesc buildPartitionTableDesc(String databaseName, String tableName, String testDir) throws Exception { + Schema partSchema = new Schema(); + partSchema.addColumn(CatalogUtil.buildFQName(tableName, "DaTe"), Type.TEXT); + partSchema.addColumn(CatalogUtil.buildFQName(tableName, "dAtE"), Type.TEXT); + PartitionMethodDesc partitionMethodDesc = + new PartitionMethodDesc(DEFAULT_DATABASE_NAME, tableName, + CatalogProtos.PartitionType.COLUMN, "id,name", partSchema); + TableDesc desc = buildTableDesc(databaseName, tableName, testDir); + desc.setPartitionMethod(partitionMethodDesc); + return desc; + } + + public static TableStats buildTableStats() { + TableStats stats = new TableStats(); + stats.setAvgRows(1000); + stats.setNumBlocks(100); + stats.setNumBytes(10000); + stats.setNumRows(5000); + stats.setNumShuffleOutputs(40); + stats.setReadBytes(200); + return stats; + } + + public static KeyValueSet buildOptions() { + KeyValueSet options = new KeyValueSet(); + options.set("testString", "ThisIsTest"); + options.setBool("testBool", true); + options.setFloat("testFloat", 0.2f); + options.setInt("testInt", 60); + options.setLong("testLong", 800l); + return options; + } + + public static IndexDesc buildIndexDescs(String databaseName, String indexName, TableDesc table, Column... cols) + throws IOException, URISyntaxException { + Preconditions.checkArgument(cols.length > 0); + SortSpec[] colSpecs = new SortSpec[cols.length]; + for (int i = 0; i < cols.length; i++) { + colSpecs[i] = new SortSpec(cols[i], true, false); + } + return new IndexDesc(databaseName, CatalogUtil.extractSimpleName(table.getName()), + indexName, new URI("idx_test"), colSpecs, + IndexMethod.TWO_LEVEL_BIN_TREE, true, true, table.getSchema()); + } } http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/MiniCatalogServer.java ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/MiniCatalogServer.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/MiniCatalogServer.java new file mode 100644 index 0000000..ef398ab --- /dev/null +++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/MiniCatalogServer.java @@ -0,0 +1,106 @@ +/** + * 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.catalog; + +import org.apache.tajo.TajoConstants; +import org.apache.tajo.conf.TajoConf; +import org.apache.tajo.exception.*; +import org.apache.tajo.util.CommonTestingUtil; + +import java.io.IOException; +import java.util.Collection; +import java.util.Set; + +import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME; + +public class MiniCatalogServer extends CatalogServer { + + private TajoConf conf; + private String testDir; + private CatalogService catalog; + + public MiniCatalogServer() throws IOException { + super(); + initAndStart(); + } + + public MiniCatalogServer(Set<MetadataProvider> metadataProviders, Collection<FunctionDesc> sqlFuncs) + throws IOException { + super(metadataProviders, sqlFuncs); + initAndStart(); + } + + public String getTestDir() { + return testDir; + } + + private void initAndStart() { + try { + testDir = CommonTestingUtil.getTestDir().toString(); + conf = CatalogTestingUtil.configureCatalog(new TajoConf(), testDir); + this.init(conf); + this.start(); + catalog = new LocalCatalogWrapper(this); + if (!catalog.existTablespace(TajoConstants.DEFAULT_TABLESPACE_NAME)) { + catalog.createTablespace(TajoConstants.DEFAULT_TABLESPACE_NAME, testDir.toString()); + } + if (!catalog.existDatabase(DEFAULT_DATABASE_NAME)) { + catalog.createDatabase(DEFAULT_DATABASE_NAME, TajoConstants.DEFAULT_TABLESPACE_NAME); + } + + } catch (DuplicateDatabaseException + | UnsupportedCatalogStore + | IOException + | DuplicateTablespaceException e) { + throw new RuntimeException(e); + } + } + + @Override + public void serviceStop() throws Exception { + cleanup(); + + super.serviceStop(); + CommonTestingUtil.cleanupTestDir(testDir); + } + + public void cleanup() throws UndefinedTableException, InsufficientPrivilegeException, UndefinedDatabaseException, + UndefinedTablespaceException { + for (String table : catalog.getAllTableNames(DEFAULT_DATABASE_NAME)) { + catalog.dropTable(CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, table)); + } + for (String database : catalog.getAllDatabaseNames()) { + if (!database.equals(TajoConstants.DEFAULT_DATABASE_NAME) && + !linkedMetadataManager.existsDatabase(database) && + !metaDictionary.isSystemDatabase(database)) { + catalog.dropDatabase(database); + } + } + for (String tablespace : catalog.getAllTablespaceNames()) { + if (!tablespace.equals(TajoConstants.DEFAULT_TABLESPACE_NAME) && + !linkedMetadataManager.existsTablespace(tablespace)) { + catalog.dropTablespace(tablespace); + } + } + } + + public CatalogService getCatalogService() { + return catalog; + } +} http://git-wip-us.apache.org/repos/asf/tajo/blob/7d97284a/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 2fb715c..8720105 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 @@ -27,17 +27,13 @@ import org.apache.tajo.catalog.partition.PartitionMethodDesc; import org.apache.tajo.catalog.proto.CatalogProtos; import org.apache.tajo.catalog.proto.CatalogProtos.FunctionType; import org.apache.tajo.catalog.proto.CatalogProtos.IndexMethod; -import org.apache.tajo.catalog.proto.CatalogProtos.PartitionKeyProto; import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.common.TajoDataTypes.Type; -import org.apache.tajo.conf.TajoConf; import org.apache.tajo.exception.TajoException; import org.apache.tajo.exception.UndefinedFunctionException; -import org.apache.tajo.exception.UnsupportedCatalogStore; import org.apache.tajo.function.Function; import org.apache.tajo.util.CommonTestingUtil; import org.apache.tajo.util.KeyValueSet; -import org.apache.tajo.util.Pair; import org.apache.tajo.util.TUtil; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -57,47 +53,23 @@ import static org.junit.Assert.*; public class TestCatalog { static final String FieldName1="f1"; static final String FieldName2="f2"; - static final String FieldName3="f3"; + static final String FieldName3="f3"; Schema schema1; static CatalogServer server; static CatalogService catalog; - static String testDir; - - public static Pair<TajoConf, String> newTajoConfForCatalogTest() throws IOException, UnsupportedCatalogStore { - String testDir = CommonTestingUtil.getTestDir().toString(); - return new Pair<>(CatalogTestingUtil.configureCatalog(new TajoConf(), testDir), testDir); - } @BeforeClass public static void setUp() throws Exception { - - Path defaultTableSpace = CommonTestingUtil.getTestDir(); - Pair<TajoConf, String> confAndTestDir = newTajoConfForCatalogTest(); - testDir = confAndTestDir.getSecond(); - - server = new CatalogServer(); - server.init(confAndTestDir.getFirst()); - server.start(); + server = new MiniCatalogServer(); catalog = new LocalCatalogWrapper(server); - if (!catalog.existTablespace(TajoConstants.DEFAULT_TABLESPACE_NAME)) { - catalog.createTablespace(TajoConstants.DEFAULT_TABLESPACE_NAME, defaultTableSpace.toUri().toString()); - } - if (!catalog.existDatabase(DEFAULT_DATABASE_NAME)) { - catalog.createDatabase(DEFAULT_DATABASE_NAME, TajoConstants.DEFAULT_TABLESPACE_NAME); - } - - for(String table : catalog.getAllTableNames(DEFAULT_DATABASE_NAME)) { - catalog.dropTable(table); - } } @AfterClass public static void tearDown() throws IOException { server.stop(); - CommonTestingUtil.cleanupTestDir(testDir); } @Test @@ -178,20 +150,6 @@ public class TestCatalog { assertTrue(catalog.existDatabase("testCreateAndDropDatabases")); catalog.dropDatabase("testCreateAndDropDatabases"); } - - @Test - public void testCreateAndDropDatabaseWithCharacterSensitivity() throws Exception { - assertFalse(catalog.existDatabase("TestDatabase1")); - assertFalse(catalog.existDatabase("testDatabase1")); - catalog.createDatabase("TestDatabase1", TajoConstants.DEFAULT_TABLESPACE_NAME); - assertTrue(catalog.existDatabase("TestDatabase1")); - assertFalse(catalog.existDatabase("testDatabase1")); - catalog.createDatabase("testDatabase1", TajoConstants.DEFAULT_TABLESPACE_NAME); - assertTrue(catalog.existDatabase("TestDatabase1")); - assertTrue(catalog.existDatabase("testDatabase1")); - catalog.dropDatabase("TestDatabase1"); - catalog.dropDatabase("testDatabase1"); - } @Test public void testCreateAndDropManyDatabases() throws Exception { @@ -269,43 +227,6 @@ public class TestCatalog { catalog.dropDatabase("tmpdb2"); assertFalse(catalog.existDatabase("tmpdb2")); } - - @Test - public void testCreateAndDropTableWithCharacterSensivity() throws Exception { - String databaseName = "TestDatabase1"; - catalog.createDatabase(databaseName, TajoConstants.DEFAULT_TABLESPACE_NAME); - assertTrue(catalog.existDatabase(databaseName)); - - String tableName = "TestTable1"; - Schema schema = new Schema(); - schema.addColumn("Column", Type.BLOB); - schema.addColumn("column", Type.INT4); - schema.addColumn("cOlumn", Type.INT8); - Path path = new Path(CommonTestingUtil.getTestDir(), tableName); - TableDesc table = new TableDesc( - CatalogUtil.buildFQName(databaseName, tableName), - schema, - new TableMeta("TEXT", new KeyValueSet()), - path.toUri(), true); - - catalog.createTable(table); - - tableName = "testTable1"; - schema = new Schema(); - schema.addColumn("Column", Type.BLOB); - schema.addColumn("column", Type.INT4); - schema.addColumn("cOlumn", Type.INT8); - path = new Path(CommonTestingUtil.getTestDir(), tableName); - table = new TableDesc( - CatalogUtil.buildFQName(databaseName, tableName), - schema, - new TableMeta("TEXT", new KeyValueSet()), - path.toUri(), true); - - catalog.createTable(table); - - catalog.dropDatabase(databaseName); - } static String dbPrefix = "db_"; static String tablePrefix = "tb_"; @@ -915,32 +836,13 @@ public class TestCatalog { alterTableDesc.setTableName(tableName); alterTableDesc.setAlterTableType(AlterTableType.ADD_PARTITION); - PartitionDesc partitionDesc = new PartitionDesc(); - partitionDesc.setPartitionName(partitionName); - - String[] partitionNames = partitionName.split("/"); - - List<PartitionKeyProto> partitionKeyList = new ArrayList<PartitionKeyProto>(); - for(int i = 0; i < partitionNames.length; i++) { - String columnName = partitionNames[i].split("=")[0]; - String partitionValue = partitionNames[i].split("=")[1]; - - PartitionKeyProto.Builder builder = PartitionKeyProto.newBuilder(); - builder.setColumnName(partitionValue); - builder.setPartitionValue(columnName); - partitionKeyList.add(builder.build()); - } - - partitionDesc.setPartitionKeys(partitionKeyList); - - partitionDesc.setPath("hdfs://xxx.com/warehouse/" + partitionName); - - alterTableDesc.setPartitionDesc(partitionDesc); + alterTableDesc.setPartitionDesc(CatalogTestingUtil.buildPartitionDesc(partitionName)); catalog.alterTable(alterTableDesc); - CatalogProtos.PartitionDescProto resultDesc = catalog.getPartition(DEFAULT_DATABASE_NAME, - "addedtable", partitionName); + String [] split = CatalogUtil.splitFQTableName(tableName); + + CatalogProtos.PartitionDescProto resultDesc = catalog.getPartition(split[0], split[1], partitionName); assertNotNull(resultDesc); assertEquals(resultDesc.getPartitionName(), partitionName); @@ -949,7 +851,6 @@ public class TestCatalog { assertEquals(resultDesc.getPartitionKeysCount(), 2); } - private void testDropPartition(String tableName, String partitionName) throws Exception { AlterTableDesc alterTableDesc = new AlterTableDesc(); alterTableDesc.setTableName(tableName);
