Skip to content

Commit

Permalink
This is an automated cherry-pick of pingcap#6133
Browse files Browse the repository at this point in the history
Signed-off-by: ti-chi-bot <[email protected]>
  • Loading branch information
xzhangxian1008 authored and ti-chi-bot committed Oct 15, 2022
1 parent c2c3617 commit ecc8c9f
Show file tree
Hide file tree
Showing 2 changed files with 186 additions and 3 deletions.
6 changes: 3 additions & 3 deletions dbms/src/Functions/FunctionsLogical.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ struct NotImpl
{
using ResultType = UInt8;

static inline UInt8 apply(A a)
static inline bool apply(A a)
{
return !a;
}
Expand Down Expand Up @@ -180,7 +180,7 @@ struct AssociativeOperationImpl
: vec(in[in.size() - N]->getData()), continuation(in) {}

/// Returns a combination of values in the i-th row of all columns stored in the constructor.
inline UInt8 apply(size_t i) const
inline bool apply(size_t i) const
{
if (Op::isSaturable())
{
Expand Down Expand Up @@ -223,7 +223,7 @@ struct AssociativeOperationImpl<Op, 1>
AssociativeOperationImpl(UInt8ColumnPtrs & in)
: vec(in[in.size() - 1]->getData()) {}

inline UInt8 apply(size_t i) const
inline bool apply(size_t i) const
{
return vec[i];
}
Expand Down
183 changes: 183 additions & 0 deletions dbms/src/Functions/tests/gtest_logical.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
// Copyright 2022 PingCAP, Ltd.
//
// Licensed 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 <Interpreters/Context.h>
#include <TestUtils/FunctionTestUtils.h>
#include <TestUtils/TiFlashTestBasic.h>

#include <string>
#include <vector>

namespace DB::tests
{
class Logical : public DB::tests::FunctionTest
{
};

TEST_F(Logical, andTest)
try
{
const String & func_name = "and";

// column, column
ASSERT_COLUMN_EQ(
createColumn<Nullable<UInt8>>({0, 1, 0, 0, {}, 0}),
executeFunction(
func_name,
createColumn<Nullable<UInt8>>({0, 1, 0, 1, {}, 0}),
createColumn<Nullable<UInt8>>({0, 1, 1, 0, 1, {}})));
// column, const
ASSERT_COLUMN_EQ(
createColumn<Nullable<UInt8>>({1, 0}),
executeFunction(
func_name,
createConstColumn<Nullable<UInt8>>(2, 1),
createColumn<Nullable<UInt8>>({1, 0})));
// const, const
ASSERT_COLUMN_EQ(
createConstColumn<UInt8>(1, 1),
executeFunction(
func_name,
createConstColumn<Nullable<UInt8>>(1, 1),
createConstColumn<Nullable<UInt8>>(1, 1)));
// only null
ASSERT_COLUMN_EQ(
createColumn<Nullable<UInt8>>({{}, 0}),
executeFunction(
func_name,
createOnlyNullColumnConst(2),
createColumn<Nullable<UInt8>>({1, 0})));
// issue 6127
ASSERT_COLUMN_EQ(
createColumn<UInt8>({0, 1, 0, 0}),
executeFunction(
func_name,
createColumn<Int64>({0, 123, 0, 41}),
createColumn<UInt8>({0, 11, 221, 0})));
// issue 6127, position of UInt8 column may affect the result
ASSERT_COLUMN_EQ(
createColumn<UInt8>({0, 1, 0, 0}),
executeFunction(
func_name,
createColumn<UInt8>({0, 123, 0, 41}),
createColumn<Int64>({0, 11, 221, 0})));
}
CATCH

TEST_F(Logical, orTest)
try
{
const String & func_name = "or";

// column, column
ASSERT_COLUMN_EQ(
createColumn<Nullable<UInt8>>({0, 1, 1, 1, 1, {}}),
executeFunction(
func_name,
createColumn<Nullable<UInt8>>({0, 1, 0, 1, {}, 0}),
createColumn<Nullable<UInt8>>({0, 1, 1, 0, 1, {}})));
// column, const
ASSERT_COLUMN_EQ(
createColumn<Nullable<UInt8>>({1, 1}),
executeFunction(
func_name,
createConstColumn<Nullable<UInt8>>(2, 1),
createColumn<Nullable<UInt8>>({1, 0})));
// const, const
ASSERT_COLUMN_EQ(
createConstColumn<UInt8>(1, 1),
executeFunction(
func_name,
createConstColumn<Nullable<UInt8>>(1, 1),
createConstColumn<Nullable<UInt8>>(1, 0)));
// only null
ASSERT_COLUMN_EQ(
createColumn<Nullable<UInt8>>({1, {}}),
executeFunction(
func_name,
createOnlyNullColumnConst(2),
createColumn<Nullable<UInt8>>({1, 0})));
// issue 5849
ASSERT_COLUMN_EQ(
createColumn<UInt8>({0, 1, 1, 1}),
executeFunction(
func_name,
createColumn<UInt8>({0, 123, 0, 41}),
createColumn<Int64>({0, 11, 221, 0})));
}
CATCH

TEST_F(Logical, xorTest)
try
{
const String & func_name = "xor";

// column, column
ASSERT_COLUMN_EQ(
createColumn<Nullable<UInt8>>({0, 0, 1, 1, {}, {}}),
executeFunction(
func_name,
createColumn<Nullable<UInt8>>({0, 1, 0, 1, {}, 0}),
createColumn<Nullable<UInt8>>({0, 1, 1, 0, 1, {}})));
// column, const
ASSERT_COLUMN_EQ(
createColumn<Nullable<UInt8>>({0, 1}),
executeFunction(
func_name,
createConstColumn<Nullable<UInt8>>(2, 1),
createColumn<Nullable<UInt8>>({1, 0})));
// const, const
ASSERT_COLUMN_EQ(
createConstColumn<UInt8>(1, 0),
executeFunction(
func_name,
createConstColumn<Nullable<UInt8>>(1, 1),
createConstColumn<Nullable<UInt8>>(1, 1)));
// only null
ASSERT_COLUMN_EQ(
createOnlyNullColumnConst(2),
executeFunction(
func_name,
createOnlyNullColumnConst(2),
createColumn<Nullable<UInt8>>({1, 0})));
}
CATCH

TEST_F(Logical, notTest)
try
{
const String & func_name = "not";

// column
ASSERT_COLUMN_EQ(
createColumn<Nullable<UInt8>>({1, 0, {}}),
executeFunction(
func_name,
createColumn<Nullable<UInt8>>({0, 1, {}})));
// const
ASSERT_COLUMN_EQ(
createConstColumn<UInt8>(1, 0),
executeFunction(
func_name,
createConstColumn<Nullable<UInt8>>(1, 1)));
// only null
ASSERT_COLUMN_EQ(
createOnlyNullColumnConst(1),
executeFunction(
func_name,
createOnlyNullColumnConst(1)));
}
CATCH

} // namespace DB::tests

0 comments on commit ecc8c9f

Please sign in to comment.