/* * Licensed to CRATE Technology GmbH ("Crate") under one or more contributor * license agreements. See the NOTICE file distributed with this work for * additional information regarding copyright ownership. Crate 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. * * However, if you have executed another commercial license agreement * with Crate these terms will supersede the license and you may use the * software solely pursuant to the terms of the relevant commercial agreement. */ package io.crate.integrationtests; import io.crate.testing.TestingHelpers; import io.crate.testing.UseJdbc; import org.hamcrest.Matchers; import org.hamcrest.core.Is; import org.junit.Test; import static org.hamcrest.Matchers.is; @UseJdbc public class AnyIntegrationTest extends SQLTransportIntegrationTest { @Test public void testAnyOnArrayLiteralDeleteUpdateSelect() throws Exception { execute("create table t (" + " i int," + " ia array(int)," + " s string," + " sa array(string)" + ") clustered into 1 shards with (number_of_replicas=0)"); ensureYellow(); execute("insert into t (i, ia, s, sa) values (?, ?, ?, ?)", new Object[][]{ {1, new Object[]{1, 2, 3}, "foo", new Object[]{"abc", "def", "ghi"}}, {2, new Object[]{3, 4, 5}, "bar", new Object[]{"rst", "uvw", "aaa"}}, {3, new Object[]{7, 8, 9}, "baz", new Object[]{"bar", "baz"}} }); execute("refresh table t"); execute("select i, s from t where i = ANY([1,2,4]) order by i"); assertThat(response.rowCount(), is(2L)); assertThat((Integer) response.rows()[0][0], is(1)); assertThat((Integer) response.rows()[1][0], is(2)); execute("select i, sa from t where 'ba%' not like ANY(sa) order by i"); assertThat(response.rowCount(), is(2L)); assertThat((Integer) response.rows()[0][0], is(1)); assertThat((Integer) response.rows()[1][0], is(2)); execute("update t set s='updated' where i > ANY([?, ?, ?])", new Object[]{2, 4, 5}); assertThat(response.rowCount(), is(1L)); execute("refresh table t"); execute("select s from t order by i"); assertThat(TestingHelpers.getColumn(response.rows(), 0), Matchers.<Object>arrayContaining("foo", "bar", "updated")); execute("delete from t where 'a%' like ANY (sa)"); assertThat(response.rowCount(), is(2L)); execute("refresh table t"); execute("select * from t"); assertThat(response.rowCount(), is(1L)); assertThat(TestingHelpers.printedTable(response.rows()), is("3| [7, 8, 9]| updated| [bar, baz]\n")); } @Test public void testAnyOnArrayLiteral() throws Exception { execute("create table t (b byte, sa array(string), s string) clustered into 1 shards with (number_of_replicas=0)"); ensureYellow(); execute("insert into t (b, sa, s) values (1, ['foo', 'bar'], 'goo')," + "(2, ['bar', 'baz'], 'zar')," + "(3, ['funky', 'shizzle'], 'ziffle')"); execute("refresh table t"); execute("select * from t where 'bar' = ANY(sa)"); assertThat(response.rowCount(), Is.is(2L)); execute("select b from t where b = ANY([1, 2, 4]) order by b"); assertThat(response.rowCount(), Is.is(2L)); assertThat((Byte) response.rows()[0][0], Is.is((byte) 1)); assertThat((Byte) response.rows()[1][0], Is.is((byte) 2)); execute("select * from t where b != ANY([1, 2, 4]) order by b"); assertThat(response.rowCount(), Is.is(3L)); // all rows does not contain at least one of the array elements execute("select b from t where b <= ANY([-1, 0, 1])"); assertThat(response.rowCount(), Is.is(1L)); assertThat((Byte) response.rows()[0][0], Is.is((byte) 1)); execute("select b from t where s like ANY(['%ar', 'go%']) order by b DESC"); assertThat(response.rowCount(), Is.is(2L)); assertThat((Byte) response.rows()[0][0], Is.is((byte) 2)); assertThat((Byte) response.rows()[1][0], Is.is((byte) 1)); } @Test public void testAnyOnArrayLiteralWithNullElements() throws Exception { execute("create table t (s string)"); ensureYellow(); execute("insert into t (s) values ('foo'), (null)"); execute("refresh table t"); execute("select * from t where s = ANY (['foo', 'bar', null])"); assertThat(response.rowCount(), is(1L)); execute("select * from t where s = ANY ([null])"); assertThat(response.rowCount(), is(0L)); } @Test public void testArrayReferenceOfDifferentTypeSoThatCastIsRequired() throws Exception { execute("create table t (x array(short))"); ensureYellow(); execute("insert into t (x) values ([1, 2, 3, 4])"); execute("refresh table t"); execute("select * from t where 4 < ANY (x) "); } @Test public void testNotAnyInWhereClauseDoesNotFilterOutEmptyArrays() { execute("create table t (b integer, labels array(string))"); ensureYellow(); execute("insert into t (b, labels) values (1, ['one', 'two'])," + "(2, ['two', 'three'])," + "(3, ['three', 'four'])," + "(4, [])"); refresh(); execute("select b from t where not 'two' = ANY(labels) order by b"); assertThat(response.rowCount(), is(2L)); assertThat(response.rows()[0][0], is(3)); assertThat(response.rows()[1][0], is(4)); } }