You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2013/12/03 12:51:09 UTC

[14/18] TAJO-284: Add table partitioning entry to Catalog. (jaehwa)

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/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 b824756..d174e72 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
@@ -20,6 +20,9 @@ package org.apache.tajo.catalog;
 
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.function.Function;
+import org.apache.tajo.catalog.partition.Partitions;
+import org.apache.tajo.catalog.partition.Specifier;
+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.StoreType;
@@ -70,19 +73,19 @@ public class TestCatalog {
 		schema1.addColumn(FieldName2, Type.INT4);
 		schema1.addColumn(FieldName3, Type.INT8);
     Path path = new Path(CommonTestingUtil.getTestDir(), "table1");
-		TableDesc meta = CatalogUtil.newTableDesc(
+    TableDesc meta = CatalogUtil.newTableDesc(
         "getTable",
         schema1,
         StoreType.CSV,
         new Options(),
         path);
-		
-		assertFalse(catalog.existsTable("getTable"));
-		catalog.addTable(meta);
-		assertTrue(catalog.existsTable("getTable"));
-		
-		catalog.deleteTable("getTable");
+
 		assertFalse(catalog.existsTable("getTable"));
+    catalog.addTable(meta);
+    assertTrue(catalog.existsTable("getTable"));
+
+    catalog.deleteTable("getTable");
+    assertFalse(catalog.existsTable("getTable"));
 	}
 	
 	@Test(expected = Throwable.class)
@@ -197,4 +200,212 @@ public class TestCatalog {
     catalog.createFunction(overload);
     assertTrue(catalog.containFunction("test3", CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.BLOB)));
   }
