From 4451cd683d6c6b3fb14d5ca79f25c616f63069d4 Mon Sep 17 00:00:00 2001 From: Laksh Singla Date: Mon, 29 Apr 2024 19:27:46 +0530 Subject: [PATCH 1/3] init --- .../join/table/IndexedTableJoinMatcher.java | 15 ++------------- .../join/table/RowBasedIndexBuilder.java | 7 +++++++ .../sql/calcite/CalciteNestedDataQueryTest.java | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/segment/join/table/IndexedTableJoinMatcher.java b/processing/src/main/java/org/apache/druid/segment/join/table/IndexedTableJoinMatcher.java index f96e4260f8e3..4d2b5aef5f96 100644 --- a/processing/src/main/java/org/apache/druid/segment/join/table/IndexedTableJoinMatcher.java +++ b/processing/src/main/java/org/apache/druid/segment/join/table/IndexedTableJoinMatcher.java @@ -517,19 +517,8 @@ public ConditionMatcher makeArrayProcessor( @Override public ConditionMatcher makeComplexProcessor(BaseObjectColumnValueSelector selector) { - return new ConditionMatcher() - { - @Override - public int matchSingleRow() - { - return NO_CONDITION_MATCH; - } - - @Override - public IntSortedSet match() - { - return IntSortedSets.EMPTY_SET; - } + return () -> { + throw new QueryUnsupportedException("Joining against COMPLEX columns is not supported."); }; } diff --git a/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexBuilder.java b/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexBuilder.java index 5574f607e83d..6724d1a5f499 100644 --- a/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexBuilder.java +++ b/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexBuilder.java @@ -26,6 +26,8 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectIterator; +import org.apache.druid.error.DruidException; +import org.apache.druid.error.InvalidInput; import org.apache.druid.java.util.common.ISE; import org.apache.druid.segment.DimensionHandlerUtils; import org.apache.druid.segment.column.ColumnType; @@ -62,6 +64,11 @@ public RowBasedIndexBuilder(ColumnType keyType) { this.keyType = keyType; + // Cannot build index on complex types, and non-primitive arrays + if (keyType.is(ValueType.COMPLEX) || keyType.isArray() && !keyType.isPrimitiveArray()) { + throw InvalidInput.exception("Cannot join on the columnType [%s]", keyType); + } + if (keyType.is(ValueType.LONG)) { // We're specializing the type even though we don't specialize usage in this class, for two reasons: // (1) It's still useful to reduce overall memory footprint. diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java index e93a602296d3..cb10e73ed6cb 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java @@ -32,6 +32,7 @@ import org.apache.druid.data.input.impl.LongDimensionSchema; import org.apache.druid.data.input.impl.StringDimensionSchema; import org.apache.druid.data.input.impl.TimestampSpec; +import org.apache.druid.error.DruidException; import org.apache.druid.error.DruidExceptionMatcher; import org.apache.druid.guice.DruidInjectorBuilder; import org.apache.druid.guice.NestedDataModule; @@ -80,6 +81,7 @@ import org.apache.druid.timeline.partition.LinearShardSpec; import org.hamcrest.CoreMatchers; import org.junit.internal.matchers.ThrowableMessageMatcher; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.util.Arrays; @@ -87,6 +89,8 @@ import java.util.List; import java.util.stream.Collectors; +import static org.junit.jupiter.api.Assertions.assertThrows; + @SqlTestFramework.SqlTestFrameWorkModule(NestedComponentSupplier.class) public class CalciteNestedDataQueryTest extends BaseCalciteQueryTest { @@ -5404,6 +5408,19 @@ public void testGroupByRootSingleTypeStringMixed1SparseNotNull() ); } + @Test + public void testJoinOnNestedColumnThrows() + { + DruidException e = Assertions.assertThrows(DruidException.class, () -> { + testQuery( + "SELECT * FROM druid.nested a INNER JOIN druid.nested b ON a.nester = b.nester", + ImmutableList.of(), + ImmutableList.of() + ); + }); + Assertions.assertEquals("Cannot join the columnType [COMPLEX]", e.getMessage()); + } + @Test public void testScanStringNotNullCast() { From 6bae0625952eb9106666a9a998a2d63aa4b5cd08 Mon Sep 17 00:00:00 2001 From: Laksh Singla Date: Mon, 29 Apr 2024 19:51:06 +0530 Subject: [PATCH 2/3] error message change --- .../apache/druid/segment/join/table/RowBasedIndexBuilder.java | 2 +- .../apache/druid/sql/calcite/CalciteNestedDataQueryTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexBuilder.java b/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexBuilder.java index 6724d1a5f499..abadd216c236 100644 --- a/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexBuilder.java +++ b/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexBuilder.java @@ -66,7 +66,7 @@ public RowBasedIndexBuilder(ColumnType keyType) // Cannot build index on complex types, and non-primitive arrays if (keyType.is(ValueType.COMPLEX) || keyType.isArray() && !keyType.isPrimitiveArray()) { - throw InvalidInput.exception("Cannot join on the columnType [%s]", keyType); + throw InvalidInput.exception("Cannot join when the join condition has column of type [%s]", keyType); } if (keyType.is(ValueType.LONG)) { diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java index cb10e73ed6cb..1fc879c95f68 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java @@ -5418,7 +5418,7 @@ public void testJoinOnNestedColumnThrows() ImmutableList.of() ); }); - Assertions.assertEquals("Cannot join the columnType [COMPLEX]", e.getMessage()); + Assertions.assertEquals("Cannot join when the join condition has column of type [COMPLEX]", e.getMessage()); } @Test From 9380aad4d21e91abce9933d69c2b3919d734ba9a Mon Sep 17 00:00:00 2001 From: Laksh Singla Date: Mon, 29 Apr 2024 21:31:13 +0530 Subject: [PATCH 3/3] intellij, test --- .../join/table/IndexedTableJoinMatcher.java | 15 +++++++++++++-- .../segment/join/table/RowBasedIndexBuilder.java | 1 - .../sql/calcite/CalciteNestedDataQueryTest.java | 2 -- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/segment/join/table/IndexedTableJoinMatcher.java b/processing/src/main/java/org/apache/druid/segment/join/table/IndexedTableJoinMatcher.java index 4d2b5aef5f96..f96e4260f8e3 100644 --- a/processing/src/main/java/org/apache/druid/segment/join/table/IndexedTableJoinMatcher.java +++ b/processing/src/main/java/org/apache/druid/segment/join/table/IndexedTableJoinMatcher.java @@ -517,8 +517,19 @@ public ConditionMatcher makeArrayProcessor( @Override public ConditionMatcher makeComplexProcessor(BaseObjectColumnValueSelector selector) { - return () -> { - throw new QueryUnsupportedException("Joining against COMPLEX columns is not supported."); + return new ConditionMatcher() + { + @Override + public int matchSingleRow() + { + return NO_CONDITION_MATCH; + } + + @Override + public IntSortedSet match() + { + return IntSortedSets.EMPTY_SET; + } }; } diff --git a/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexBuilder.java b/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexBuilder.java index abadd216c236..732039befc41 100644 --- a/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexBuilder.java +++ b/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexBuilder.java @@ -26,7 +26,6 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectIterator; -import org.apache.druid.error.DruidException; import org.apache.druid.error.InvalidInput; import org.apache.druid.java.util.common.ISE; import org.apache.druid.segment.DimensionHandlerUtils; diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java index 1fc879c95f68..eda86289d29d 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java @@ -89,8 +89,6 @@ import java.util.List; import java.util.stream.Collectors; -import static org.junit.jupiter.api.Assertions.assertThrows; - @SqlTestFramework.SqlTestFrameWorkModule(NestedComponentSupplier.class) public class CalciteNestedDataQueryTest extends BaseCalciteQueryTest {