From 905312c6e40504cba58328849cbfaa1277b8378d Mon Sep 17 00:00:00 2001 From: mcherkasov Date: Mon, 25 Sep 2017 13:58:26 +0300 Subject: [PATCH] IGNITE-6360: NPE occurs if object with null indexed field is added --- .../processors/query/h2/database/InlineIndexHelper.java | 3 +++ .../query/h2/database/InlineIndexHelperTest.java | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/InlineIndexHelper.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/InlineIndexHelper.java index 1789ac843bf7a..aa53a3537764e 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/InlineIndexHelper.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/InlineIndexHelper.java @@ -383,6 +383,9 @@ private int tryCompareOptimized(long pageAddr, int off, int maxSize, Value v) { if (type == Value.NULL) return Integer.MIN_VALUE; + if (v == ValueNull.INSTANCE) + return fixSort(1, sortType()); + if (this.type != type) throw new UnsupportedOperationException("Invalid fast index type: " + type); diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/database/InlineIndexHelperTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/database/InlineIndexHelperTest.java index 68282185851a2..4a6988734093f 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/database/InlineIndexHelperTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/database/InlineIndexHelperTest.java @@ -207,7 +207,7 @@ private int putAndCompare(String v1, String v2, int maxSize) throws Exception { InlineIndexHelper ih = new InlineIndexHelper(Value.STRING, 1, 0, CompareMode.getInstance(null, 0)); - ih.put(pageAddr, off, ValueString.get(v1), maxSize); + ih.put(pageAddr, off, v1 == null ? ValueNull.INSTANCE : ValueString.get(v1), maxSize); Comparator comp = new Comparator() { @Override public int compare(Value o1, Value o2) { @@ -215,7 +215,7 @@ private int putAndCompare(String v1, String v2, int maxSize) throws Exception { } }; - return ih.compare(pageAddr, off, maxSize, ValueString.get(v2), comp); + return ih.compare(pageAddr, off, maxSize, v2 == null ? ValueNull.INSTANCE : ValueString.get(v2), comp); } finally { if (page != 0L) @@ -378,6 +378,10 @@ public void testBytes() throws Exception { /** */ public void testNull() throws Exception { testPutGet(ValueInt.get(-1), ValueNull.INSTANCE, ValueInt.get(3)); + testPutGet(ValueInt.get(-1), ValueNull.INSTANCE, ValueInt.get(3)); + + int maxSize = 3 + 2; // 2 ascii chars + 3 bytes header. + assertEquals(1, putAndCompare("aa", null, maxSize)); } /** */