+
+  @Test
+  public final void testAddAndDeleteTablePartitionByHash1() throws Exception {
+    Schema schema = new Schema();
+    schema.addColumn("id", Type.INT4)
+        .addColumn("name", Type.TEXT)
+        .addColumn("age", Type.INT4)
+        .addColumn("score", Type.FLOAT8);
+
+    String tableName = "addedtable";
+    Options opts = new Options();
+    opts.put("file.delimiter", ",");
+    TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+    Partitions partitions = new Partitions();
+    partitions.addColumn(new Column("id", Type.INT4));
+    partitions.setPartitionsType(CatalogProtos.PartitionsType.HASH);
+    partitions.setNumPartitions(2);
+
+    TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+    desc.setPartitions(partitions);
+
+    assertFalse(catalog.existsTable(tableName));
+    catalog.addTable(desc);
+    assertTrue(catalog.existsTable(tableName));
+    TableDesc retrieved = catalog.getTableDesc(tableName);
+
+    assertEquals(retrieved.getName(), tableName);
+    assertEquals(retrieved.getPartitions().getPartitionsType(), CatalogProtos.PartitionsType.HASH);
+    assertEquals(retrieved.getPartitions().getColumn(0).getColumnName(), "id");
+    assertEquals(retrieved.getPartitions().getNumPartitions(), 2);
+
+    catalog.deleteTable(tableName);
+    assertFalse(catalog.existsTable(tableName));
+  }
+
+
+  @Test
+  public final void testAddAndDeleteTablePartitionByHash2() throws Exception {
+    Schema schema = new Schema();
+    schema.addColumn("id", Type.INT4)
+        .addColumn("name", Type.TEXT)
+        .addColumn("age", Type.INT4)
+        .addColumn("score", Type.FLOAT8);
+
+    String tableName = "addedtable";
+    Options opts = new Options();
+    opts.put("file.delimiter", ",");
+    TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+    Partitions partitions = new Partitions();
+    partitions.addColumn(new Column("id", Type.INT4));
+    partitions.setPartitionsType(CatalogProtos.PartitionsType.HASH);
+    partitions.setNumPartitions(2);
+
+    partitions.addSpecifier(new Specifier("sub_part1"));
+    partitions.addSpecifier(new Specifier("sub_part2"));
+    partitions.addSpecifier(new Specifier("sub_part3"));
+
+    TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+    desc.setPartitions(partitions);
+    assertFalse(catalog.existsTable(tableName));
+    catalog.addTable(desc);
+    assertTrue(catalog.existsTable(tableName));
+
+    TableDesc retrieved = catalog.getTableDesc(tableName);
+
+    assertEquals(retrieved.getName(), tableName);
+    assertEquals(retrieved.getPartitions().getPartitionsType(), CatalogProtos.PartitionsType.HASH);
+    assertEquals(retrieved.getPartitions().getColumn(0).getColumnName(), "id");
+    assertEquals(retrieved.getPartitions().getNumPartitions(), 2);
+    assertEquals(retrieved.getPartitions().getSpecifiers().get(0).getName(),
+        "sub_part1");
+    assertEquals(retrieved.getPartitions().getSpecifiers().get(1).getName(),
+        "sub_part2");
+    assertEquals(retrieved.getPartitions().getSpecifiers().get(2).getName(),
+        "sub_part3");
+
+    catalog.deleteTable(tableName);
+    assertFalse(catalog.existsTable(tableName));
+  }
+
+  @Test
+  public final void testAddAndDeleteTablePartitionByList() throws Exception {
+    Schema schema = new Schema();
+    schema.addColumn("id", Type.INT4)
+        .addColumn("name", Type.TEXT)
+        .addColumn("age", Type.INT4)
+        .addColumn("score", Type.FLOAT8);
+
+    String tableName = "addedtable";
+    Options opts = new Options();
+    opts.put("file.delimiter", ",");
+    TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+    Partitions partitions = new Partitions();
+    partitions.addColumn(new Column("id", Type.INT4));
+    partitions.setPartitionsType(CatalogProtos.PartitionsType.LIST);
+
+    partitions.addSpecifier(new Specifier("sub_part1", "Seoul,서울"));
+    partitions.addSpecifier(new Specifier("sub_part2", "Busan,부산"));
+
+    TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+    desc.setPartitions(partitions);
+    assertFalse(catalog.existsTable(tableName));
+    catalog.addTable(desc);
+    assertTrue(catalog.existsTable(tableName));
+
+    TableDesc retrieved = catalog.getTableDesc(tableName);
+
+    assertEquals(retrieved.getName(), tableName);
+    assertEquals(retrieved.getPartitions().getPartitionsType(), CatalogProtos.PartitionsType.LIST);
+    assertEquals(retrieved.getPartitions().getColumn(0).getColumnName(), "id");
+    assertEquals(retrieved.getPartitions().getSpecifiers().get(0).getName(),
+        "sub_part1");
+    assertEquals(retrieved.getPartitions().getSpecifiers().get(0).getExpressions(),
+        "Seoul,서울");
+    assertEquals(retrieved.getPartitions().getSpecifiers().get(1).getName(),
+        "sub_part2");
+    assertEquals(retrieved.getPartitions().getSpecifiers().get(1).getExpressions(),
+        "Busan,부산");
+
+    catalog.deleteTable(tableName);
+    assertFalse(catalog.existsTable(tableName));
+  }
+
+  @Test
+  public final void testAddAndDeleteTablePartitionByRange() throws Exception {
+    Schema schema = new Schema();
+    schema.addColumn("id", Type.INT4)
+        .addColumn("name", Type.TEXT)
+        .addColumn("age", Type.INT4)
+        .addColumn("score", Type.FLOAT8);
+
+    String tableName = "addedtable";
+    Options opts = new Options();
+    opts.put("file.delimiter", ",");
+    TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+    Partitions partitions = new Partitions();
+    partitions.addColumn(new Column("id", Type.INT4));
+    partitions.setPartitionsType(CatalogProtos.PartitionsType.RANGE);
+
+    partitions.addSpecifier(new Specifier("sub_part1", "2"));
+    partitions.addSpecifier(new Specifier("sub_part2", "5"));
+    partitions.addSpecifier(new Specifier("sub_part3"));
+
+    TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+    desc.setPartitions(partitions);
+    assertFalse(catalog.existsTable(tableName));
+    catalog.addTable(desc);
+    assertTrue(catalog.existsTable(tableName));
+
+    TableDesc retrieved = catalog.getTableDesc(tableName);
+
+    assertEquals(retrieved.getName(), tableName);
+    assertEquals(retrieved.getPartitions().getPartitionsType(), CatalogProtos.PartitionsType.RANGE);
+    assertEquals(retrieved.getPartitions().getColumn(0).getColumnName(), "id");
+    assertEquals(retrieved.getPartitions().getSpecifiers().get(0).getName(),
+        "sub_part1");
+    assertEquals(retrieved.getPartitions().getSpecifiers().get(0).getExpressions(),
+        "2");
+    assertEquals(retrieved.getPartitions().getSpecifiers().get(1).getName(),
+        "sub_part2");
+    assertEquals(retrieved.getPartitions().getSpecifiers().get(1).getExpressions(),
+        "5");
+    assertEquals(retrieved.getPartitions().getSpecifiers().get(2).getName(),
+        "sub_part3");
+    assertEquals(retrieved.getPartitions().getSpecifiers().get(2).getExpressions(),
+        "");
+
+    catalog.deleteTable(tableName);
+    assertFalse(catalog.existsTable(tableName));
+  }
+
+  @Test
+  public final void testAddAndDeleteTablePartitionByColumn() throws Exception {
+    Schema schema = new Schema();
+    schema.addColumn("id", Type.INT4)
+        .addColumn("name", Type.TEXT)
+        .addColumn("age", Type.INT4)
+        .addColumn("score", Type.FLOAT8);
+
+    String tableName = "addedtable";
+    Options opts = new Options();
+    opts.put("file.delimiter", ",");
+    TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+    Partitions partitions = new Partitions();
+    partitions.addColumn(new Column("id", Type.INT4));
+    partitions.setPartitionsType(CatalogProtos.PartitionsType.COLUMN);
+
+    TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+    desc.setPartitions(partitions);
+    assertFalse(catalog.existsTable(tableName));
+    catalog.addTable(desc);
+    assertTrue(catalog.existsTable(tableName));
+
+    TableDesc retrieved = catalog.getTableDesc(tableName);
+
+    assertEquals(retrieved.getName(), tableName);
+    assertEquals(retrieved.getPartitions().getPartitionsType(), CatalogProtos.PartitionsType.COLUMN);
+    assertEquals(retrieved.getPartitions().getColumn(0).getColumnName(), "id");
+
+    catalog.deleteTable(tableName);
+    assertFalse(catalog.existsTable(tableName));
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java
index 260b4c7..d3671b3 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java
@@ -22,6 +22,9 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.catalog.partition.Partitions;
+import org.apache.tajo.catalog.partition.Specifier;
+import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.catalog.proto.CatalogProtos.StoreType;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.catalog.store.AbstractDBStore;
@@ -219,4 +222,175 @@ public class TestDBStore {
           s2.getColumn(i).getColumnName());
     }
   }
