diff --git a/be/src/exprs/expr-test.cc b/be/src/exprs/expr-test.cc index c293ff487..67bbe0a9e 100644 --- a/be/src/exprs/expr-test.cc +++ b/be/src/exprs/expr-test.cc @@ -270,7 +270,7 @@ class ExprTest : public testing::Test { return results; } - void TestNextDayFunction(){ + void TestNextDayFunction() { // Sequential test cases TestTimestampValue("next_day('2016-05-01','Sunday')", TimestampValue("2016-05-08 00:00:00", 19)); @@ -2231,6 +2231,16 @@ TEST_F(ExprTest, StringFunctions) { } } +TEST_F(ExprTest, LongReverse) { + static const int MAX_LEN = 2048; + string to_reverse(MAX_LEN, ' '), reversed(MAX_LEN, ' '); + for (int i = 0; i < MAX_LEN; ++i) { + to_reverse[i] = reversed[MAX_LEN - 1 - i] = 'a' + (rand() % 26); + TestStringValue("reverse('" + to_reverse.substr(0, i + 1) + "')", + reversed.substr(MAX_LEN - 1 - i)); + } +} + TEST_F(ExprTest, StringRegexpFunctions) { // Single group. TestStringValue("regexp_extract('abxcy1234a', 'a.x', 0)", "abx"); diff --git a/be/src/util/bit-util-test.cc b/be/src/util/bit-util-test.cc index 9bfd494b1..a7a1b8582 100644 --- a/be/src/util/bit-util-test.cc +++ b/be/src/util/bit-util-test.cc @@ -113,15 +113,23 @@ void TestByteSwapSimd_Unit(const int64_t CpuFlag) { } DCHECK(bswap_fptr != NULL); - uint8_t src_buf[buf_size]; - uint8_t dst_buf[buf_size]; - std::iota(src_buf, src_buf + buf_size, 0); - bswap_fptr(src_buf, dst_buf); + // IMPALA-4058: test that bswap_fptr works when it reads to o writes from memory with + // any alignment. + static const size_t MAX_ALIGNMENT = 64; + uint8_t src_buf[buf_size + MAX_ALIGNMENT]; + uint8_t dst_buf[buf_size + MAX_ALIGNMENT]; + std::iota(src_buf, src_buf + buf_size + MAX_ALIGNMENT, 1); + for (size_t i = 0; i < MAX_ALIGNMENT; ++i) { + for (size_t j = 0; j < MAX_ALIGNMENT; ++j) { + std::fill(dst_buf, dst_buf + buf_size + MAX_ALIGNMENT, 0); + bswap_fptr(src_buf + i, dst_buf + j); - // Validate the swap results. - for (int j = 0; j < buf_size; ++j) { - EXPECT_EQ(dst_buf[j], buf_size - j - 1); - EXPECT_EQ(dst_buf[j], src_buf[buf_size - j - 1]); + // Validate the swap results. + for (int k = 0; k < buf_size; ++k) { + EXPECT_EQ(dst_buf[k + j], 1 + i + buf_size - k - 1); + EXPECT_EQ(dst_buf[k + j], src_buf[i + buf_size - k - 1]); + } + } } } diff --git a/be/src/util/bit-util.cc b/be/src/util/bit-util.cc index 76224c8ea..c8a7318cc 100644 --- a/be/src/util/bit-util.cc +++ b/be/src/util/bit-util.cc @@ -155,10 +155,10 @@ inline void SimdByteSwap::ByteSwap256(const uint8_t* src, uint8_t* dst) { 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); _mm256_storeu_si256(reinterpret_cast<__m256i*>(dst), _mm256_shuffle_epi8( _mm256_loadu_si256(reinterpret_cast(src)), mask256i)); - __m128i part1 = *reinterpret_cast<__m128i*>(dst); - __m128i part2 = *reinterpret_cast<__m128i*>(dst + 16); - *reinterpret_cast<__m128i*>(dst) = part2; - *reinterpret_cast<__m128i*>(dst + 16) = part1; + const __m128i part1 = _mm_loadu_si128(reinterpret_cast<__m128i*>(dst)); + const __m128i part2 = _mm_loadu_si128(reinterpret_cast<__m128i*>(dst + 16)); + _mm_storeu_si128(reinterpret_cast<__m128i*>(dst), part2); + _mm_storeu_si128(reinterpret_cast<__m128i*>(dst + 16), part1); _mm256_zeroupper(); } diff --git a/testdata/workloads/functional-query/queries/QueryTest/exprs.test b/testdata/workloads/functional-query/queries/QueryTest/exprs.test index 106124721..5cf4c4346 100644 --- a/testdata/workloads/functional-query/queries/QueryTest/exprs.test +++ b/testdata/workloads/functional-query/queries/QueryTest/exprs.test @@ -2482,3 +2482,15 @@ select cast('1.23' as double), cast('.1.23' as float), cast('123.456.' as double ---- TYPES double,float,double,double,float,double ==== +---- QUERY +# IMPALA-4058: reverse assumed memory was 16-byte aligned; reverse 16, 17, 32, 33, and 64 +# byte strings +select reverse('123456789abcdef0'), reverse('123456789abcdef01'), + reverse('123456789abcdef0!@#$%^&*(ABCDEF)'), + reverse('123456789abcdef0!@#$%^&*(ABCDEF)`'), + reverse('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ345678901234') +---- RESULTS +'0fedcba987654321','10fedcba987654321',')FEDCBA(*&^%$#@!0fedcba987654321','`)FEDCBA(*&^%$#@!0fedcba987654321','432109876543ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba' +---- TYPES +STRING,STRING,STRING,STRING,STRING +====