You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by sm...@apache.org on 2014/09/30 23:29:27 UTC
[3/3] git commit: DRILL-1461: Repeated count fails on varchar.
DRILL-1461: Repeated count fails on varchar.
This patch also includes implementations for all of the repeated_contains methods for the basic JSON types.
Small change was made to the unit tests for JSON as the leftover ALL_TEXT_MODE option was causing failures if the test were run in a different order.
Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/a13fc39b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/a13fc39b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/a13fc39b
Branch: refs/heads/master
Commit: a13fc39b05addabb4328b9211aa897b8e0387dd0
Parents: 10e4847
Author: Jason Altekruse <al...@gmail.com>
Authored: Mon Sep 29 17:11:05 2014 -0700
Committer: Steven Phillips <sp...@maprtech.com>
Committed: Tue Sep 30 13:44:51 2014 -0700
----------------------------------------------------------------------
.../expr/fn/impl/SimpleRepeatedFunctions.java | 267 +++++++++++++++++++
.../vector/complex/writer/TestJsonReader.java | 22 ++
.../resources/parquet/alltypes_repeated.json | 110 +++++++-
.../store/json/json_basic_repeated_varchar.json | 4 +
4 files changed, 390 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/a13fc39b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/SimpleRepeatedFunctions.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/SimpleRepeatedFunctions.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/SimpleRepeatedFunctions.java
index cc4343e..64de402 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/SimpleRepeatedFunctions.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/SimpleRepeatedFunctions.java
@@ -21,11 +21,23 @@ import org.apache.drill.exec.expr.DrillSimpleFunc;
import org.apache.drill.exec.expr.annotations.FunctionTemplate;
import org.apache.drill.exec.expr.annotations.Output;
import org.apache.drill.exec.expr.annotations.Param;
+import org.apache.drill.exec.expr.annotations.Workspace;
import org.apache.drill.exec.expr.holders.BigIntHolder;
import org.apache.drill.exec.expr.holders.BitHolder;
+import org.apache.drill.exec.expr.holders.Float4Holder;
+import org.apache.drill.exec.expr.holders.Float8Holder;
import org.apache.drill.exec.expr.holders.IntHolder;
import org.apache.drill.exec.expr.holders.RepeatedBigIntHolder;
+import org.apache.drill.exec.expr.holders.RepeatedBitHolder;
+import org.apache.drill.exec.expr.holders.RepeatedFloat4Holder;
+import org.apache.drill.exec.expr.holders.RepeatedFloat8Holder;
import org.apache.drill.exec.expr.holders.RepeatedIntHolder;
+import org.apache.drill.exec.expr.holders.RepeatedListHolder;
+import org.apache.drill.exec.expr.holders.RepeatedMapHolder;
+import org.apache.drill.exec.expr.holders.RepeatedTinyIntHolder;
+import org.apache.drill.exec.expr.holders.RepeatedVarCharHolder;
+import org.apache.drill.exec.expr.holders.TinyIntHolder;
+import org.apache.drill.exec.expr.holders.VarCharHolder;
import org.apache.drill.exec.record.RecordBatch;
public class SimpleRepeatedFunctions {
@@ -33,6 +45,10 @@ public class SimpleRepeatedFunctions {
private SimpleRepeatedFunctions() {
}
+ // TODO - replace with a freemarker template and fill out the rest of the types
+ // focused on getting functions defined for JSON types as this is the primary format
+ // users are extracting repeated data out of currently
+
@FunctionTemplate(name = "repeated_count", scope = FunctionTemplate.FunctionScope.SIMPLE)
public static class RepeatedLengthBigInt implements DrillSimpleFunc {
@@ -50,6 +66,104 @@ public class SimpleRepeatedFunctions {
}
@FunctionTemplate(name = "repeated_count", scope = FunctionTemplate.FunctionScope.SIMPLE)
+ public static class RepeatedLengthTinyInt implements DrillSimpleFunc {
+
+ @Param
+ RepeatedTinyIntHolder input;
+ @Output
+ IntHolder out;
+
+ public void setup(RecordBatch b) {
+ }
+
+ public void eval() {
+ out.value = input.end - input.start;
+ }
+ }
+
+ // TODO - need to confirm that these work
+ @FunctionTemplate(name = "repeated_count", scope = FunctionTemplate.FunctionScope.SIMPLE)
+ public static class RepeatedLengthMap implements DrillSimpleFunc {
+
+ @Param
+ RepeatedMapHolder input;
+ @Output
+ IntHolder out;
+
+ public void setup(RecordBatch b) {
+ }
+
+ public void eval() {
+ out.value = input.end - input.start;
+ }
+ }
+
+ // TODO - need to confirm that these work
+ @FunctionTemplate(name = "repeated_count", scope = FunctionTemplate.FunctionScope.SIMPLE)
+ public static class RepeatedLengthList implements DrillSimpleFunc {
+
+ @Param
+ RepeatedListHolder input;
+ @Output
+ IntHolder out;
+
+ public void setup(RecordBatch b) {
+ }
+
+ public void eval() {
+ out.value = input.end - input.start;
+ }
+ }
+
+ @FunctionTemplate(name = "repeated_count", scope = FunctionTemplate.FunctionScope.SIMPLE)
+ public static class RepeatedLengthBit implements DrillSimpleFunc {
+
+ @Param
+ RepeatedBitHolder input;
+ @Output
+ IntHolder out;
+
+ public void setup(RecordBatch b) {
+ }
+
+ public void eval() {
+ out.value = input.end - input.start;
+ }
+ }
+
+ @FunctionTemplate(name = "repeated_count", scope = FunctionTemplate.FunctionScope.SIMPLE)
+ public static class RepeatedLengthFloat4 implements DrillSimpleFunc {
+
+ @Param
+ RepeatedFloat4Holder input;
+ @Output
+ IntHolder out;
+
+ public void setup(RecordBatch b) {
+ }
+
+ public void eval() {
+ out.value = input.end - input.start;
+ }
+ }
+
+ @FunctionTemplate(name = "repeated_count", scope = FunctionTemplate.FunctionScope.SIMPLE)
+ public static class RepeatedLengthFloat8 implements DrillSimpleFunc {
+
+ @Param
+ RepeatedFloat8Holder input;
+ @Output
+ IntHolder out;
+
+ public void setup(RecordBatch b) {
+ }
+
+ public void eval() {
+ out.value = input.end - input.start;
+ }
+ }
+
+ @FunctionTemplate(name = "repeated_count", scope = FunctionTemplate.FunctionScope.SIMPLE)
public static class RepeatedLengthInt implements DrillSimpleFunc {
@Param RepeatedIntHolder input;
@@ -63,6 +177,20 @@ public class SimpleRepeatedFunctions {
}
}
+ @FunctionTemplate(name = "repeated_count", scope = FunctionTemplate.FunctionScope.SIMPLE)
+ public static class RepeatedLengthVarChar implements DrillSimpleFunc {
+
+ @Param RepeatedVarCharHolder input;
+ @Output IntHolder out;
+
+ public void setup(RecordBatch b) {
+ }
+
+ public void eval() {
+ out.value = input.end - input.start;
+ }
+ }
+
@FunctionTemplate(name = "repeated_contains", scope = FunctionTemplate.FunctionScope.SIMPLE)
public static class ContainsBigInt implements DrillSimpleFunc {
@@ -74,6 +202,7 @@ public class SimpleRepeatedFunctions {
}
public void eval() {
+ out.value = 0;
for (int i = listToSearch.start; i < listToSearch.end; i++) {
if (listToSearch.vector.getAccessor().get(i) == targetValue.value) {
out.value = 1;
@@ -83,4 +212,142 @@ public class SimpleRepeatedFunctions {
}
}
+
+ @FunctionTemplate(name = "repeated_contains", scope = FunctionTemplate.FunctionScope.SIMPLE)
+ public static class ContainsInt implements DrillSimpleFunc {
+
+ @Param RepeatedIntHolder listToSearch;
+ @Param IntHolder targetValue;
+ @Output BitHolder out;
+
+ public void setup(RecordBatch b) {
+ }
+
+ public void eval() {
+ out.value = 0;
+ for (int i = listToSearch.start; i < listToSearch.end; i++) {
+ if (listToSearch.vector.getAccessor().get(i) == targetValue.value) {
+ out.value = 1;
+ break;
+ }
+ }
+ }
+
+ }
+
+ @FunctionTemplate(name = "repeated_contains", scope = FunctionTemplate.FunctionScope.SIMPLE)
+ public static class ContainsTinyInt implements DrillSimpleFunc {
+
+ @Param RepeatedTinyIntHolder listToSearch;
+ @Param TinyIntHolder targetValue;
+ @Output BitHolder out;
+
+ public void setup(RecordBatch b) {
+ }
+
+ public void eval() {
+ for (int i = listToSearch.start; i < listToSearch.end; i++) {
+ if (listToSearch.vector.getAccessor().get(i) == targetValue.value) {
+ out.value = 1;
+ break;
+ }
+ }
+ }
+
+ }
+
+ @FunctionTemplate(name = "repeated_contains", scope = FunctionTemplate.FunctionScope.SIMPLE)
+ public static class ContainsBit implements DrillSimpleFunc {
+
+ @Param RepeatedBitHolder listToSearch;
+ @Param BitHolder targetValue;
+ @Output BitHolder out;
+
+ public void setup(RecordBatch b) {
+ }
+
+ public void eval() {
+ out.value = 0;
+ for (int i = listToSearch.start; i < listToSearch.end; i++) {
+ if (listToSearch.vector.getAccessor().get(i) == targetValue.value) {
+ out.value = 1;
+ break;
+ }
+ }
+ }
+
+ }
+
+ @FunctionTemplate(name = "repeated_contains", scope = FunctionTemplate.FunctionScope.SIMPLE)
+ public static class ContainsFloat4 implements DrillSimpleFunc {
+
+ @Param RepeatedFloat4Holder listToSearch;
+ @Param Float4Holder targetValue;
+ @Output BitHolder out;
+
+ public void setup(RecordBatch b) {
+ }
+
+ public void eval() {
+ out.value = 0;
+ for (int i = listToSearch.start; i < listToSearch.end; i++) {
+ if (listToSearch.vector.getAccessor().get(i) == targetValue.value) {
+ out.value = 1;
+ break;
+ }
+ }
+ }
+
+ }
+
+ @FunctionTemplate(name = "repeated_contains", scope = FunctionTemplate.FunctionScope.SIMPLE)
+ public static class ContainsFloat8 implements DrillSimpleFunc {
+
+ @Param RepeatedFloat8Holder listToSearch;
+ @Param Float8Holder targetValue;
+ @Output BitHolder out;
+
+ public void setup(RecordBatch b) {
+ }
+
+ public void eval() {
+ out.value = 0;
+ for (int i = listToSearch.start; i < listToSearch.end; i++) {
+ if (listToSearch.vector.getAccessor().get(i) == targetValue.value) {
+ out.value = 1;
+ break;
+ }
+ }
+ }
+
+ }
+
+ @FunctionTemplate(name = "repeated_contains", scope = FunctionTemplate.FunctionScope.SIMPLE)
+ public static class ContainsVarChar implements DrillSimpleFunc {
+
+ @Param RepeatedVarCharHolder listToSearch;
+ @Param VarCharHolder targetValue;
+ @Workspace VarCharHolder currVal;
+
+ @Output BitHolder out;
+
+ public void setup(RecordBatch b) {
+ currVal = new VarCharHolder();
+ }
+
+ public void eval() {
+ for (int i = listToSearch.start; i < listToSearch.end; i++) {
+ out.value = 0;
+ listToSearch.vector.getAccessor().get(i, currVal);
+ if (org.apache.drill.exec.expr.fn.impl.ByteFunctionHelpers.compare(
+ currVal.buffer.memoryAddress(), currVal.start, currVal.end, targetValue.buffer.memoryAddress(), targetValue.start, targetValue.end) == 0 ) {
+ out.value = 1;
+ break;
+ }
+ }
+ }
+
+ }
+
+
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/a13fc39b/exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestJsonReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestJsonReader.java b/exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestJsonReader.java
index fd38bd3..f450e5d 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestJsonReader.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestJsonReader.java
@@ -105,6 +105,24 @@ public class TestJsonReader extends BaseTestQuery {
runTestsOnFile(filename, UserBitShared.QueryType.SQL, queries, rowCounts);
}
+ @Test
+ public void testRepeatedCount() throws Exception {
+ test("select repeated_count(str_list) from cp.`/store/json/json_basic_repeated_varchar.json`");
+ test("select repeated_count(INT_col) from cp.`/parquet/alltypes_repeated.json`");
+ test("select repeated_count(FLOAT4_col) from cp.`/parquet/alltypes_repeated.json`");
+ test("select repeated_count(VARCHAR_col) from cp.`/parquet/alltypes_repeated.json`");
+ test("select repeated_count(BIT_col) from cp.`/parquet/alltypes_repeated.json`");
+ }
+
+ @Test
+ public void testRepeatedContains() throws Exception {
+ test("select repeated_contains(str_list, 'asdf') from cp.`/store/json/json_basic_repeated_varchar.json`");
+ test("select repeated_contains(INT_col, -2147483648) from cp.`/parquet/alltypes_repeated.json`");
+ test("select repeated_contains(FLOAT4_col, -1000000000000.0) from cp.`/parquet/alltypes_repeated.json`");
+ test("select repeated_contains(VARCHAR_col, 'qwerty' ) from cp.`/parquet/alltypes_repeated.json`");
+ test("select repeated_contains(BIT_col, true) from cp.`/parquet/alltypes_repeated.json`");
+ test("select repeated_contains(BIT_col, false) from cp.`/parquet/alltypes_repeated.json`");
+ }
@Test
public void testSingleColumnRead_vector_fill_bug() throws Exception {
@@ -122,12 +140,14 @@ public class TestJsonReader extends BaseTestQuery {
runTestsOnFile(filename, UserBitShared.QueryType.SQL, queries, rowCounts);
}
+ @Test
public void testAllTextMode() throws Exception {
test("alter system set `store.json.all_text_mode` = true");
String[] queries = {"select * from cp.`/store/json/schema_change_int_to_string.json`"};
long[] rowCounts = {3};
String filename = "/store/json/schema_change_int_to_string.json";
runTestsOnFile(filename, UserBitShared.QueryType.SQL, queries, rowCounts);
+ test("alter system set `store.json.all_text_mode` = false");
}
@Test
@@ -153,6 +173,7 @@ public class TestJsonReader extends BaseTestQuery {
long[] rowCounts = {3};
String filename = "/store/json/null_where_list_expected.json";
runTestsOnFile(filename, UserBitShared.QueryType.SQL, queries, rowCounts);
+ test("alter system set `store.json.all_text_mode` = false");
}
@Test
@@ -162,6 +183,7 @@ public class TestJsonReader extends BaseTestQuery {
long[] rowCounts = {3};
String filename = "/store/json/null_where_map_expected.json";
runTestsOnFile(filename, UserBitShared.QueryType.SQL, queries, rowCounts);
+ test("alter system set `store.json.all_text_mode` = false");
}
// The project pushdown rule is correctly adding the projected columns to the scan, however it is not removing
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/a13fc39b/exec/java-exec/src/test/resources/parquet/alltypes_repeated.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/parquet/alltypes_repeated.json b/exec/java-exec/src/test/resources/parquet/alltypes_repeated.json
index 927cb52..141c185 100644
--- a/exec/java-exec/src/test/resources/parquet/alltypes_repeated.json
+++ b/exec/java-exec/src/test/resources/parquet/alltypes_repeated.json
@@ -2,11 +2,11 @@
"TINYINT_col" : [ 1, 2, 3, 4, 5, -1, -2, -3, -4, -5, 10000, -10000 ],
"UINT1_col" : [ 1, 2, 3, 4, 5, 10000 ],
"UINT2_col" : [ 1, 2, 3, 4, 5, 10000 ],
- SMALLINT_col" : [ 1, 2, 3, 4, 5, -1, -2, -3, -4, -5, 100000, -100000 ],
+ "SMALLINT_col" : [ 1, 2, 3, 4, 5, -1, -2, -3, -4, -5, 100000, -100000 ],
"INT_col" : [ 1, 2, 3, 4, 5, -1, -2, -3, -4, -5, 2147483647, -2147483648 ],
"UINT4_col" : [ 1, 2, 3, 4, 5, 2147483700 ],
"FLOAT4_col" : [ 1.0, 2.0, 3.0, 4.0, 5.0, 1000000000000.0, -1000000000000.0 ],
- "TIME_col" : [ "2:30, "11:45", "12:00", 11:59", 23:59" ],
+ "TIME_col" : [ "2:30", "11:45", "12:00", "11:59", "23:59" ],
"DECIMAL9_col" : [ "1.0", "2.0", "3.0", "4.0", "5.0", "100.100", "0.0000001" ],
"BIGINT_col" : [ 1, 2, 3, 4, 5, 9223372036854775000, -9223372036854775000],
"UINT8_col" : [ "1", "2", "3", "4", "5", "9223372036854778000" ],
@@ -14,15 +14,99 @@
"DATE_col": [ "1995-01-01", "1995-01-02", "1995-01-03", "1995-01-04", "1995-01-05" ],
"TIMESTAMP_col" : [ "1995-01-01 01:00:00.000","1995-01-01 01:00:00.000", "1995-01-01 01:00:00.000", "1995-01-01 01:00:00.000" ],
"DECIMAL18_col" : ["123456789.000000000", "11.123456789", "0.100000000", "-0.100400000", "-987654321.123456789", "-2.030100000"],
- "INTERVALYEAR" :
- "INTERVALDAY" :
- "INTERVAL" :
- "DECIMAL28DENSE_col",
- "DECIMAL38DENSE_col",
- "DECIMAL38SPARSE_col",
- "DECIMAL28SPARSE_col",
- "VARBINARY_col",
- "VARCHAR_col",
- "VAR16CHAR_col",
- "BIT_col",
+ "INTERVALYEAR" : false,
+ "INTERVALDAY" : false,
+ "INTERVAL" : false,
+ "DECIMAL28DENSE_col" : false,
+ "DECIMAL38DENSE_col" : false,
+ "DECIMAL38SPARSE_col" : false,
+ "DECIMAL28SPARSE_col" : false,
+ "VARBINARY_col" : false,
+ "VARCHAR_col" : [ "a string", "asdf", "", "qwerty"],
+ "VAR16CHAR_col" : false,
+ "BIT_col" : [ false, true, false, false, true, false, false]
}
+{
+ "TINYINT_col" : [ 1, 2, 3, 4, 5, -1, -2 ],
+ "UINT1_col" : [ 1, 2, 3 ],
+ "UINT2_col" : [ 1, 2 ],
+ "SMALLINT_col" : [ 1, 2],
+ "INT_col" : [ 1, 2, 3, 4 ],
+ "UINT4_col" : [ 1],
+ "FLOAT4_col" : [ 1.0, 2.0, 3.0, 4.0],
+ "TIME_col" : [ "2:30", "11:45", "12:00"],
+ "DECIMAL9_col" : [ "1.0", "2.0", "3.0", "4.0", "5.0" ],
+ "BIGINT_col" : [ 1, 2, 3, 4, 5, 9223372036854775000],
+ "UINT8_col" : [ "1", "2", "3"],
+ "FLOAT8_col" : [ 1.0, 2.0, 3.0],
+ "DATE_col": [ "1995-01-01", "1995-01-02", "1995-01-03"],
+ "TIMESTAMP_col" : [ "1995-01-01 01:00:00.000","1995-01-01 01:00:00.000"],
+ "DECIMAL18_col" : ["123456789.000000000", "11.123456789", "0.100000000", "-0.100400000"],
+ "INTERVALYEAR" : false,
+ "INTERVALDAY" : false,
+ "INTERVAL" : false,
+ "DECIMAL28DENSE_col" : false,
+ "DECIMAL38DENSE_col" : false,
+ "DECIMAL38SPARSE_col" : false,
+ "DECIMAL28SPARSE_col" : false,
+ "VARBINARY_col" : false,
+ "VARCHAR_col" : [ "a string", "asdf", ""],
+ "VAR16CHAR_col" : false,
+ "BIT_col" : [ false, true, false, false, true, false, false]
+}
+{
+ "TINYINT_col" : [ 1, 2, 3, 4, 5, -1, -2 ],
+ "UINT1_col" : [ 1, 2, 3 ],
+ "UINT2_col" : [ 1, 2 ],
+ "SMALLINT_col" : [ 1, 2],
+ "INT_col" : [ 1, 2, 3, 4 ],
+ "UINT4_col" : [ 1],
+ "FLOAT4_col" : [ 1.0, 2.0, 3.0, 4.0],
+ "TIME_col" : [ "2:30", "11:45", "12:00"],
+ "DECIMAL9_col" : [ "1.0", "2.0", "3.0", "4.0", "5.0" ],
+ "BIGINT_col" : [ 1, 2, 3, 4, 5, 9223372036854775000],
+ "UINT8_col" : [ "1", "2", "3"],
+ "FLOAT8_col" : [ 1.0, 2.0, 3.0],
+ "DATE_col": [ "1995-01-01", "1995-01-02", "1995-01-03"],
+ "TIMESTAMP_col" : [ "1995-01-01 01:00:00.000","1995-01-01 01:00:00.000"],
+ "DECIMAL18_col" : ["123456789.000000000", "11.123456789", "0.100000000", "-0.100400000"],
+ "INTERVALYEAR" : false,
+ "INTERVALDAY" : false,
+ "INTERVAL" : false,
+ "DECIMAL28DENSE_col" : false,
+ "DECIMAL38DENSE_col" : false,
+ "DECIMAL38SPARSE_col" : false,
+ "DECIMAL28SPARSE_col" : false,
+ "VARBINARY_col" : false,
+ "VARCHAR_col" : [ "a string", "asdf", ""],
+ "VAR16CHAR_col" : false,
+ "BIT_col" : [ false, false, false, false, false]
+}
+{
+ "TINYINT_col" : [ 1, 2, 3, 4, 5, -1, -2 ],
+ "UINT1_col" : [ 1, 2, 3 ],
+ "UINT2_col" : [ 1, 2 ],
+ "SMALLINT_col" : [ 1, 2],
+ "INT_col" : [ 1, 2, 3, 4 ],
+ "UINT4_col" : [ 1],
+ "FLOAT4_col" : [ 1.0, 2.0, 3.0, 4.0],
+ "TIME_col" : [ "2:30", "11:45", "12:00"],
+ "DECIMAL9_col" : [ "1.0", "2.0", "3.0", "4.0", "5.0" ],
+ "BIGINT_col" : [ 1, 2, 3, 4, 5, 9223372036854775000],
+ "UINT8_col" : [ "1", "2", "3"],
+ "FLOAT8_col" : [ 1.0, 2.0, 3.0],
+ "DATE_col": [ "1995-01-01", "1995-01-02", "1995-01-03"],
+ "TIMESTAMP_col" : [ "1995-01-01 01:00:00.000","1995-01-01 01:00:00.000"],
+ "DECIMAL18_col" : ["123456789.000000000", "11.123456789", "0.100000000", "-0.100400000"],
+ "INTERVALYEAR" : false,
+ "INTERVALDAY" : false,
+ "INTERVAL" : false,
+ "DECIMAL28DENSE_col" : false,
+ "DECIMAL38DENSE_col" : false,
+ "DECIMAL38SPARSE_col" : false,
+ "DECIMAL28SPARSE_col" : false,
+ "VARBINARY_col" : false,
+ "VARCHAR_col" : [ "a string", "asdf", ""],
+ "VAR16CHAR_col" : false,
+ "BIT_col" : [ true, true, true]
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/a13fc39b/exec/java-exec/src/test/resources/store/json/json_basic_repeated_varchar.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/store/json/json_basic_repeated_varchar.json b/exec/java-exec/src/test/resources/store/json/json_basic_repeated_varchar.json
new file mode 100644
index 0000000..2b18a5e
--- /dev/null
+++ b/exec/java-exec/src/test/resources/store/json/json_basic_repeated_varchar.json
@@ -0,0 +1,4 @@
+{ "str_list" : ["asdf", "Doctors","Health & Medical","asdf", "1234asdf"] }
+{ "str_list" : ["Restaurants"] }
+{ "str_list" : ["asdf", "American (Traditional)","Restaurants"] }
+{ "str_list" : ["Restaurants"] }