+
+  @Test
+  public final void testAddAndDeleteTablePartitionByHash1() throws Exception {
+    Schema schema = new Schema();
+    schema.addColumn("id", Type.INT4)
+        .addColumn("name", Type.TEXT)
+        .addColumn("age", Type.INT4)
+        .addColumn("score", Type.FLOAT8);
+
+    String tableName = "addedtable";
+    Options opts = new Options();
+    opts.put("file.delimiter", ",");
+    TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+    Partitions partitions = new Partitions();
+    partitions.addColumn(new Column("id", Type.INT4));
+    partitions.setPartitionsType(CatalogProtos.PartitionsType.HASH);
+    partitions.setNumPartitions(2);
+
+    TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+    desc.setPartitions(partitions);
+    assertFalse(store.existTable(tableName));
+    store.addTable(desc);
+    assertTrue(store.existTable(tableName));
+
+    TableDesc retrieved = store.getTable(tableName);
+
+    // Schema order check
+    assertSchemaOrder(desc.getSchema(), retrieved.getSchema());
+    store.deleteTable(tableName);
+    assertFalse(store.existTable(tableName));
+  }
+
+  @Test
+  public final void testAddAndDeleteTablePartitionByHash2() throws Exception {
+    Schema schema = new Schema();
+    schema.addColumn("id", Type.INT4)
+        .addColumn("name", Type.TEXT)
+        .addColumn("age", Type.INT4)
+        .addColumn("score", Type.FLOAT8);
+
+    String tableName = "addedtable";
+    Options opts = new Options();
+    opts.put("file.delimiter", ",");
+    TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+    Partitions partitions = new Partitions();
+    partitions.addColumn(new Column("id", Type.INT4));
+    partitions.setPartitionsType(CatalogProtos.PartitionsType.HASH);
+    partitions.setNumPartitions(2);
+
+    partitions.addSpecifier(new Specifier("sub_part1"));
+    partitions.addSpecifier(new Specifier("sub_part2"));
+    partitions.addSpecifier(new Specifier("sub_part3"));
+
+    TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+    desc.setPartitions(partitions);
+    assertFalse(store.existTable(tableName));
+    store.addTable(desc);
+    assertTrue(store.existTable(tableName));
+
+    TableDesc retrieved = store.getTable(tableName);
+
+    // Schema order check
+    assertSchemaOrder(desc.getSchema(), retrieved.getSchema());
+    store.deleteTable(tableName);
+    assertFalse(store.existTable(tableName));
+  }
+
+  @Test
+  public final void testAddAndDeleteTablePartitionByList() throws Exception {
+    Schema schema = new Schema();
+    schema.addColumn("id", Type.INT4)
+        .addColumn("name", Type.TEXT)
+        .addColumn("age", Type.INT4)
+        .addColumn("score", Type.FLOAT8);
+
+    String tableName = "addedtable";
+    Options opts = new Options();
+    opts.put("file.delimiter", ",");
+    TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+    Partitions partitions = new Partitions();
+    partitions.addColumn(new Column("id", Type.INT4));
+    partitions.setPartitionsType(CatalogProtos.PartitionsType.LIST);
+
+    partitions.addSpecifier(new Specifier("sub_part1", "Seoul,서울"));
+    partitions.addSpecifier(new Specifier("sub_part2", "Busan,부산"));
+
+    TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+    desc.setPartitions(partitions);
+    assertFalse(store.existTable(tableName));
+    store.addTable(desc);
+    assertTrue(store.existTable(tableName));
+
+    TableDesc retrieved = store.getTable(tableName);
+
+    // Schema order check
+    assertSchemaOrder(desc.getSchema(), retrieved.getSchema());
+    store.deleteTable(tableName);
+    assertFalse(store.existTable(tableName));
+  }
+
+  @Test
+  public final void testAddAndDeleteTablePartitionByRange() throws Exception {
+    Schema schema = new Schema();
+    schema.addColumn("id", Type.INT4)
+        .addColumn("name", Type.TEXT)
+        .addColumn("age", Type.INT4)
+        .addColumn("score", Type.FLOAT8);
+
+    String tableName = "addedtable";
+    Options opts = new Options();
+    opts.put("file.delimiter", ",");
+    TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+    Partitions partitions = new Partitions();
+    partitions.addColumn(new Column("id", Type.INT4));
+    partitions.setPartitionsType(CatalogProtos.PartitionsType.RANGE);
+
+    partitions.addSpecifier(new Specifier("sub_part1", "2"));
+    partitions.addSpecifier(new Specifier("sub_part2", "5"));
+    partitions.addSpecifier(new Specifier("sub_part3"));
+
+    TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+    desc.setPartitions(partitions);
+    assertFalse(store.existTable(tableName));
+    store.addTable(desc);
+    assertTrue(store.existTable(tableName));
+
+    TableDesc retrieved = store.getTable(tableName);
+
+    // Schema order check
+    assertSchemaOrder(desc.getSchema(), retrieved.getSchema());
+    store.deleteTable(tableName);
+    assertFalse(store.existTable(tableName));
+  }
+
+  @Test
+  public final void testAddAndDeleteTablePartitionByColumn() throws Exception {
+    Schema schema = new Schema();
+    schema.addColumn("id", Type.INT4)
+        .addColumn("name", Type.TEXT)
+        .addColumn("age", Type.INT4)
+        .addColumn("score", Type.FLOAT8);
+
+    String tableName = "addedtable";
+    Options opts = new Options();
+    opts.put("file.delimiter", ",");
+    TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+    Partitions partitions = new Partitions();
+    partitions.addColumn(new Column("id", Type.INT4));
+    partitions.setPartitionsType(CatalogProtos.PartitionsType.COLUMN);
+
+    TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+    desc.setPartitions(partitions);
+    assertFalse(store.existTable(tableName));
+    store.addTable(desc);
+    assertTrue(store.existTable(tableName));
+
+    TableDesc retrieved = store.getTable(tableName);
+
+    // Schema order check
+    assertSchemaOrder(desc.getSchema(), retrieved.getSchema());
+    store.deleteTable(tableName);
+    assertFalse(store.existTable(tableName));
+  }
+
+
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java
index c94260f..58eabfd 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java
@@ -27,8 +27,10 @@ import org.apache.tajo.QueryId;
 import org.apache.tajo.QueryIdFactory;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.TajoProtos.QueryState;
