diff --git a/core/trino-main/src/test/java/io/trino/sql/gen/BenchmarkPageProcessor.java b/core/trino-main/src/test/java/io/trino/sql/gen/BenchmarkPageProcessor.java index 394a0c64b296..62775fc986d4 100644 --- a/core/trino-main/src/test/java/io/trino/sql/gen/BenchmarkPageProcessor.java +++ b/core/trino-main/src/test/java/io/trino/sql/gen/BenchmarkPageProcessor.java @@ -166,12 +166,24 @@ private static void project(int position, PageBuilder pageBuilder, Block extende private static boolean filter(int position, Block discountBlock, Block shipDateBlock, Block quantityBlock) { - return !shipDateBlock.isNull(position) && VARCHAR.getSlice(shipDateBlock, position).compareTo(MIN_SHIP_DATE) >= 0 && - !shipDateBlock.isNull(position) && VARCHAR.getSlice(shipDateBlock, position).compareTo(MAX_SHIP_DATE) < 0 && + return !shipDateBlock.isNull(position) && greaterThanOrEqual(shipDateBlock, position, MIN_SHIP_DATE) && + !shipDateBlock.isNull(position) && lessThan(shipDateBlock, position, MAX_SHIP_DATE) && !discountBlock.isNull(position) && DOUBLE.getDouble(discountBlock, position) >= 0.05 && !discountBlock.isNull(position) && DOUBLE.getDouble(discountBlock, position) <= 0.07 && !quantityBlock.isNull(position) && DOUBLE.getDouble(quantityBlock, position) < 24; } + + private static boolean lessThan(Block left, int leftPosition, Slice right) + { + int leftLength = left.getSliceLength(leftPosition); + return left.bytesCompare(leftPosition, 0, leftLength, right, 0, right.length()) < 0; + } + + private static boolean greaterThanOrEqual(Block left, int leftPosition, Slice right) + { + int leftLength = left.getSliceLength(leftPosition); + return left.bytesCompare(leftPosition, 0, leftLength, right, 0, right.length()) >= 0; + } } // where shipdate >= '1994-01-01' diff --git a/core/trino-spi/src/main/java/io/trino/spi/type/TypeOperators.java b/core/trino-spi/src/main/java/io/trino/spi/type/TypeOperators.java index d7424fe728b3..9dec200ae0cf 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/type/TypeOperators.java +++ b/core/trino-spi/src/main/java/io/trino/spi/type/TypeOperators.java @@ -315,6 +315,12 @@ private OperatorMethodHandle generateLessThanOperator(OperatorConvention operato if (operatorConvention.callingConvention().getArgumentConventions().equals(List.of(BLOCK_POSITION, BLOCK_POSITION))) { comparisonCallingConvention = simpleConvention(FAIL_ON_NULL, BLOCK_POSITION, BLOCK_POSITION); } + else if (operatorConvention.callingConvention().getArgumentConventions().equals(List.of(NEVER_NULL, BLOCK_POSITION))) { + comparisonCallingConvention = simpleConvention(FAIL_ON_NULL, NEVER_NULL, BLOCK_POSITION); + } + else if (operatorConvention.callingConvention().getArgumentConventions().equals(List.of(BLOCK_POSITION, NEVER_NULL))) { + comparisonCallingConvention = simpleConvention(FAIL_ON_NULL, BLOCK_POSITION, NEVER_NULL); + } else { comparisonCallingConvention = simpleConvention(FAIL_ON_NULL, NEVER_NULL, NEVER_NULL); } diff --git a/core/trino-spi/src/main/java/io/trino/spi/type/VarcharType.java b/core/trino-spi/src/main/java/io/trino/spi/type/VarcharType.java index ed3e0a24abfc..0e05f76a5fce 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/type/VarcharType.java +++ b/core/trino-spi/src/main/java/io/trino/spi/type/VarcharType.java @@ -283,4 +283,18 @@ private static long comparisonOperator(@BlockPosition Block leftBlock, @BlockInd int rightLength = rightBlock.getSliceLength(rightPosition); return leftBlock.compareTo(leftPosition, 0, leftLength, rightBlock, rightPosition, 0, rightLength); } + + @ScalarOperator(COMPARISON_UNORDERED_LAST) + private static long comparisonOperator(@BlockPosition Block leftBlock, @BlockIndex int leftPosition, Slice right) + { + int leftLength = leftBlock.getSliceLength(leftPosition); + return leftBlock.bytesCompare(leftPosition, 0, leftLength, right, 0, right.length()); + } + + @ScalarOperator(COMPARISON_UNORDERED_LAST) + private static long comparisonOperator(Slice left, @BlockPosition Block rightBlock, @BlockIndex int rightPosition) + { + int rightLength = rightBlock.getSliceLength(rightPosition); + return -rightBlock.bytesCompare(rightPosition, 0, rightLength, left, 0, left.length()); + } }