blob: 180ff5f3bbb11025d5d6d1c6873a85b8f176bf0d [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.
*/
#define _USE_MATH_DEFINES
#ifdef _WIN32
# include <windows.h>
#endif
#include <sql.h>
#include <sqlext.h>
#include <cmath>
#include <vector>
#include <string>
#include <boost/test/unit_test.hpp>
#include "ignite/ignite.h"
#include "ignite/ignition.h"
#include "ignite/impl/binary/binary_utils.h"
#include "test_type.h"
#include "test_utils.h"
#include "sql_test_suite_fixture.h"
using namespace ignite;
using namespace ignite::cache;
using namespace ignite::cache::query;
using namespace ignite::common;
using namespace ignite_test;
using namespace boost::unit_test;
using ignite::impl::binary::BinaryUtils;
BOOST_FIXTURE_TEST_SUITE(SqlNumericFunctionTestSuite, ignite::SqlTestSuiteFixture)
BOOST_AUTO_TEST_CASE(TestNumericFunctionAbs)
{
TestType in;
in.i32Field = -42;
testCache.Put(1, in);
CheckSingleResult<SQLINTEGER>("SELECT {fn ABS(i32Field)} FROM TestType", std::abs(in.i32Field));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionAcos)
{
TestType in;
in.doubleField = 0.32;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn ACOS(doubleField)} FROM TestType", std::acos(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionAsin)
{
TestType in;
in.doubleField = 0.12;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn ASIN(doubleField)} FROM TestType", std::asin(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionAtan)
{
TestType in;
in.doubleField = 0.14;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn ATAN(doubleField)} FROM TestType", std::atan(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionAtan2)
{
TestType in;
in.doubleField = 0.24;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn ATAN2(doubleField, 0.2)} FROM TestType", std::atan2(in.doubleField, 0.2));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionCeiling)
{
TestType in;
in.doubleField = 7.31;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn CEILING(doubleField)} FROM TestType", std::ceil(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionCos)
{
TestType in;
in.doubleField = 2.31;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn COS(doubleField)} FROM TestType", std::cos(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionCot)
{
TestType in;
in.doubleField = 2.31;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn COT(doubleField)} FROM TestType", 1 / std::tan(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionDegrees)
{
TestType in;
in.doubleField = 2.31;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn DEGREES(doubleField)} FROM TestType", in.doubleField * M_1_PI * 180);
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionExp)
{
TestType in;
in.doubleField = 1.23;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn EXP(doubleField)} FROM TestType", std::exp(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionFloor)
{
TestType in;
in.doubleField = 5.29;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn FLOOR(doubleField)} FROM TestType", std::floor(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionLog)
{
TestType in;
in.doubleField = 15.3;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn LOG(doubleField)} FROM TestType", std::log(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionLog10)
{
TestType in;
in.doubleField = 15.3;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn LOG10(doubleField)} FROM TestType", std::log10(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionMod)
{
TestType in;
in.i64Field = 26;
testCache.Put(1, in);
CheckSingleResult<SQLBIGINT>("SELECT {fn MOD(i64Field, 3)} FROM TestType", in.i64Field % 3);
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionPi)
{
CheckSingleResult<double>("SELECT {fn PI()}", M_PI);
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionPower)
{
TestType in;
in.doubleField = 1.81;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn POWER(doubleField, 2.5)} FROM TestType", std::pow(in.doubleField, 2.5));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionRadians)
{
TestType in;
in.doubleField = 161;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn RADIANS(doubleField)} FROM TestType", in.doubleField * M_PI / 180.0);
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionRand)
{
CheckSingleResult<double>("SELECT {fn RAND()} * 0", 0);
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionRound)
{
TestType in;
in.doubleField = 5.29;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn ROUND(doubleField)} FROM TestType", std::floor(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionSign)
{
TestType in;
in.doubleField = -1.39;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn SIGN(doubleField)} FROM TestType", in.doubleField < 0 ? -1 : in.doubleField == 0 ? 0 : 1);
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionSin)
{
TestType in;
in.doubleField = 1.01;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn SIN(doubleField)} FROM TestType", std::sin(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionSqrt)
{
TestType in;
in.doubleField = 2.56;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn SQRT(doubleField)} FROM TestType", std::sqrt(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionTan)
{
TestType in;
in.doubleField = 0.56;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn TAN(doubleField)} FROM TestType", std::tan(in.doubleField));
}
BOOST_AUTO_TEST_CASE(TestNumericFunctionTruncate)
{
TestType in;
in.doubleField = 4.17133;
testCache.Put(1, in);
CheckSingleResult<double>("SELECT {fn TRUNCATE(doubleField, 3)} FROM TestType", 4.171);
}
BOOST_AUTO_TEST_SUITE_END()