blob: cbe24b74236ff6ad119ffb6af0ed988c7f7b2936 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
#include "gandiva/gdv_function_stubs.h"
#include <gandiva/precompiled/testing.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "arrow/util/logging.h"
#include "gandiva/execution_context.h"
namespace gandiva {
TEST(TestGdvFnStubs, TestCrc32) {
gandiva::ExecutionContext ctx;
auto ctx_ptr = reinterpret_cast<int64_t>(&ctx);
EXPECT_EQ(gdv_fn_crc_32_utf8(ctx_ptr, "ABC", 3), 2743272264);
EXPECT_EQ(gdv_fn_crc_32_utf8(ctx_ptr, "Hello", 5), 4157704578);
EXPECT_EQ(gdv_fn_crc_32_utf8(ctx_ptr, "hive", 4), 3698179064);
EXPECT_EQ(gdv_fn_crc_32_utf8(ctx_ptr, "372189372123", 12), 2607335846);
EXPECT_EQ(gdv_fn_crc_32_utf8(ctx_ptr, "", 0), 0);
EXPECT_EQ(gdv_fn_crc_32_utf8(ctx_ptr, "-5", -5), 0);
EXPECT_THAT(ctx.get_error(), ::testing::HasSubstr("Input length can't be negative"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestCastVarbinaryNumeric) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
// tests for integer values as input
const char* out_str = gdv_fn_castVARBINARY_int32_int64(ctx_ptr, -46, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "-46");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARBINARY_int32_int64(ctx_ptr, 2147483647, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "2147483647");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARBINARY_int32_int64(ctx_ptr, -2147483647 - 1, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "-2147483648");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARBINARY_int32_int64(ctx_ptr, 0, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "0");
EXPECT_FALSE(ctx.has_error());
// test with required length less than actual buffer length
out_str = gdv_fn_castVARBINARY_int32_int64(ctx_ptr, 34567, 3, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "345");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARBINARY_int32_int64(ctx_ptr, 347, 0, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "");
EXPECT_FALSE(ctx.has_error());
gdv_fn_castVARBINARY_int32_int64(ctx_ptr, 347, -1, &out_len);
EXPECT_THAT(ctx.get_error(), ::testing::HasSubstr("Buffer length cannot be negative"));
ctx.Reset();
// tests for big integer values as input
out_str =
gdv_fn_castVARBINARY_int64_int64(ctx_ptr, 9223372036854775807LL, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "9223372036854775807");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARBINARY_int64_int64(ctx_ptr, -9223372036854775807LL - 1, 100,
&out_len);
EXPECT_EQ(std::string(out_str, out_len), "-9223372036854775808");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARBINARY_int64_int64(ctx_ptr, 0, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "0");
EXPECT_FALSE(ctx.has_error());
// test with required length less than actual buffer length
out_str = gdv_fn_castVARBINARY_int64_int64(ctx_ptr, 12345, 3, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "123");
EXPECT_FALSE(ctx.has_error());
}
TEST(TestGdvFnStubs, TestBase64Encode) {
gandiva::ExecutionContext ctx;
auto ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
auto value = gdv_fn_base64_encode_binary(ctx_ptr, "hello", 5, &out_len);
std::string out_value = std::string(value, out_len);
EXPECT_EQ(out_value, "aGVsbG8=");
value = gdv_fn_base64_encode_binary(ctx_ptr, "test", 4, &out_len);
out_value = std::string(value, out_len);
EXPECT_EQ(out_value, "dGVzdA==");
value = gdv_fn_base64_encode_binary(ctx_ptr, "hive", 4, &out_len);
out_value = std::string(value, out_len);
EXPECT_EQ(out_value, "aGl2ZQ==");
value = gdv_fn_base64_encode_binary(ctx_ptr, "", 0, &out_len);
out_value = std::string(value, out_len);
EXPECT_EQ(out_value, "");
value = gdv_fn_base64_encode_binary(ctx_ptr, "test", -5, &out_len);
out_value = std::string(value, out_len);
EXPECT_EQ(out_value, "");
EXPECT_THAT(ctx.get_error(), ::testing::HasSubstr("Buffer length cannot be negative"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestBase64Decode) {
gandiva::ExecutionContext ctx;
auto ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
auto value = gdv_fn_base64_decode_utf8(ctx_ptr, "aGVsbG8=", 8, &out_len);
std::string out_value = std::string(value, out_len);
EXPECT_EQ(out_value, "hello");
value = gdv_fn_base64_decode_utf8(ctx_ptr, "dGVzdA==", 8, &out_len);
out_value = std::string(value, out_len);
EXPECT_EQ(out_value, "test");
value = gdv_fn_base64_decode_utf8(ctx_ptr, "aGl2ZQ==", 8, &out_len);
out_value = std::string(value, out_len);
EXPECT_EQ(out_value, "hive");
value = gdv_fn_base64_decode_utf8(ctx_ptr, "", 0, &out_len);
out_value = std::string(value, out_len);
EXPECT_EQ(out_value, "");
value = gdv_fn_base64_decode_utf8(ctx_ptr, "test", -5, &out_len);
out_value = std::string(value, out_len);
EXPECT_EQ(out_value, "");
EXPECT_THAT(ctx.get_error(), ::testing::HasSubstr("Buffer length cannot be negative"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestCastINT) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
EXPECT_EQ(gdv_fn_castINT_utf8(ctx_ptr, "-45", 3), -45);
EXPECT_EQ(gdv_fn_castINT_utf8(ctx_ptr, "0", 1), 0);
EXPECT_EQ(gdv_fn_castINT_utf8(ctx_ptr, "2147483647", 10), 2147483647);
EXPECT_EQ(gdv_fn_castINT_utf8(ctx_ptr, "02147483647", 11), 2147483647);
EXPECT_EQ(gdv_fn_castINT_utf8(ctx_ptr, "-2147483648", 11), -2147483648LL);
EXPECT_EQ(gdv_fn_castINT_utf8(ctx_ptr, "-02147483648", 12), -2147483648LL);
EXPECT_EQ(gdv_fn_castINT_utf8(ctx_ptr, " 12 ", 4), 12);
EXPECT_EQ(gdv_fn_castINT_utf8(ctx_ptr, "12", 2), 12);
gdv_fn_castINT_utf8(ctx_ptr, "2147483648", 10);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string 2147483648 to int32"));
ctx.Reset();
gdv_fn_castINT_utf8(ctx_ptr, "-2147483649", 11);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string -2147483649 to int32"));
ctx.Reset();
gdv_fn_castINT_utf8(ctx_ptr, "12.34", 5);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string 12.34 to int32"));
ctx.Reset();
gdv_fn_castINT_utf8(ctx_ptr, "abc", 3);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string abc to int32"));
ctx.Reset();
gdv_fn_castINT_utf8(ctx_ptr, "", 0);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string to int32"));
ctx.Reset();
gdv_fn_castINT_utf8(ctx_ptr, "-", 1);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string - to int32"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestCastBIGINT) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
EXPECT_EQ(gdv_fn_castBIGINT_utf8(ctx_ptr, "-45", 3), -45);
EXPECT_EQ(gdv_fn_castBIGINT_utf8(ctx_ptr, "0", 1), 0);
EXPECT_EQ(gdv_fn_castBIGINT_utf8(ctx_ptr, "9223372036854775807", 19),
9223372036854775807LL);
EXPECT_EQ(gdv_fn_castBIGINT_utf8(ctx_ptr, "09223372036854775807", 20),
9223372036854775807LL);
EXPECT_EQ(gdv_fn_castBIGINT_utf8(ctx_ptr, "-9223372036854775808", 20),
-9223372036854775807LL - 1);
EXPECT_EQ(gdv_fn_castBIGINT_utf8(ctx_ptr, "-009223372036854775808", 22),
-9223372036854775807LL - 1);
EXPECT_EQ(gdv_fn_castBIGINT_utf8(ctx_ptr, " 12 ", 4), 12);
gdv_fn_castBIGINT_utf8(ctx_ptr, "9223372036854775808", 19);
EXPECT_THAT(
ctx.get_error(),
::testing::HasSubstr("Failed to cast the string 9223372036854775808 to int64"));
ctx.Reset();
gdv_fn_castBIGINT_utf8(ctx_ptr, "-9223372036854775809", 20);
EXPECT_THAT(
ctx.get_error(),
::testing::HasSubstr("Failed to cast the string -9223372036854775809 to int64"));
ctx.Reset();
gdv_fn_castBIGINT_utf8(ctx_ptr, "12.34", 5);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string 12.34 to int64"));
ctx.Reset();
gdv_fn_castBIGINT_utf8(ctx_ptr, "abc", 3);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string abc to int64"));
ctx.Reset();
gdv_fn_castBIGINT_utf8(ctx_ptr, "", 0);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string to int64"));
ctx.Reset();
gdv_fn_castBIGINT_utf8(ctx_ptr, "-", 1);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string - to int64"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestCastFloat4) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
EXPECT_EQ(gdv_fn_castFLOAT4_utf8(ctx_ptr, "-45.34", 6), -45.34f);
EXPECT_EQ(gdv_fn_castFLOAT4_utf8(ctx_ptr, "0", 1), 0.0f);
EXPECT_EQ(gdv_fn_castFLOAT4_utf8(ctx_ptr, "5", 1), 5.0f);
EXPECT_EQ(gdv_fn_castFLOAT4_utf8(ctx_ptr, " 3.4 ", 5), 3.4f);
gdv_fn_castFLOAT4_utf8(ctx_ptr, "", 0);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string to float"));
ctx.Reset();
gdv_fn_castFLOAT4_utf8(ctx_ptr, "e", 1);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string e to float"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestCastFloat8) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
EXPECT_EQ(gdv_fn_castFLOAT8_utf8(ctx_ptr, "-45.34", 6), -45.34);
EXPECT_EQ(gdv_fn_castFLOAT8_utf8(ctx_ptr, "0", 1), 0.0);
EXPECT_EQ(gdv_fn_castFLOAT8_utf8(ctx_ptr, "5", 1), 5.0);
EXPECT_EQ(gdv_fn_castFLOAT8_utf8(ctx_ptr, " 3.4 ", 5), 3.4);
gdv_fn_castFLOAT8_utf8(ctx_ptr, "", 0);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string to double"));
ctx.Reset();
gdv_fn_castFLOAT8_utf8(ctx_ptr, "e", 1);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string e to double"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestCastVARCHARFromInt32) {
gandiva::ExecutionContext ctx;
uint64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
const char* out_str = gdv_fn_castVARCHAR_int32_int64(ctx_ptr, -46, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "-46");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_int32_int64(ctx_ptr, 2147483647, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "2147483647");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_int32_int64(ctx_ptr, -2147483647 - 1, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "-2147483648");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_int32_int64(ctx_ptr, 0, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "0");
EXPECT_FALSE(ctx.has_error());
// test with required length less than actual buffer length
out_str = gdv_fn_castVARCHAR_int32_int64(ctx_ptr, 34567, 3, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "345");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_int32_int64(ctx_ptr, 347, 0, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_int32_int64(ctx_ptr, 347, -1, &out_len);
EXPECT_THAT(ctx.get_error(), ::testing::HasSubstr("Buffer length cannot be negative"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestCastVARCHARFromInt64) {
gandiva::ExecutionContext ctx;
uint64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
const char* out_str =
gdv_fn_castVARCHAR_int64_int64(ctx_ptr, 9223372036854775807LL, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "9223372036854775807");
EXPECT_FALSE(ctx.has_error());
out_str =
gdv_fn_castVARCHAR_int64_int64(ctx_ptr, -9223372036854775807LL - 1, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "-9223372036854775808");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_int64_int64(ctx_ptr, 0, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "0");
EXPECT_FALSE(ctx.has_error());
// test with required length less than actual buffer length
out_str = gdv_fn_castVARCHAR_int64_int64(ctx_ptr, 12345, 3, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "123");
EXPECT_FALSE(ctx.has_error());
}
TEST(TestGdvFnStubs, TestCastVARCHARFromMilliseconds) {
gandiva::ExecutionContext ctx;
uint64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
gdv_date64 ts = StringToTimestamp("2021-04-23 10:20:33");
const char* out_str = gdv_fn_castVARCHAR_date64_int64(ctx_ptr, ts, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "2021-04-23");
EXPECT_FALSE(ctx.has_error());
ts = StringToTimestamp("2008-08-20 10:20:33");
out_str = gdv_fn_castVARCHAR_date64_int64(ctx_ptr, ts, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "2008-08-20");
EXPECT_FALSE(ctx.has_error());
ts = StringToTimestamp("2011-09-28 10:20:33");
out_str = gdv_fn_castVARCHAR_date64_int64(ctx_ptr, ts, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "2011-09-28");
EXPECT_FALSE(ctx.has_error());
ts = StringToTimestamp("2021-04-21 10:20:33");
out_str = gdv_fn_castVARCHAR_date64_int64(ctx_ptr, ts, 7, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "2021-04");
EXPECT_FALSE(ctx.has_error());
ts = StringToTimestamp("2008-04-21 10:20:33");
out_str = gdv_fn_castVARCHAR_date64_int64(ctx_ptr, ts, 4, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "2008");
EXPECT_FALSE(ctx.has_error());
}
TEST(TestGdvFnStubs, TestCastVARCHARFromFloat) {
gandiva::ExecutionContext ctx;
uint64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
const char* out_str = gdv_fn_castVARCHAR_float32_int64(ctx_ptr, 4.567f, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "4.567");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_float32_int64(ctx_ptr, -3.4567f, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "-3.4567");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_float32_int64(ctx_ptr, 0.00001f, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "1.0E-5");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_float32_int64(ctx_ptr, 0.00099999f, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "9.9999E-4");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_float32_int64(ctx_ptr, 0.0f, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "0.0");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_float32_int64(ctx_ptr, 10.00000f, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "10.0");
EXPECT_FALSE(ctx.has_error());
// test with required length less than actual buffer length
out_str = gdv_fn_castVARCHAR_float32_int64(ctx_ptr, 1.2345f, 3, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "1.2");
EXPECT_FALSE(ctx.has_error());
}
TEST(TestGdvFnStubs, TestCastVARCHARFromDouble) {
gandiva::ExecutionContext ctx;
uint64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
const char* out_str = gdv_fn_castVARCHAR_float64_int64(ctx_ptr, 4.567, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "4.567");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_float64_int64(ctx_ptr, -3.4567, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "-3.4567");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_float64_int64(ctx_ptr, 0.00001, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "1.0E-5");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_float32_int64(ctx_ptr, 0.00099999f, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "9.9999E-4");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_float64_int64(ctx_ptr, 0.0, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "0.0");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_castVARCHAR_float64_int64(ctx_ptr, 10.0000000000, 100, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "10.0");
EXPECT_FALSE(ctx.has_error());
// test with required length less than actual buffer length
out_str = gdv_fn_castVARCHAR_float64_int64(ctx_ptr, 1.2345, 3, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "1.2");
EXPECT_FALSE(ctx.has_error());
}
TEST(TestGdvFnStubs, TestSubstringIndex) {
gandiva::ExecutionContext ctx;
uint64_t ctx_ptr = reinterpret_cast<gdv_int64>(&ctx);
gdv_int32 out_len = 0;
const char* out_str =
gdv_fn_substring_index(ctx_ptr, "Abc.DE.fGh", 10, ".", 1, 2, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "Abc.DE");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "Abc.DE.fGh", 10, ".", 1, -2, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "DE.fGh");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "S;DCGS;JO!L", 11, ";", 1, 1, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "S");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "S;DCGS;JO!L", 11, ";", 1, -1, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "JO!L");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "www.mysql.com", 13, "Q", 1, 1, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "www.mysql.com");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "www||mysql||com", 15, "||", 2, 2, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "www||mysql");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "", 0, ".", 1, 1, &out_len);
EXPECT_EQ(std::string(out_str, out_len).size(), 0);
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "www||mysql||com", 15, "", 0, 1, &out_len);
EXPECT_EQ(std::string(out_str, out_len).size(), 0);
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "www||mysql||com", 15, "||", 2, 0, &out_len);
EXPECT_EQ(std::string(out_str, out_len).size(), 0);
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "www||mysql||com", 15, "||", 2, -2, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "mysql||com");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "MÜNCHEN", 8, "Ü", 2, 1, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "M");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "MÜNCHEN", 8, "Ü", 2, -1, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "NCHEN");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "MÜëCHEN", 9, "Ü", 2, -1, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "ëCHEN");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "citroën", 8, "ë", 2, -1, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "n");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "citroën", 8, "ë", 2, 1, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "citro");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "路学\\L", 8, "\\", 1, 1, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "路学");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_substring_index(ctx_ptr, "路学\\L", 8, "\\", 1, -1, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "L");
EXPECT_FALSE(ctx.has_error());
}
TEST(TestGdvFnStubs, TestUpper) {
gandiva::ExecutionContext ctx;
uint64_t ctx_ptr = reinterpret_cast<gdv_int64>(&ctx);
gdv_int32 out_len = 0;
const char* out_str = gdv_fn_upper_utf8(ctx_ptr, "AbcDEfGh", 8, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "ABCDEFGH");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_upper_utf8(ctx_ptr, "asdfj", 5, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "ASDFJ");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_upper_utf8(ctx_ptr, "s;dcGS,jO!l", 11, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "S;DCGS,JO!L");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_upper_utf8(ctx_ptr, "münchen", 8, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "MÜNCHEN");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_upper_utf8(ctx_ptr, "CITROËN", 8, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "CITROËN");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_upper_utf8(ctx_ptr, "âBćDëFGH", 11, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "ÂBĆDËFGH");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_upper_utf8(ctx_ptr, "øhpqRšvñ", 11, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "ØHPQRŠVÑ");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_upper_utf8(ctx_ptr, "Möbelträgerfüße", 19, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "MÖBELTRÄGERFÜẞE");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_upper_utf8(ctx_ptr, "{õhp,PQŚv}ń+", 15, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "{ÕHP,PQŚV}Ń+");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_upper_utf8(ctx_ptr, "", 0, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "");
EXPECT_FALSE(ctx.has_error());
std::string d("AbOJjÜoß\xc3");
out_str = gdv_fn_upper_utf8(ctx_ptr, d.data(), static_cast<int>(d.length()), &out_len);
EXPECT_EQ(std::string(out_str, out_len), "");
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr(
"unexpected byte \\c3 encountered while decoding utf8 string"));
ctx.Reset();
std::string e(
"åbÑg\xe0\xa0"
"åBUå");
out_str = gdv_fn_upper_utf8(ctx_ptr, e.data(), static_cast<int>(e.length()), &out_len);
EXPECT_EQ(std::string(out_str, out_len), "");
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr(
"unexpected byte \\e0 encountered while decoding utf8 string"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestLower) {
gandiva::ExecutionContext ctx;
uint64_t ctx_ptr = reinterpret_cast<gdv_int64>(&ctx);
gdv_int32 out_len = 0;
const char* out_str = gdv_fn_lower_utf8(ctx_ptr, "AbcDEfGh", 8, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "abcdefgh");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_lower_utf8(ctx_ptr, "asdfj", 5, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "asdfj");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_lower_utf8(ctx_ptr, "S;DCgs,Jo!L", 11, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "s;dcgs,jo!l");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_lower_utf8(ctx_ptr, "MÜNCHEN", 8, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "münchen");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_lower_utf8(ctx_ptr, "citroën", 8, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "citroën");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_lower_utf8(ctx_ptr, "ÂbĆDËFgh", 11, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "âbćdëfgh");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_lower_utf8(ctx_ptr, "ØHPQrŠvÑ", 11, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "øhpqršvñ");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_lower_utf8(ctx_ptr, "MÖBELTRÄGERFÜẞE", 20, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "möbelträgerfüße");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_lower_utf8(ctx_ptr, "{ÕHP,pqśv}Ń+", 15, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "{õhp,pqśv}ń+");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_lower_utf8(ctx_ptr, "", 0, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "");
EXPECT_FALSE(ctx.has_error());
std::string d("AbOJjÜoß\xc3");
out_str = gdv_fn_lower_utf8(ctx_ptr, d.data(), static_cast<int>(d.length()), &out_len);
EXPECT_EQ(std::string(out_str, out_len), "");
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr(
"unexpected byte \\c3 encountered while decoding utf8 string"));
ctx.Reset();
std::string e(
"åbÑg\xe0\xa0"
"åBUå");
out_str = gdv_fn_lower_utf8(ctx_ptr, e.data(), static_cast<int>(e.length()), &out_len);
EXPECT_EQ(std::string(out_str, out_len), "");
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr(
"unexpected byte \\e0 encountered while decoding utf8 string"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestInitCap) {
gandiva::ExecutionContext ctx;
uint64_t ctx_ptr = reinterpret_cast<gdv_int64>(&ctx);
gdv_int32 out_len = 0;
const char* out_str = gdv_fn_initcap_utf8(ctx_ptr, "test string", 11, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "Test String");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, "asdfj\nhlqf", 10, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "Asdfj\nHlqf");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, "s;DCgs,Jo!l", 11, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "S;Dcgs,Jo!L");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, " mÜNCHEN", 9, &out_len);
EXPECT_EQ(std::string(out_str, out_len), " München");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, "citroën CaR", 12, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "Citroën Car");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, "ÂbĆDËFgh\néll", 16, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "Âbćdëfgh\nÉll");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, " øhpqršvñ \n\n", 17, &out_len);
EXPECT_EQ(std::string(out_str, out_len), " Øhpqršvñ \n\n");
EXPECT_FALSE(ctx.has_error());
out_str =
gdv_fn_initcap_utf8(ctx_ptr, "möbelträgerfüße \nmöbelträgerfüße", 42, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "Möbelträgerfüße \nMöbelträgerfüße");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, "{ÕHP,pqśv}Ń+", 15, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "{Õhp,Pqśv}Ń+");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, "sɦasasdsɦsd\"sdsdɦ", 19, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "Sɦasasdsɦsd\"Sdsdɦ");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, "mysuperscipt@number²isfine", 27, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "Mysuperscipt@Number²Isfine");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, "Ő<tŵas̓老ƕɱ¢vIYwށ", 25, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "Ő<Tŵas̓老Ƕɱ¢Viywށ");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, "ↆcheckↆnumberisspace", 24, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "ↆcheckↆnumberisspace");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, "testing ᾌTitleᾌcase", 23, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "Testing ᾌtitleᾄcase");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, "ʳTesting mʳodified", 20, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "ʳTesting MʳOdified");
EXPECT_FALSE(ctx.has_error());
out_str = gdv_fn_initcap_utf8(ctx_ptr, "", 0, &out_len);
EXPECT_EQ(std::string(out_str, out_len), "");
EXPECT_FALSE(ctx.has_error());
std::string d("AbOJjÜoß\xc3");
out_str =
gdv_fn_initcap_utf8(ctx_ptr, d.data(), static_cast<int>(d.length()), &out_len);
EXPECT_EQ(std::string(out_str, out_len), "");
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr(
"unexpected byte \\c3 encountered while decoding utf8 string"));
ctx.Reset();
std::string e(
"åbÑg\xe0\xa0"
"åBUå");
out_str =
gdv_fn_initcap_utf8(ctx_ptr, e.data(), static_cast<int>(e.length()), &out_len);
EXPECT_EQ(std::string(out_str, out_len), "");
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr(
"unexpected byte \\e0 encountered while decoding utf8 string"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestCastVarbinaryINT) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
EXPECT_EQ(gdv_fn_castINT_varbinary(ctx_ptr, "-45", 3), -45);
EXPECT_EQ(gdv_fn_castINT_varbinary(ctx_ptr, "0", 1), 0);
EXPECT_EQ(gdv_fn_castINT_varbinary(ctx_ptr, "2147483647", 10), 2147483647);
EXPECT_EQ(gdv_fn_castINT_varbinary(ctx_ptr, "\x32\x33", 2), 23);
EXPECT_EQ(gdv_fn_castINT_varbinary(ctx_ptr, "02147483647", 11), 2147483647);
EXPECT_EQ(gdv_fn_castINT_varbinary(ctx_ptr, "-2147483648", 11), -2147483648LL);
EXPECT_EQ(gdv_fn_castINT_varbinary(ctx_ptr, "-02147483648", 12), -2147483648LL);
EXPECT_EQ(gdv_fn_castINT_varbinary(ctx_ptr, " 12 ", 4), 12);
gdv_fn_castINT_varbinary(ctx_ptr, "2147483648", 10);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string 2147483648 to int32"));
ctx.Reset();
gdv_fn_castINT_varbinary(ctx_ptr, "-2147483649", 11);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string -2147483649 to int32"));
ctx.Reset();
gdv_fn_castINT_varbinary(ctx_ptr, "12.34", 5);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string 12.34 to int32"));
ctx.Reset();
gdv_fn_castINT_varbinary(ctx_ptr, "abc", 3);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string abc to int32"));
ctx.Reset();
gdv_fn_castINT_varbinary(ctx_ptr, "", 0);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string to int32"));
ctx.Reset();
gdv_fn_castINT_varbinary(ctx_ptr, "-", 1);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string - to int32"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestCastVarbinaryBIGINT) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
EXPECT_EQ(gdv_fn_castBIGINT_varbinary(ctx_ptr, "-45", 3), -45);
EXPECT_EQ(gdv_fn_castBIGINT_varbinary(ctx_ptr, "0", 1), 0);
EXPECT_EQ(gdv_fn_castBIGINT_varbinary(ctx_ptr, "9223372036854775807", 19),
9223372036854775807LL);
EXPECT_EQ(gdv_fn_castBIGINT_varbinary(ctx_ptr, "09223372036854775807", 20),
9223372036854775807LL);
EXPECT_EQ(gdv_fn_castBIGINT_varbinary(ctx_ptr, "-9223372036854775808", 20),
-9223372036854775807LL - 1);
EXPECT_EQ(gdv_fn_castBIGINT_varbinary(ctx_ptr, "-009223372036854775808", 22),
-9223372036854775807LL - 1);
EXPECT_EQ(gdv_fn_castBIGINT_varbinary(ctx_ptr, " 12 ", 4), 12);
EXPECT_EQ(gdv_fn_castBIGINT_varbinary(ctx_ptr,
"\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39", 10),
9999999999LL);
gdv_fn_castBIGINT_varbinary(ctx_ptr, "9223372036854775808", 19);
EXPECT_THAT(
ctx.get_error(),
::testing::HasSubstr("Failed to cast the string 9223372036854775808 to int64"));
ctx.Reset();
gdv_fn_castBIGINT_varbinary(ctx_ptr, "-9223372036854775809", 20);
EXPECT_THAT(
ctx.get_error(),
::testing::HasSubstr("Failed to cast the string -9223372036854775809 to int64"));
ctx.Reset();
gdv_fn_castBIGINT_varbinary(ctx_ptr, "12.34", 5);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string 12.34 to int64"));
ctx.Reset();
gdv_fn_castBIGINT_varbinary(ctx_ptr, "abc", 3);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string abc to int64"));
ctx.Reset();
gdv_fn_castBIGINT_varbinary(ctx_ptr, "", 0);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string to int64"));
ctx.Reset();
gdv_fn_castBIGINT_varbinary(ctx_ptr, "-", 1);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string - to int64"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestCastVarbinaryFloat4) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
EXPECT_EQ(gdv_fn_castFLOAT4_varbinary(ctx_ptr, "-45.34", 6), -45.34f);
EXPECT_EQ(gdv_fn_castFLOAT4_varbinary(ctx_ptr, "0", 1), 0.0f);
EXPECT_EQ(gdv_fn_castFLOAT4_varbinary(ctx_ptr, "5", 1), 5.0f);
EXPECT_EQ(gdv_fn_castFLOAT4_varbinary(ctx_ptr, " 3.4 ", 5), 3.4f);
EXPECT_EQ(gdv_fn_castFLOAT4_varbinary(ctx_ptr, " \x33\x2E\x34 ", 5), 3.4f);
gdv_fn_castFLOAT4_varbinary(ctx_ptr, "", 0);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string to float"));
ctx.Reset();
gdv_fn_castFLOAT4_varbinary(ctx_ptr, "e", 1);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string e to float"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestCastVarbinaryFloat8) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
EXPECT_EQ(gdv_fn_castFLOAT8_varbinary(ctx_ptr, "-45.34", 6), -45.34);
EXPECT_EQ(gdv_fn_castFLOAT8_varbinary(ctx_ptr, "0", 1), 0.0);
EXPECT_EQ(gdv_fn_castFLOAT8_varbinary(ctx_ptr, "5", 1), 5.0);
EXPECT_EQ(gdv_fn_castFLOAT8_varbinary(ctx_ptr, " \x33\x2E\x34 ", 5), 3.4);
gdv_fn_castFLOAT8_varbinary(ctx_ptr, "", 0);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string to double"));
ctx.Reset();
gdv_fn_castFLOAT8_varbinary(ctx_ptr, "e", 1);
EXPECT_THAT(ctx.get_error(),
::testing::HasSubstr("Failed to cast the string e to double"));
ctx.Reset();
}
TEST(TestGdvFnStubs, TestMaskFirstN) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
std::string data = "a〜Çç&";
auto data_len = static_cast<int32_t>(data.length());
std::string expected = "x〜Xx&";
const char* result =
gdv_mask_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 4, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "世界您";
data_len = static_cast<int32_t>(data.length());
expected = "世界您";
result = gdv_mask_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 4, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "a6Ççé";
data_len = static_cast<int32_t>(data.length());
expected = "xnXxé";
result = gdv_mask_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 4, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "0123456789";
data_len = static_cast<int32_t>(data.length());
expected = "nnnnnnnnnn";
result = gdv_mask_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 10, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
data_len = static_cast<int32_t>(data.length());
expected = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
result = gdv_mask_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 26, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "abcdefghijklmnopqrstuvwxyz";
expected = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
result = gdv_mask_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 26, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "aB-6";
data_len = static_cast<int32_t>(data.length());
expected = "xX-6";
result = gdv_mask_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 3, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "xX-n";
result = gdv_mask_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 5, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "aB-6";
result = gdv_mask_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, -3, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
result = gdv_mask_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 0, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "ABcd-123456";
data_len = static_cast<int32_t>(data.length());
expected = "XXxx-n23456";
result = gdv_mask_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 6, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "";
data_len = 0;
expected = "";
result = gdv_mask_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 6, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
}
TEST(TestGdvFnStubs, TestMaskLastN) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
std::string data = "a〜Çç&";
int32_t data_len = static_cast<int32_t>(data.length());
std::string expected = "a〜Xx&";
const char* result =
gdv_mask_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 4, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "abÇçé";
data_len = static_cast<int32_t>(data.length());
expected = "axXxx";
result = gdv_mask_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 4, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "0123456789";
data_len = static_cast<int32_t>(data.length());
expected = "nnnnnnnnnn";
result = gdv_mask_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 10, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
data_len = static_cast<int32_t>(data.length());
expected = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
result = gdv_mask_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 26, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "abcdefghijklmnopqrstuvwxyz";
expected = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
result = gdv_mask_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 26, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "aB-6";
data_len = static_cast<int32_t>(data.length());
expected = "aX-n";
result = gdv_mask_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 3, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "xX-n";
result = gdv_mask_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 5, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "aB-6";
result = gdv_mask_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, -3, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
result = gdv_mask_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 0, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "ABcd-123456";
data_len = static_cast<int32_t>(data.length());
expected = "ABcd-nnnnnn";
result = gdv_mask_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 6, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "";
data_len = 0;
expected = "";
result = gdv_mask_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 6, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
}
TEST(TestGdvFnStubs, TestTranslate) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
std::string expected = "ACACACA";
const char* result =
translate_utf8_utf8_utf8(ctx_ptr, "ABABABA", 7, "B", 1, "C", 1, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "acde";
result = translate_utf8_utf8_utf8(ctx_ptr, "a b c d e", 9, " b", 2, "", 0, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "h3110, h0w ar3 y0u/";
result = translate_utf8_utf8_utf8(ctx_ptr, "hello, how are you?", 19, "elo?", 4, "310/",
4, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "1b9ef";
result = translate_utf8_utf8_utf8(ctx_ptr, "abcdef", 6, "adc", 3, "19", 2, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "abcd";
result = translate_utf8_utf8_utf8(ctx_ptr, "a b c d", 7, " ", 1, "", 0, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "1b9c9e1f";
result =
translate_utf8_utf8_utf8(ctx_ptr, "abdcdeaf", 8, "adad", 4, "192", 3, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "012345678";
result = translate_utf8_utf8_utf8(ctx_ptr, "123456789", 9, "987654321", 9, "0123456789",
10, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "012345678";
result = translate_utf8_utf8_utf8(ctx_ptr, "987654321", 9, "123456789", 9, "0123456789",
10, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
}
TEST(TestGdvFnStubs, TestToUtcTimezone) {
gandiva::ExecutionContext context;
auto context_ptr = reinterpret_cast<int64_t>(&context);
auto len_ist = static_cast<gdv_int32>(strlen("Asia/Kolkata"));
auto len_pst = static_cast<gdv_int32>(strlen("America/Los_Angeles"));
// ts: 2012-02-28 15:30:00
// ts2:2012-02-28 10:00:00
gdv_timestamp ts = 1330443000000;
gdv_timestamp ts2 = to_utc_timezone_timestamp(context_ptr, ts, "Asia/Kolkata", len_ist);
EXPECT_EQ(1330423200000, ts2);
// ts: 1970-01-01 05:00:00
// ts2:1969-12-31 23:30:00
ts = 18000000;
ts2 = to_utc_timezone_timestamp(context_ptr, ts, "Asia/Kolkata", len_ist);
EXPECT_EQ(ts2, -1800000);
// daylight savings check
// ts: 2018-03-11 01:00:00
// ts2:2018-03-11 09:00:00
ts = 1520730000000;
ts2 = to_utc_timezone_timestamp(context_ptr, ts, "America/Los_Angeles", len_pst);
EXPECT_EQ(ts2, 1520758800000);
// ts: 2018-03-12 01:00:00
// ts2:2018-03-12 08:00:00
ts = 1520816400000;
ts2 = to_utc_timezone_timestamp(context_ptr, ts, "America/Los_Angeles", len_pst);
EXPECT_EQ(ts2, 1520841600000);
// Failure case
ts2 = to_utc_timezone_timestamp(context_ptr, ts, "America/LA", 10);
EXPECT_THAT(context.get_error(), "America/LA is an invalid time zone name.");
}
TEST(TestGdvFnStubs, TestFromUtcTimezone) {
ExecutionContext context;
auto context_ptr = reinterpret_cast<int64_t>(&context);
auto len_ist = static_cast<gdv_int32>(strlen("Asia/Kolkata"));
auto len_pst = static_cast<gdv_int32>(strlen("America/Los_Angeles"));
// ts: 1970-01-01 10:00:00
// ts2:1970-01-01 15:30:00
gdv_timestamp ts = 36000000;
gdv_timestamp ts2 =
from_utc_timezone_timestamp(context_ptr, ts, "Asia/Kolkata", len_ist);
EXPECT_EQ(ts2, 55800000);
// ts: 1969-12-31 23:30:00
// ts2:1970-01-01 05:00:00
ts = -1800000;
ts2 = from_utc_timezone_timestamp(context_ptr, ts, "Asia/Kolkata", len_ist);
EXPECT_EQ(ts2, 18000000);
// ts: 2018-03-11 09:00:00
// ts2:2018-03-11 01:00:00
ts = 1520758800000;
ts2 = from_utc_timezone_timestamp(context_ptr, ts, "America/Los_Angeles", len_pst);
EXPECT_EQ(ts2, 1520730000000);
// ts: 2018-03-12 08:00:00
// ts2:2018-03-12 01:00:00
ts = 1520841600000;
ts2 = from_utc_timezone_timestamp(context_ptr, ts, "America/Los_Angeles", len_pst);
EXPECT_EQ(ts2, 1520816400000);
// Failure case
ts2 = from_utc_timezone_timestamp(context_ptr, ts, "India", 5);
EXPECT_THAT(context.get_error(), "India is an invalid time zone name.");
}
TEST(TestGdvFnStubs, TestShowFirstN) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
std::string data = "a〜Çç&";
int32_t data_len = static_cast<int32_t>(data.length());
std::string expected = "a〜Çç&";
const char* result =
gdv_mask_show_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 4, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "abÇçé";
data_len = static_cast<int32_t>(data.length());
expected = "abÇçx";
result = gdv_mask_show_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 4, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "0123456789";
data_len = static_cast<int32_t>(data.length());
expected = "0123456789";
result =
gdv_mask_show_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 10, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
data_len = static_cast<int32_t>(data.length());
expected = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
result =
gdv_mask_show_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 26, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "abcdefghijklmnopqrstuvwxyz";
expected = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
result = gdv_mask_show_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 0, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "aB-6";
data_len = static_cast<int32_t>(data.length());
expected = "aB-n";
result = gdv_mask_show_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 3, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "aB-6";
result = gdv_mask_show_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 5, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "xX-n";
result =
gdv_mask_show_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, -3, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
result = gdv_mask_show_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 0, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "ABcd-123456";
data_len = static_cast<int32_t>(data.length());
expected = "ABcd-123nnn";
result = gdv_mask_show_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 8, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "";
data_len = 0;
expected = "";
result = gdv_mask_show_first_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 6, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
}
TEST(TestGdvFnStubs, TestShowLastN) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
std::string data = "a〜Çç&";
auto data_len = static_cast<int32_t>(data.length());
std::string expected = "x〜Çç&";
const char* result =
gdv_mask_show_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 4, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "世界您";
data_len = static_cast<int32_t>(data.length());
expected = "世界您";
result = gdv_mask_show_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 4, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "a6Ççé";
data_len = static_cast<int32_t>(data.length());
expected = "xnXxé";
result = gdv_mask_show_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 1, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "0123456789";
data_len = static_cast<int32_t>(data.length());
expected = "nnnnnnnnnn";
result = gdv_mask_show_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 0, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
data_len = static_cast<int32_t>(data.length());
expected = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
result = gdv_mask_show_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 26, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "abcdefghijklmnopqrstuvwxyz";
expected = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
result = gdv_mask_show_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 0, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "aB-6";
data_len = static_cast<int32_t>(data.length());
expected = "xX-6";
result = gdv_mask_show_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 2, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "aB-6";
result = gdv_mask_show_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 5, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
expected = "xX-n";
result = gdv_mask_show_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, -3, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "ABcd-123456";
data_len = static_cast<int32_t>(data.length());
expected = "XXxx-n23456";
result = gdv_mask_show_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 5, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
data = "";
data_len = 0;
expected = "";
result = gdv_mask_show_last_n_utf8_int32(ctx_ptr, data.c_str(), data_len, 6, &out_len);
EXPECT_EQ(expected, std::string(result, out_len));
}
TEST(TestGdvFnStubs, TestMask) {
gandiva::ExecutionContext ctx;
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
int32_t out_len = 0;
std::string data = "AabbcÇdd-9202";
std::string expected = "XxxxxXxx-nnnn";
int32_t data_len = static_cast<int32_t>(data.length());
const char* result = mask_utf8_utf8_utf8_utf8(ctx_ptr, data.c_str(), data_len, "X", 1,
"x", 1, "n", 1, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
result = mask_utf8_utf8_utf8(ctx_ptr, data.c_str(), data_len, "X", 1, "x", 1, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
result = mask_utf8_utf8(ctx_ptr, data.c_str(), data_len, "X", 1, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
result = mask_utf8(ctx_ptr, data.c_str(), data_len, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
data = "QwErTy:4)ß";
expected = "U-l-U-l-U-l-:#)l-";
data_len = static_cast<int32_t>(data.length());
result = mask_utf8_utf8_utf8_utf8(ctx_ptr, data.c_str(), data_len, "U-", 2, "l-", 2,
"#", 1, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
expected = "U-l-U-l-U-l-:n)l-";
result =
mask_utf8_utf8_utf8(ctx_ptr, data.c_str(), data_len, "U-", 2, "l-", 2, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
expected = "U-xU-xU-x:n)x";
result = mask_utf8_utf8(ctx_ptr, data.c_str(), data_len, "U-", 2, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
expected = "XxXxXx:n)x";
result = mask_utf8(ctx_ptr, data.c_str(), data_len, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
data = "";
expected = "";
data_len = static_cast<int32_t>(data.length());
result = mask_utf8_utf8_utf8_utf8(ctx_ptr, data.c_str(), data_len, "X", 1, "x", 2, "n",
1, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
result = mask_utf8_utf8_utf8(ctx_ptr, data.c_str(), data_len, "X", 1, "x", 1, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
result = mask_utf8_utf8(ctx_ptr, data.c_str(), data_len, "X", 1, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
result = mask_utf8(ctx_ptr, data.c_str(), data_len, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
data = "QwErTy:4)ß";
expected = ":)";
data_len = static_cast<int32_t>(data.length());
result = mask_utf8_utf8_utf8_utf8(ctx_ptr, data.c_str(), data_len, "", 0, "", 0, "", 0,
&out_len);
EXPECT_EQ(std::string(result, out_len), expected);
expected = ":n)";
result = mask_utf8_utf8_utf8(ctx_ptr, data.c_str(), data_len, "", 0, "", 0, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
expected = "xxx:n)x";
result = mask_utf8_utf8(ctx_ptr, data.c_str(), data_len, "", 0, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
data = "hunny-BEE-5121";
expected = "*****-\?\?\?-####";
data_len = static_cast<int32_t>(data.length());
result = mask_utf8_utf8_utf8_utf8(ctx_ptr, data.c_str(), data_len, "\?", 1, "*", 1, "#",
1, &out_len);
EXPECT_EQ(std::string(result, out_len), expected);
}
TEST(TestGdvFnStubs, TestAesEncryptDecrypt16) {
gandiva::ExecutionContext ctx;
std::string key16 = "12345678abcdefgh";
auto key16_len = static_cast<int32_t>(key16.length());
int32_t cipher_len = 0;
int32_t decrypted_len = 0;
std::string data = "test string";
auto data_len = static_cast<int32_t>(data.length());
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
const char* cipher = gdv_fn_aes_encrypt(ctx_ptr, data.c_str(), data_len, key16.c_str(),
key16_len, &cipher_len);
const char* decrypted_value = gdv_fn_aes_decrypt(
ctx_ptr, cipher, cipher_len, key16.c_str(), key16_len, &decrypted_len);
EXPECT_EQ(data,
std::string(reinterpret_cast<const char*>(decrypted_value), decrypted_len));
}
TEST(TestGdvFnStubs, TestAesEncryptDecrypt24) {
gandiva::ExecutionContext ctx;
std::string key24 = "12345678abcdefgh12345678";
auto key24_len = static_cast<int32_t>(key24.length());
int32_t cipher_len = 0;
int32_t decrypted_len = 0;
std::string data = "test string";
auto data_len = static_cast<int32_t>(data.length());
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
const char* cipher = gdv_fn_aes_encrypt(ctx_ptr, data.c_str(), data_len, key24.c_str(),
key24_len, &cipher_len);
const char* decrypted_value = gdv_fn_aes_decrypt(
ctx_ptr, cipher, cipher_len, key24.c_str(), key24_len, &decrypted_len);
EXPECT_EQ(data,
std::string(reinterpret_cast<const char*>(decrypted_value), decrypted_len));
}
TEST(TestGdvFnStubs, TestAesEncryptDecrypt32) {
gandiva::ExecutionContext ctx;
std::string key32 = "12345678abcdefgh12345678abcdefgh";
auto key32_len = static_cast<int32_t>(key32.length());
int32_t cipher_len = 0;
int32_t decrypted_len = 0;
std::string data = "test string";
auto data_len = static_cast<int32_t>(data.length());
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
const char* cipher = gdv_fn_aes_encrypt(ctx_ptr, data.c_str(), data_len, key32.c_str(),
key32_len, &cipher_len);
const char* decrypted_value = gdv_fn_aes_decrypt(
ctx_ptr, cipher, cipher_len, key32.c_str(), key32_len, &decrypted_len);
EXPECT_EQ(data,
std::string(reinterpret_cast<const char*>(decrypted_value), decrypted_len));
}
TEST(TestGdvFnStubs, TestAesEncryptDecryptValidation) {
gandiva::ExecutionContext ctx;
std::string key33 = "12345678abcdefgh12345678abcdefghb";
auto key33_len = static_cast<int32_t>(key33.length());
int32_t decrypted_len = 0;
std::string data = "test string";
auto data_len = static_cast<int32_t>(data.length());
int64_t ctx_ptr = reinterpret_cast<int64_t>(&ctx);
std::string cipher = "12345678abcdefgh12345678abcdefghb";
auto cipher_len = static_cast<int32_t>(cipher.length());
gdv_fn_aes_encrypt(ctx_ptr, data.c_str(), data_len, key33.c_str(), key33_len,
&cipher_len);
EXPECT_THAT(ctx.get_error(), ::testing::HasSubstr("invalid key length"));
ctx.Reset();
gdv_fn_aes_decrypt(ctx_ptr, cipher.c_str(), cipher_len, key33.c_str(), key33_len,
&decrypted_len);
EXPECT_THAT(ctx.get_error(), ::testing::HasSubstr("invalid key length"));
ctx.Reset();
}
} // namespace gandiva