+import org.apache.tajo.algebra.CreateTable;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.TableDesc;
+import org.apache.tajo.catalog.partition.Specifier;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.client.QueryStatus;
 import org.apache.tajo.client.TajoClient;
@@ -463,6 +465,40 @@ public class TajoCli {
       }
       sb.append("\n");
     }
+
+    sb.append("\n");
+    sb.append("Partitions: \n");
+    if (desc.getPartitions() != null) {
+      sb.append("type:").append(desc.getPartitions().getPartitionsType().name()).append("\n");
+      if (desc.getPartitions().getNumPartitions() > 0)
+        sb.append("numbers:").append(desc.getPartitions().getNumPartitions()).append("\n");
+
+      sb.append("columns:").append("\n");
+      for(Column eachColumn: desc.getPartitions().getColumns()) {
+        sb.append("  ");
+        sb.append(eachColumn.getColumnName()).append("\t").append(eachColumn.getDataType().getType());
+        if (eachColumn.getDataType().hasLength()) {
+          sb.append("(").append(eachColumn.getDataType().getLength()).append(")");
+        }
+        sb.append("\n");
+      }
+
+      if (desc.getPartitions().getSpecifiers() != null) {
+        sb.append("specifier:").append("\n");
+        for(Specifier specifier :desc.getPartitions().getSpecifiers()) {
+          sb.append("  ");
+          sb.append("name:").append(specifier.getName());
+          if (!specifier.getExpressions().equals("")) {
+            sb.append(", expressions:").append(specifier.getExpressions());
+          } else {
+            if (desc.getPartitions().getPartitionsType().name().equals(CreateTable.PartitionType.RANGE))
+              sb.append(" expressions: MAXVALUE");
+          }
+          sb.append("\n");
+        }
+      }
+    }
+
     return sb.toString();
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
index 4a305ae..5bba89b 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
@@ -222,6 +222,18 @@ public class LogicalPlan {
         return ensureUniqueColumn(candidates);
       }
 
+      // Trying to find columns from schema in current block.
+      if (block.getSchema() != null) {
+        Column found = block.getSchema().getColumnByName(columnRef.getName());
+        if (found != null) {
+          candidates.add(found);
+        }
+      }
+
+      if (!candidates.isEmpty()) {
+        return ensureUniqueColumn(candidates);
+      }
+
       throw new VerifyException("ERROR: no such a column name "+ columnRef.getCanonicalName());
     }
   }
