/* * 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. */ package com.facebook.presto.type; import com.facebook.presto.operator.scalar.AbstractTestFunctions; import org.testng.annotations.Test; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; public class TestCharOperators extends AbstractTestFunctions { @Test public void testEqual() throws Exception { assertFunction("cast('foo' as char(3)) = cast('foo' as char(5))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) = cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) = cast('bar' as char(3))", BOOLEAN, false); assertFunction("cast('bar' as char(3)) = cast('foo' as char(3))", BOOLEAN, false); assertFunction("cast('a' as char(2)) = cast('a ' as char(2))", BOOLEAN, true); assertFunction("cast('a ' as char(2)) = cast('a' as char(2))", BOOLEAN, true); assertFunction("cast('a' as char(3)) = cast('a' as char(2))", BOOLEAN, false); assertFunction("cast('' as char(3)) = cast('' as char(2))", BOOLEAN, false); assertFunction("cast('' as char(2)) = cast('' as char(2))", BOOLEAN, true); } @Test public void testNotEqual() throws Exception { assertFunction("cast('foo' as char(3)) <> cast('foo' as char(5))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) <> cast('foo' as char(3))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) <> cast('bar' as char(3))", BOOLEAN, true); assertFunction("cast('bar' as char(3)) <> cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('a' as char(2)) <> cast('a ' as char(2))", BOOLEAN, false); assertFunction("cast('a ' as char(2)) <> cast('a' as char(2))", BOOLEAN, false); assertFunction("cast('a' as char(3)) <> cast('a' as char(2))", BOOLEAN, true); assertFunction("cast('' as char(3)) <> cast('' as char(2))", BOOLEAN, true); assertFunction("cast('' as char(2)) <> cast('' as char(2))", BOOLEAN, false); } @Test public void testLessThan() throws Exception { assertFunction("cast('bar' as char(5)) < cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('foo' as char(5)) < cast('bar' as char(3))", BOOLEAN, false); assertFunction("cast('bar' as char(3)) < cast('foo' as char(5))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) < cast('bar' as char(5))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) < cast('foo' as char(3))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) < cast('foo' as char(5))", BOOLEAN, true); assertFunction("cast('foo' as char(5)) < cast('foo' as char(3))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) < cast('bar' as char(3))", BOOLEAN, false); assertFunction("cast('bar' as char(3)) < cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('foobar' as char(6)) < cast('foobaz' as char(6))", BOOLEAN, true); assertFunction("cast('foob r' as char(6)) < cast('foobar' as char(6))", BOOLEAN, true); assertFunction("cast('\0' as char(1)) < cast(' ' as char(1))", BOOLEAN, true); assertFunction("cast('\0' as char(1)) < cast('' as char(0))", BOOLEAN, false); // length mismatch, coercion to VARCHAR applies, thus '\0' > '' assertFunction("cast('abc\0' as char(4)) < cast('abc' as char(4))", BOOLEAN, true); // 'abc' is implicitly padded with spaces -> 'abc' is greater assertFunction("cast('\0' as char(1)) < cast('\0 ' as char(2))", BOOLEAN, true); // length mismatch, coercion to VARCHAR applies assertFunction("cast('\0' as char(2)) < cast('\0 ' as char(2))", BOOLEAN, false); // '\0' is implicitly padded with spaces -> both are equal assertFunction("cast('\0 a' as char(3)) < cast('\0' as char(3))", BOOLEAN, false); } @Test public void testLessThanOrEqual() throws Exception { assertFunction("cast('bar' as char(5)) <= cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('foo' as char(5)) <= cast('bar' as char(3))", BOOLEAN, false); assertFunction("cast('bar' as char(3)) <= cast('foo' as char(5))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) <= cast('bar' as char(5))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) <= cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) <= cast('foo' as char(5))", BOOLEAN, true); assertFunction("cast('foo' as char(5)) <= cast('foo' as char(3))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) <= cast('bar' as char(3))", BOOLEAN, false); assertFunction("cast('bar' as char(3)) <= cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('foobar' as char(6)) <= cast('foobaz' as char(6))", BOOLEAN, true); assertFunction("cast('foob r' as char(6)) <= cast('foobar' as char(6))", BOOLEAN, true); assertFunction("cast('\0' as char(1)) <= cast(' ' as char(1))", BOOLEAN, true); assertFunction("cast('\0' as char(1)) <= cast('' as char(0))", BOOLEAN, false); // length mismatch, coercion to VARCHAR applies, thus '\0' > '' assertFunction("cast('abc\0' as char(4)) <= cast('abc' as char(4))", BOOLEAN, true); // 'abc' is implicitly padded with spaces -> 'abc' is greater assertFunction("cast('\0' as char(1)) <= cast('\0 ' as char(2))", BOOLEAN, true); // length mismatch, coercion to VARCHAR applies assertFunction("cast('\0' as char(2)) <= cast('\0 ' as char(2))", BOOLEAN, true); // '\0' is implicitly padded with spaces -> both are equal assertFunction("cast('\0 a' as char(3)) <= cast('\0' as char(3))", BOOLEAN, false); } @Test public void testGreaterThan() throws Exception { assertFunction("cast('bar' as char(5)) > cast('foo' as char(3))", BOOLEAN, false); assertFunction("cast('foo' as char(5)) > cast('bar' as char(3))", BOOLEAN, true); assertFunction("cast('bar' as char(3)) > cast('foo' as char(5))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) > cast('bar' as char(5))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) > cast('foo' as char(3))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) > cast('foo' as char(5))", BOOLEAN, false); assertFunction("cast('foo' as char(5)) > cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) > cast('bar' as char(3))", BOOLEAN, true); assertFunction("cast('bar' as char(3)) > cast('foo' as char(3))", BOOLEAN, false); assertFunction("cast('foobar' as char(6)) > cast('foobaz' as char(6))", BOOLEAN, false); assertFunction("cast('foob r' as char(6)) > cast('foobar' as char(6))", BOOLEAN, false); assertFunction("cast(' ' as char(1)) > cast('\0' as char(1))", BOOLEAN, true); assertFunction("cast('' as char(0)) > cast('\0' as char(1))", BOOLEAN, false); // length mismatch, coercion to VARCHAR applies, thus '\0' > '' assertFunction("cast('abc' as char(4)) > cast('abc\0' as char(4))", BOOLEAN, true); // 'abc' is implicitly padded with spaces -> 'abc' is greater assertFunction("cast('\0 ' as char(2)) > cast('\0' as char(1))", BOOLEAN, true); // length mismatch, coercion to VARCHAR applies assertFunction("cast('\0 ' as char(2)) > cast('\0' as char(2))", BOOLEAN, false); // '\0' is implicitly padded with spaces -> both are equal assertFunction("cast('\0 a' as char(3)) > cast('\0' as char(3))", BOOLEAN, true); } @Test public void testGreaterThanOrEqual() throws Exception { assertFunction("cast('bar' as char(5)) >= cast('foo' as char(3))", BOOLEAN, false); assertFunction("cast('foo' as char(5)) >= cast('bar' as char(3))", BOOLEAN, true); assertFunction("cast('bar' as char(3)) >= cast('foo' as char(5))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) >= cast('bar' as char(5))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) >= cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) >= cast('foo' as char(5))", BOOLEAN, false); assertFunction("cast('foo' as char(5)) >= cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) >= cast('bar' as char(3))", BOOLEAN, true); assertFunction("cast('bar' as char(3)) >= cast('foo' as char(3))", BOOLEAN, false); assertFunction("cast('foobar' as char(6)) >= cast('foobaz' as char(6))", BOOLEAN, false); assertFunction("cast('foob r' as char(6)) >= cast('foobar' as char(6))", BOOLEAN, false); assertFunction("cast(' ' as char(1)) >= cast('\0' as char(1))", BOOLEAN, true); assertFunction("cast('' as char(0)) >= cast('\0' as char(1))", BOOLEAN, false); // length mismatch, coercion to VARCHAR applies, thus '\0' > '' assertFunction("cast('abc' as char(4)) >= cast('abc\0' as char(4))", BOOLEAN, true); // 'abc' is implicitly padded with spaces -> 'abc' is greater assertFunction("cast('\0 ' as char(2)) >= cast('\0' as char(1))", BOOLEAN, true); // length mismatch, coercion to VARCHAR applies assertFunction("cast('\0 ' as char(2)) >= cast('\0' as char(2))", BOOLEAN, true); // '\0' is implicitly padded with spaces -> both are equal assertFunction("cast('\0 a' as char(3)) >= cast('\0' as char(3))", BOOLEAN, true); } @Test public void testBetween() throws Exception { assertFunction("cast('bbb' as char(3)) BETWEEN cast('aaa' as char(3)) AND cast('ccc' as char(3))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) BETWEEN cast('foo' as char(3)) AND cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) BETWEEN cast('foo' as char(3)) AND cast('bar' as char(3))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) BETWEEN cast('zzz' as char(3)) AND cast('foo' as char(3))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) NOT BETWEEN cast('zzz' as char(3)) AND cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) BETWEEN cast('bar' as char(3)) AND cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) BETWEEN cast('bar' as char(3)) AND cast('bar' as char(3))", BOOLEAN, false); assertFunction("cast('bar' as char(3)) BETWEEN cast('foo' as char(3)) AND cast('foo' as char(3))", BOOLEAN, false); assertFunction("cast('bar' as char(3)) BETWEEN cast('foo' as char(3)) AND cast('bar' as char(3))", BOOLEAN, false); assertFunction("cast('bar' as char(3)) BETWEEN cast('bar' as char(3)) AND cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('bar' as char(3)) BETWEEN cast('bar' as char(3)) AND cast('bar' as char(3))", BOOLEAN, true); assertFunction("cast('\0 a' as char(3)) BETWEEN cast('\0' as char(3)) AND cast('\0a' as char(3))", BOOLEAN, true); // length based comparison assertFunction("cast('bar' as char(4)) BETWEEN cast('bar' as char(3)) AND cast('bar' as char(5))", BOOLEAN, true); assertFunction("cast('bar' as char(4)) BETWEEN cast('bar' as char(5)) AND cast('bar' as char(7))", BOOLEAN, false); } @Test public void testIsDistinctFrom() throws Exception { assertFunction("cast(NULL as char(3)) IS DISTINCT FROM cast(NULL as char(3))", BOOLEAN, false); assertFunction("cast(NULL as char(3)) IS DISTINCT FROM cast(NULL as char(5))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) IS DISTINCT FROM cast('foo' as char(5))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) IS DISTINCT FROM cast('foo' as char(3))", BOOLEAN, false); assertFunction("cast('foo' as char(3)) IS DISTINCT FROM cast('bar' as char(3))", BOOLEAN, true); assertFunction("cast('bar' as char(3)) IS DISTINCT FROM cast('foo' as char(3))", BOOLEAN, true); assertFunction("cast('foo' as char(3)) IS DISTINCT FROM NULL", BOOLEAN, true); assertFunction("NULL IS DISTINCT FROM cast('foo' as char(3))", BOOLEAN, true); } }