From 882dc2dc66383d41867f18626443b6e2e81c8ea3 Mon Sep 17 00:00:00 2001 From: Aman Sinha Date: Sun, 13 Mar 2016 15:42:57 -0700 Subject: [PATCH] DRILL-4503: Write nulls as varchar when all_text_mode is enabled. --- .../exec/vector/complex/fn/JsonReader.java | 3 +- .../vector/complex/writer/TestJsonReader.java | 52 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java index 16095416a38..24493557445 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java @@ -402,7 +402,8 @@ private void writeDataAllText(MapWriter map, FieldSelection selection, boolean m handleString(parser, map, fieldName); break; case VALUE_NULL: - // do nothing as we don't have a type. + // since this method is only called for allTextMode, write nulls as varchar + map.varChar(fieldName); break; default: 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 c088e253d29..62894f1192c 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 @@ -597,4 +597,56 @@ public void drill_4032() throws Exception { os.close(); testNoResult("select t.col2.col3 from dfs_test.tmp.drill_4032 t"); } + + @Test + public void drill_4503() throws Exception { + try { + String dfs_temp = getDfsTestTmpSchemaLocation(); + File table_dir = new File(dfs_temp, "drill_4503"); + table_dir.mkdir(); + BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(new File(table_dir, "mostlynulls.json"))); + // Create an entire batch of {non-null-value, null} rows + for (int i = 0 ; i < 4096; i++) { + os.write("{\"a\": 5, \"b\": null}".getBytes()); + } + // Add a row with {int, string} values + os.write("{\"a\": 5, \"b\": \"Hello World\"}".getBytes()); + os.flush(); + os.close(); + + String query1 = "select a, b, count(*) as cnt from dfs_test.tmp.drill_4503 t group by a, b"; + // only 1 row with non-null value of b + String query2 = "select count(*) as cnt from dfs_test.tmp.drill_4503 t where b is not null"; + String query3 = "select max(a) as x, max(b) as y from dfs_test.tmp.drill_4503 t"; + + testBuilder() + .sqlQuery(query1) + .ordered() + .optionSettingQueriesForTestQuery("alter session set `store.json.all_text_mode` = true") + .baselineColumns("a", "b", "cnt") + .baselineValues("5", null, 4096L) + .baselineValues("5", "Hello World", 1L) + .go(); + + testBuilder() + .sqlQuery(query2) + .ordered() + .optionSettingQueriesForTestQuery("alter session set `store.json.all_text_mode` = true") + .baselineColumns("cnt") + .baselineValues(1L) + .go(); + + testBuilder() + .sqlQuery(query3) + .ordered() + .optionSettingQueriesForTestQuery("alter session set `store.json.all_text_mode` = true") + .baselineColumns("x", "y") + .baselineValues("5", "Hello World") + .go(); + + } finally { + testNoResult("alter session set `store.json.all_text_mode` = false"); + } + } + }