@@ -724,7 +736,6 @@ public class LogicalPlan {
         // add target to list if a target can be evaluated at this node
         List<Integer> newEvaluatedTargetIds = new ArrayList<Integer>();
         for (int i = 0; i < getTargetListNum(); i++) {
-
           if (getTarget(i) != null && !isTargetResolved(i)) {
             EvalNode expr = getTarget(i).getEvalTree();
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/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 79f02d1..b5f8d2f 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
@@ -30,6 +30,8 @@ import org.apache.hadoop.fs.Path;
 import org.apache.tajo.algebra.*;
 import org.apache.tajo.algebra.CreateTable.ColumnDefinition;
 import org.apache.tajo.catalog.*;
+import org.apache.tajo.catalog.partition.Partitions;
+import org.apache.tajo.catalog.partition.Specifier;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.DataType;
@@ -46,6 +48,7 @@ import org.apache.tajo.engine.planner.LogicalPlan.QueryBlock;
 import org.apache.tajo.engine.planner.logical.*;
 import org.apache.tajo.engine.utils.SchemaUtil;
 import org.apache.tajo.exception.InternalException;
+import org.apache.tajo.util.TUtil;
 
 import java.util.List;
 import java.util.Stack;
@@ -732,7 +735,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
   public LogicalNode visitCreateTable(PlanContext context, Stack<OpType> stack, CreateTable expr)
       throws PlanningException {
 
-     String tableName = expr.getTableName();
+    String tableName = expr.getTableName();
 
     if (expr.hasSubQuery()) {
       stack.add(OpType.CreateTable);
@@ -789,10 +792,125 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
         createTableNode.setPath(new Path(expr.getLocation()));
       }
 
+      if (expr.hasPartition()) {
+        createTableNode.setPartitions(convertTableElementsPartition(context, expr));
+      }
       return createTableNode;
     }
   }
 
+  /**
+   * convert table elements into Partition.
+   *
+   * @param context
+   * @param expr
+   * @return
+   * @throws PlanningException
+   */
+  private Partitions convertTableElementsPartition(PlanContext context,
+                                                   CreateTable expr) throws PlanningException {
+    Schema schema = convertTableElementsSchema(expr.getTableElements());
+    Partitions partitions = null;
+    List<Specifier> specifiers = null;
+    if (expr.hasPartition()) {
+      partitions = new Partitions();
+      specifiers = TUtil.newList();
+
+      partitions.setPartitionsType(CatalogProtos.PartitionsType.valueOf(expr.getPartition()
+          .getPartitionType().name()));
+
+      if (expr.getPartition().getPartitionType().equals(CreateTable.PartitionType.HASH)) {
+        CreateTable.HashPartition hashPartition = expr.getPartition();
+
+        partitions.setColumns(convertTableElementsColumns(expr.getTableElements()
+            , hashPartition.getColumns()));
+
+        if (hashPartition.getColumns() != null) {
+          if (hashPartition.getQuantifier() != null) {
+            String quantity = ((LiteralValue)hashPartition.getQuantifier()).getValue();
+            partitions.setNumPartitions(Integer.parseInt(quantity));
+          }
+
+          if (hashPartition.getSpecifiers() != null) {
+            for(CreateTable.PartitionSpecifier eachSpec: hashPartition.getSpecifiers()) {
+              specifiers.add(new Specifier(eachSpec.getName()));
+            }
+          }
+
+          if (specifiers.isEmpty() && partitions.getNumPartitions() > 0) {
+            for (int i = 0; i < partitions.getNumPartitions(); i++) {
+              String partitionName = partitions.getPartitionsType().name() + "_" + expr
+                  .getTableName() + "_" + i;
+              specifiers.add(new Specifier(partitionName));
+            }
+          }
+
+          if (!specifiers.isEmpty())
+            partitions.setSpecifiers(specifiers);
+        }
+      } else if (expr.getPartition().getPartitionType().equals(CreateTable.PartitionType.LIST)) {
+        CreateTable.ListPartition listPartition = expr.getPartition();
+
+        partitions.setColumns(convertTableElementsColumns(expr.getTableElements()
+            , listPartition.getColumns()));
+
+        if (listPartition.getSpecifiers() != null) {
+          StringBuffer sb = new StringBuffer();
+
+          for(CreateTable.ListPartitionSpecifier eachSpec: listPartition.getSpecifiers()) {
+            Specifier specifier = new Specifier(eachSpec.getName());
+            sb.delete(0, sb.length());
+            for(Expr eachExpr : eachSpec.getValueList().getValues()) {
+              context.block.setSchema(schema);
+              EvalNode eval = createEvalTree(context.plan, context.block, eachExpr);
+              if(sb.length() > 1)
+                sb.append(",");
+
+              sb.append(eval.toString());
+            }
+            specifier.setExpressions(sb.toString());
+            specifiers.add(specifier);
+          }
+          if (!specifiers.isEmpty())
+            partitions.setSpecifiers(specifiers);
+        }
+      } else if (expr.getPartition().getPartitionType().equals(CreateTable.PartitionType.RANGE)) {
+        CreateTable.RangePartition rangePartition = expr.getPartition();
+
+        partitions.setColumns(convertTableElementsColumns(expr.getTableElements()
+            , rangePartition.getColumns()));
+
+        if (rangePartition.getSpecifiers() != null) {
+          for(CreateTable.RangePartitionSpecifier eachSpec: rangePartition.getSpecifiers()) {
+            Specifier specifier = new Specifier();
+
+            if (eachSpec.getName() != null)
+              specifier.setName(eachSpec.getName());
+
+            if (eachSpec.getEnd() != null) {
+              context.block.setSchema(schema);
+              EvalNode eval = createEvalTree(context.plan, context.block, eachSpec.getEnd());
+              specifier.setExpressions(eval.toString());
+            }
+
+            if(eachSpec.isEndMaxValue()) {
+              specifier.setExpressions(null);
+            }
+            specifiers.add(specifier);
+          }
+          if (!specifiers.isEmpty())
+            partitions.setSpecifiers(specifiers);
+        }
+      } else if (expr.getPartition().getPartitionType().equals(CreateTable.PartitionType.COLUMN)) {
+        CreateTable.ColumnPartition columnPartition = expr.getPartition();
+
+        partitions.setColumns(convertTableElementsColumns(expr.getTableElements()
+            , columnPartition.getColumns()));
+      }
+    }
+
+    return partitions;
+  }
 
 
   /**
@@ -811,6 +929,21 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     return schema;
   }
 
+  private List<Column> convertTableElementsColumns(CreateTable.ColumnDefinition [] elements,
+                                                   ColumnReferenceExpr[] references) {
+    List<Column> columnList = TUtil.newList();
+
+    for(CreateTable.ColumnDefinition columnDefinition: elements) {
+      for(ColumnReferenceExpr eachReference: references) {
+        if (columnDefinition.getColumnName().equalsIgnoreCase(eachReference.getName())) {
+          columnList.add(convertColumn(columnDefinition));
+        }
+      }
+    }
+
+    return columnList;
+  }
+
   private DataType convertDataType(org.apache.tajo.algebra.DataType dataType) {
     TajoDataTypes.Type type = TajoDataTypes.Type.valueOf(dataType.getTypeName());
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
index 50656c5..942309d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
@@ -23,6 +23,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Options;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.partition.Partitions;
 import org.apache.tajo.catalog.proto.CatalogProtos.StoreType;
 import org.apache.tajo.engine.planner.PlanString;
 import org.apache.tajo.util.TUtil;
@@ -35,6 +36,7 @@ public class CreateTableNode extends LogicalNode implements Cloneable {
   @Expose private Path path;
   @Expose private Options options;
   @Expose private boolean external;
+  @Expose private Partitions partitions;
 
   public CreateTableNode(int pid, String tableName, Schema schema) {
     super(pid, NodeType.CREATE_TABLE);
@@ -90,6 +92,17 @@ public class CreateTableNode extends LogicalNode implements Cloneable {
     this.external = external;
   }
 
+  public Partitions getPartitions() {
+    return partitions;
+  }
+
+  public void setPartitions(Partitions partitions) {
+    this.partitions = partitions;
+  }
+
+  public boolean hasPartition() {
+    return this.partitions != null;
+  }
 
   @Override
   public PlanString getPlanString() {
@@ -107,7 +120,8 @@ public class CreateTableNode extends LogicalNode implements Cloneable {
           && this.external == other.external
           && TUtil.checkEquals(path, other.path)
           && TUtil.checkEquals(options, other.options)
-          && TUtil.checkEquals(partitionKeys, other.partitionKeys);
+          && TUtil.checkEquals(partitionKeys, other.partitionKeys)
+          && TUtil.checkEquals(partitions, other.partitions);
     } else {
       return false;
     }
@@ -123,6 +137,7 @@ public class CreateTableNode extends LogicalNode implements Cloneable {
     store.path = path != null ? new Path(path.toString()) : null;
     store.partitionKeys = partitionKeys != null ? partitionKeys.clone() : null;
     store.options = (Options) (options != null ? options.clone() : null);
+    store.partitions = (Partitions) (partitions != null ? partitions.clone() : null);
     return store;
   }
   
@@ -142,6 +157,7 @@ public class CreateTableNode extends LogicalNode implements Cloneable {
     sb.append(",\"storeType\": \"" + this.storageType);
     sb.append(",\"path\" : \"" + this.path).append("\",");
     sb.append(",\"external\" : \"" + this.external).append("\",");
+    sb.append(",\"partitions\" : \"" + this.partitions).append("\",");
     
     sb.append("\n  \"out schema\": ").append(getOutSchema()).append(",")
     .append("\n  \"in schema\": ").append(getInSchema())

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
index 94447c0..b2bd937 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
@@ -22,6 +22,7 @@ import com.google.common.base.Preconditions;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Options;
+import org.apache.tajo.catalog.partition.Partitions;
 import org.apache.tajo.engine.planner.PlanString;
 import org.apache.tajo.util.TUtil;
 
@@ -38,12 +39,19 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
   @Expose private Options options;
   @Expose private boolean isCreatedTable = false;
   @Expose private boolean isOverwritten = false;
+  @Expose private Partitions partitions;
 
   public StoreTableNode(int pid, String tableName) {
     super(pid, NodeType.STORE);
     this.tableName = tableName;
   }
 
+  public StoreTableNode(int pid, String tableName, Partitions partitions) {
+    super(pid, NodeType.STORE);
+    this.tableName = tableName;
+    this.partitions = partitions;
+  }
+
   public final String getTableName() {
     return this.tableName;
   }
@@ -101,6 +109,13 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
     return this.options;
   }
 
+  public Partitions getPartitions() {
+    return partitions;
+  }
+
+  public void setPartitions(Partitions partitions) {
+    this.partitions = partitions;
+  }
 
   @Override
   public PlanString getPlanString() {
@@ -131,6 +146,7 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
       eq = eq && TUtil.checkEquals(options, other.options);
       eq = eq && isCreatedTable == other.isCreatedTable;
       eq = eq && isOverwritten == other.isOverwritten;
+      eq = eq && TUtil.checkEquals(partitions, other.partitions);
       return eq;
     } else {
       return false;
@@ -147,6 +163,7 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
     store.options = options != null ? (Options) options.clone() : null;
     store.isCreatedTable = isCreatedTable;
     store.isOverwritten = isOverwritten;
+    store.partitions = partitions;
     return store;
   }
 
@@ -169,8 +186,13 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
     }
     
     sb.append("\n  \"out schema\": ").append(getOutSchema()).append(",")
-    .append("\n  \"in schema\": ").append(getInSchema())
-    .append("}");
+    .append("\n  \"in schema\": ").append(getInSchema());
+
+    if(partitions != null) {
+      sb.append(partitions.toString());
+    }
+
+    sb.append("}");
     
     return sb.toString() + "\n"
         + getChild().toString();

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/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 505fd71..4f18b11 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
@@ -32,6 +32,7 @@ import org.apache.tajo.algebra.Expr;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.catalog.exception.AlreadyExistsTableException;
 import org.apache.tajo.catalog.exception.NoSuchTableException;
+import org.apache.tajo.catalog.partition.Partitions;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.conf.TajoConf;
@@ -131,7 +132,7 @@ public class GlobalEngine extends AbstractService {
       }
 
       Expr planningContext = hiveQueryMode ? converter.parse(sql) : analyzer.parse(sql);
-      
+
       LogicalPlan plan = createLogicalPlan(planningContext);
       LogicalRootNode rootNode = plan.getRootBlock().getRoot();
 
@@ -253,10 +254,11 @@ public class GlobalEngine extends AbstractService {
     }
 
     return createTableOnDirectory(createTable.getTableName(), createTable.getSchema(), meta,
-        createTable.getPath(), true);
+        createTable.getPath(), true, createTable.getPartitions());
   }
 
-  public TableDesc createTableOnDirectory(String tableName, Schema schema, TableMeta meta, Path path, boolean isCreated)
+  public TableDesc createTableOnDirectory(String tableName, Schema schema, TableMeta meta,
+                                          Path path, boolean isCreated, Partitions partitions)
       throws IOException {
     if (catalog.existsTable(tableName)) {
       throw new AlreadyExistsTableException(tableName);
@@ -284,6 +286,7 @@ public class GlobalEngine extends AbstractService {
     stats.setNumBytes(totalSize);
     TableDesc desc = CatalogUtil.newTableDesc(tableName, schema, meta, path);
     desc.setStats(stats);
+    desc.setPartitions(partitions);
     catalog.addTable(desc);
 
     LOG.info("Table " + desc.getName() + " is created (" + desc.getStats().getNumBytes() + ")");

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMasterClientService.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
index d1faf4f..03cb4d0 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
@@ -32,6 +32,7 @@ import org.apache.tajo.TajoIdProtos;
 import org.apache.tajo.TajoProtos;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.catalog.exception.NoSuchTableException;
+import org.apache.tajo.catalog.partition.Partitions;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.conf.TajoConf.ConfVars;
 import org.apache.tajo.ipc.ClientProtos;
@@ -307,11 +308,12 @@ public class TajoMasterClientService extends AbstractService {
 
         Schema schema = new Schema(request.getSchema());
         TableMeta meta = new TableMeta(request.getMeta());
+        Partitions partitions = new Partitions(request.getPartitions());
 
         TableDesc desc;
         try {
-          desc = context.getGlobalEngine().createTableOnDirectory(request.getName(), schema, meta, path,
-              false);
+          desc = context.getGlobalEngine().createTableOnDirectory(request.getName(), schema,
+              meta, path, false, partitions);
         } catch (Exception e) {
           return TableResponse.newBuilder()
               .setResultCode(ResultCode.ERROR)

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/proto/ClientProtos.proto
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/proto/ClientProtos.proto b/tajo-core/tajo-core-backend/src/main/proto/ClientProtos.proto
index 89c40c8..dc9c905 100644
--- a/tajo-core/tajo-core-backend/src/main/proto/ClientProtos.proto
+++ b/tajo-core/tajo-core-backend/src/main/proto/ClientProtos.proto
@@ -124,6 +124,7 @@ message CreateTableRequest {
   required SchemaProto schema = 2;
   required TableProto meta = 3;
   required string path = 4;
+  optional PartitionsProto partitions = 5;
 }
 
 message AttachTableRequest {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestTajoClient.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestTajoClient.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestTajoClient.java
index bd62f40..8b06ebf 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestTajoClient.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestTajoClient.java
@@ -191,4 +191,126 @@ public class TestTajoClient {
     assertEquals(tableName1, desc.getName());
     assertTrue(desc.getStats().getNumBytes() > 0);
   }
+
+  @Test
+  public final void testCreateAndDropTablePartitionedHash1ByExecuteQuery() throws IOException,
+      ServiceException, SQLException {
+    TajoConf conf = cluster.getConfiguration();
+    final String tableName = "testCreateAndDropTablePartitionedHash1";
+
+    assertFalse(client.existTable(tableName));
+
+    String sql = "create table " + tableName + " (deptname text, score int4)";
+    sql += " PARTITION BY HASH (deptname)";
+    sql += " (PARTITION sub_part1, PARTITION sub_part2, PARTITION sub_part3)";
+
+    client.updateQuery(sql);
+    assertTrue(client.existTable(tableName));
+
+    Path tablePath = client.getTableDesc(tableName).getPath();
+    FileSystem hdfs = tablePath.getFileSystem(conf);
+    assertTrue(hdfs.exists(tablePath));
+
+    client.updateQuery("drop table " + tableName);
+    assertFalse(client.existTable(tableName));
+    assertFalse(hdfs.exists(tablePath));
+  }
+
+  @Test
+  public final void testCreateAndDropTablePartitionedHash2ByExecuteQuery() throws IOException,
+      ServiceException, SQLException {
+    TajoConf conf = cluster.getConfiguration();
+    final String tableName = "testCreateAndDropTablePartitionedHash2";
+
+    assertFalse(client.existTable(tableName));
+
+    String sql = "create table " + tableName + " (deptname text, score int4)";
+    sql += "PARTITION BY HASH (deptname)";
+    sql += "PARTITIONS 2";
+
+    client.updateQuery(sql);
+    assertTrue(client.existTable(tableName));
+
+    Path tablePath = client.getTableDesc(tableName).getPath();
+    FileSystem hdfs = tablePath.getFileSystem(conf);
+    assertTrue(hdfs.exists(tablePath));
+
+    client.updateQuery("drop table " + tableName);
+    assertFalse(client.existTable(tableName));
+    assertFalse(hdfs.exists(tablePath));
+  }
+
+  @Test
+  public final void testCreateAndDropTablePartitionedListByExecuteQuery() throws IOException,
+      ServiceException, SQLException {
+    TajoConf conf = cluster.getConfiguration();
+    final String tableName = "testCreateAndDropTablePartitionedList";
+
+    assertFalse(client.existTable(tableName));
+
+    String sql = "create table " + tableName + " (deptname text, score int4)";
+    sql += "PARTITION BY LIST (deptname)";
+    sql += "( PARTITION sub_part1 VALUES('r&d', 'design'),";
+    sql += "PARTITION sub_part2 VALUES('sales', 'hr') )";
+
+    client.updateQuery(sql);
+    assertTrue(client.existTable(tableName));
+
+    Path tablePath = client.getTableDesc(tableName).getPath();
+    FileSystem hdfs = tablePath.getFileSystem(conf);
+    assertTrue(hdfs.exists(tablePath));
+
+    client.updateQuery("drop table " + tableName);
+    assertFalse(client.existTable(tableName));
+    assertFalse(hdfs.exists(tablePath));
+  }
+
+  @Test
+  public final void testCreateAndDropTablePartitionedRangeByExecuteQuery() throws IOException,
+      ServiceException, SQLException {
+    TajoConf conf = cluster.getConfiguration();
+    final String tableName = "testCreateAndDropTablePartitionedRange";
+
+    assertFalse(client.existTable(tableName));
+
+    String sql = "create table " + tableName + " (deptname text, score int4)";
+    sql += "PARTITION BY RANGE (score)";
+    sql += "( PARTITION sub_part1 VALUES LESS THAN (2),";
+    sql += "PARTITION sub_part2 VALUES LESS THAN (5),";
+    sql += "PARTITION sub_part2 VALUES LESS THAN (MAXVALUE) )";
+
+    client.updateQuery(sql);
+    assertTrue(client.existTable(tableName));
+
+    Path tablePath = client.getTableDesc(tableName).getPath();
+    FileSystem hdfs = tablePath.getFileSystem(conf);
+    assertTrue(hdfs.exists(tablePath));
+
+    client.updateQuery("drop table " + tableName);
+    assertFalse(client.existTable(tableName));
+    assertFalse(hdfs.exists(tablePath));
+  }
+  @Test
+  public final void testCreateAndDropTablePartitionedColumnByExecuteQuery() throws IOException,
+      ServiceException, SQLException {
+    TajoConf conf = cluster.getConfiguration();
+    final String tableName = "testCreateAndDropTablePartitionedColumn";
+
+    assertFalse(client.existTable(tableName));
+
+    String sql = "create table " + tableName + " (deptname text, score int4)";
+    sql += "PARTITION BY COLUMN (deptname)";
+
+    client.updateQuery(sql);
+    assertTrue(client.existTable(tableName));
+
+    Path tablePath = client.getTableDesc(tableName).getPath();
+    FileSystem hdfs = tablePath.getFileSystem(conf);
+    assertTrue(hdfs.exists(tablePath));
+
+    client.updateQuery("drop table " + tableName);
+    assertFalse(client.existTable(tableName));
+    assertFalse(hdfs.exists(tablePath));
+  }
+
 }