/* * 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. */ package org.apache.phoenix.end2end; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.math.BigDecimal; import java.sql.Array; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Time; import java.sql.Timestamp; import org.junit.Before; import org.junit.Test; public class ArrayFillFunctionIT extends ParallelStatsDisabledIT { private String tableName; @Before public void initTable() throws Exception { tableName = generateUniqueName(); Connection conn = DriverManager.getConnection(getUrl()); String ddl = "CREATE TABLE " + tableName + " (region_name VARCHAR PRIMARY KEY,length1 INTEGER, length2 INTEGER,\"DATE\" DATE,\"time\" TIME,\"timestamp\" TIMESTAMP,\"varchar\" VARCHAR,\"integer\" INTEGER,\"double\" DOUBLE,\"bigint\" BIGINT,\"char\" CHAR(15),double1 DOUBLE,char1 CHAR(17),nullcheck INTEGER,chars2 CHAR(15)[], varchars2 VARCHAR[])"; conn.createStatement().execute(ddl); String dml = "UPSERT INTO " + tableName + "(region_name,length1,length2,\"DATE\",\"time\",\"timestamp\",\"varchar\",\"integer\",\"double\",\"bigint\",\"char\",double1,char1,nullcheck,chars2,varchars2) VALUES('SF Bay Area'," + "0," + "-3," + "to_date('2015-05-20 06:12:14.184')," + "to_time('2015-05-20 06:12:14.184')," + "to_timestamp('2015-05-20 06:12:14.184')," + "'foo'," + "34," + "23.45," + "34567," + "'foo'," + "23.45," + "'wert'," + "NULL," + "ARRAY['hello','hello','hello']," + "ARRAY['hello','hello','hello']" + ")"; PreparedStatement stmt = conn.prepareStatement(dml); stmt.execute(); conn.commit(); } @Test public void testArrayFillFunctionVarchar() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL(\"varchar\",5) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); String[] strings = new String[]{"foo", "foo", "foo", "foo", "foo"}; Array array = conn.createArrayOf("VARCHAR", strings); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionInteger() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL(\"integer\",4) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Object[] objects = new Object[]{34, 34, 34, 34}; Array array = conn.createArrayOf("INTEGER", objects); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionDouble() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL(\"double\",4) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Object[] objects = new Object[]{23.45, 23.45, 23.45, 23.45}; Array array = conn.createArrayOf("DOUBLE", objects); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionBigint() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL(\"bigint\",4) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Object[] objects = new Object[]{34567l, 34567l, 34567l, 34567l}; Array array = conn.createArrayOf("BIGINT", objects); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionChar() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL(\"char\",4) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Object[] objects = new Object[]{"foo", "foo", "foo", "foo"}; Array array = conn.createArrayOf("CHAR", objects); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionVarChar() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL(\"varchar\",4) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Object[] objects = new Object[]{"foo", "foo", "foo", "foo"}; Array array = conn.createArrayOf("VARCHAR", objects); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionDate() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL(\"DATE\",3) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Object[] objects = new Object[]{new Date(1432102334184l), new Date(1432102334184l), new Date(1432102334184l)}; Array array = conn.createArrayOf("DATE", objects); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionTime() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL(\"time\",3) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Object[] objects = new Object[]{new Time(1432102334184l), new Time(1432102334184l), new Time(1432102334184l)}; Array array = conn.createArrayOf("TIME", objects); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionTimestamp() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL(\"timestamp\",3) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Object[] objects = new Object[]{new Timestamp(1432102334184l), new Timestamp(1432102334184l), new Timestamp(1432102334184l)}; Array array = conn.createArrayOf("TIMESTAMP", objects); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test(expected = IllegalArgumentException.class) public void testArrayFillFunctionInvalidLength1() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL(\"timestamp\",length2) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Object[] objects = new Object[]{new Timestamp(1432102334184l), new Timestamp(1432102334184l), new Timestamp(1432102334184l)}; Array array = conn.createArrayOf("TIMESTAMP", objects); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test(expected = IllegalArgumentException.class) public void testArrayFillFunctionInvalidLength2() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL(\"timestamp\",length1) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Object[] objects = new Object[]{new Timestamp(1432102334184l), new Timestamp(1432102334184l), new Timestamp(1432102334184l)}; Array array = conn.createArrayOf("TIMESTAMP", objects); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionWithNestedFunctions1() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL(ARRAY_ELEM(ARRAY[23,45],1),3) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Integer[] integers = new Integer[]{23, 23, 23}; Array array = conn.createArrayOf("INTEGER", integers); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionWithNestedFunctions2() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL('hello', ARRAY_LENGTH(ARRAY[34, 45])) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Object[] objects = new Object[]{"hello", "hello"}; Array array = conn.createArrayOf("VARCHAR", objects); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionWithNestedFunctions3() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT ARRAY_FILL(3.4, ARRAY_LENGTH(ARRAY[34, 45])) FROM " + tableName + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Object[] objects = new Object[]{BigDecimal.valueOf(3.4), BigDecimal.valueOf(3.4)}; Array array = conn.createArrayOf("DECIMAL", objects); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionWithUpsert1() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); String regions = generateUniqueName(); String ddl = "CREATE TABLE " + regions + " (region_name VARCHAR PRIMARY KEY,varchars VARCHAR[])"; conn.createStatement().execute(ddl); String dml = "UPSERT INTO " + regions + "(region_name,varchars) VALUES('SF Bay Area',ARRAY_FILL('hello',3))"; conn.createStatement().execute(dml); conn.commit(); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT varchars FROM " + regions + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); String[] strings = new String[]{"hello", "hello", "hello"}; Array array = conn.createArrayOf("VARCHAR", strings); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionWithUpsert2() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); String regions = generateUniqueName(); String ddl = "CREATE TABLE " + regions + " (region_name VARCHAR PRIMARY KEY,integers INTEGER[])"; conn.createStatement().execute(ddl); String dml = "UPSERT INTO " + regions + "(region_name,integers) VALUES('SF Bay Area',ARRAY_FILL(3456,3))"; conn.createStatement().execute(dml); conn.commit(); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT integers FROM " + regions + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Integer[] integers = new Integer[]{3456, 3456, 3456}; Array array = conn.createArrayOf("INTEGER", integers); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionWithUpsert3() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); String regions = generateUniqueName(); String ddl = "CREATE TABLE " + regions + " (region_name VARCHAR PRIMARY KEY,doubles DOUBLE[])"; conn.createStatement().execute(ddl); String dml = "UPSERT INTO " + regions + "(region_name,doubles) VALUES('SF Bay Area',ARRAY_FILL(2.5,3))"; conn.createStatement().execute(dml); conn.commit(); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT doubles FROM " + regions + " WHERE region_name = 'SF Bay Area'"); assertTrue(rs.next()); Double[] doubles = new Double[]{2.5, 2.5, 2.5}; Array array = conn.createArrayOf("DOUBLE", doubles); assertEquals(array, rs.getArray(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionWithUpsertSelect1() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); String ddl = "CREATE TABLE source (region_name VARCHAR PRIMARY KEY,doubles DOUBLE[])"; conn.createStatement().execute(ddl); ddl = "CREATE TABLE target (region_name VARCHAR PRIMARY KEY,doubles DOUBLE[],doubles2 DOUBLE[])"; conn.createStatement().execute(ddl); String dml = "UPSERT INTO source(region_name,doubles) VALUES('SF Bay Area',ARRAY_FILL(3.4,3))"; conn.createStatement().execute(dml); dml = "UPSERT INTO source(region_name,doubles) VALUES('SF Bay Area2',ARRAY_FILL(2.3,3))"; conn.createStatement().execute(dml); conn.commit(); dml = "UPSERT INTO target(region_name, doubles, doubles2) SELECT region_name, doubles,ARRAY_FILL(4.5,5) FROM source"; conn.createStatement().execute(dml); conn.commit(); ResultSet rs; rs = conn.createStatement().executeQuery("SELECT doubles, doubles2 FROM target"); assertTrue(rs.next()); Double[] doubles = new Double[]{3.4, 3.4, 3.4}; Double[] doubles2 = new Double[]{4.5, 4.5, 4.5, 4.5, 4.5}; Array array = conn.createArrayOf("DOUBLE", doubles); Array array2 = conn.createArrayOf("DOUBLE", doubles2); assertEquals(array, rs.getArray(1)); assertEquals(array2, rs.getArray(2)); assertTrue(rs.next()); doubles = new Double[]{2.3, 2.3, 2.3}; array = conn.createArrayOf("DOUBLE", doubles); assertEquals(array, rs.getArray(1)); assertEquals(array2, rs.getArray(2)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionWithUpsertSelect2() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); String source = generateUniqueName(); String ddl = "CREATE TABLE " + source + " (region_name VARCHAR PRIMARY KEY,varchars VARCHAR[])"; conn.createStatement().execute(ddl); String target = generateUniqueName(); ddl = "CREATE TABLE " + target + " (region_name VARCHAR PRIMARY KEY,varchars VARCHAR[],varchars2 VARCHAR[])"; conn.createStatement().execute(ddl); String dml = "UPSERT INTO " + source + "(region_name,varchars) VALUES('SF Bay Area',ARRAY_FILL('foo',3))"; conn.createStatement().execute(dml); dml = "UPSERT INTO " + source + "(region_name,varchars) VALUES('SF Bay Area2',ARRAY_FILL('hello',3))"; conn.createStatement().execute(dml); conn.commit(); dml = "UPSERT INTO " + target + "(region_name, varchars, varchars2) SELECT region_name, varchars,ARRAY_FILL(':-)',5) FROM " + source; conn.createStatement().execute(dml); conn.commit(); ResultSet rs; rs = conn.createStatement().executeQuery("SELECT varchars, varchars2 FROM " + target); assertTrue(rs.next()); String[] strings = new String[]{"foo", "foo", "foo"}; String[] strings2 = new String[]{":-)", ":-)", ":-)", ":-)", ":-)"}; Array array = conn.createArrayOf("VARCHAR", strings); Array array2 = conn.createArrayOf("VARCHAR", strings2); assertEquals(array, rs.getArray(1)); assertEquals(array2, rs.getArray(2)); assertTrue(rs.next()); strings = new String[]{"hello", "hello", "hello"}; array = conn.createArrayOf("VARCHAR", strings); assertEquals(array, rs.getArray(1)); assertEquals(array2, rs.getArray(2)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionInWhere1() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT region_name FROM " + tableName + " WHERE ARRAY[12, 12, 12, 12]=ARRAY_FILL(12,4)"); assertTrue(rs.next()); assertEquals("SF Bay Area", rs.getString(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionInWhere2() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT region_name FROM " + tableName + " WHERE \"varchar\"=ANY(ARRAY_FILL('foo',3))"); assertTrue(rs.next()); assertEquals("SF Bay Area", rs.getString(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionInWhere3() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery("SELECT region_name FROM " + tableName + " WHERE ARRAY['2345', '2345', '2345', '2345']=ARRAY_FILL('2345', 4)"); assertTrue(rs.next()); assertEquals("SF Bay Area", rs.getString(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionInWhere4() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery("SELECT region_name FROM " + tableName + " WHERE ARRAY[23.45, 23.45, 23.45]=ARRAY_FILL(23.45, 3)"); assertTrue(rs.next()); assertEquals("SF Bay Area", rs.getString(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionInWhere5() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery("SELECT region_name FROM " + tableName + " WHERE ARRAY['foo','foo','foo','foo','foo']=ARRAY_FILL(\"varchar\",5)"); assertTrue(rs.next()); assertEquals("SF Bay Area", rs.getString(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionInWhere6() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT region_name FROM " + tableName + " WHERE varchars2=ARRAY_FILL('hello',3)"); assertTrue(rs.next()); assertEquals("SF Bay Area", rs.getString(1)); assertFalse(rs.next()); } @Test public void testArrayFillFunctionInWhere7() throws Exception { Connection conn = DriverManager.getConnection(getUrl()); ResultSet rs; rs = conn.createStatement().executeQuery( "SELECT region_name FROM " + tableName + " WHERE ARRAY[2,2,2,2]=ARRAY_FILL(2,4)"); assertTrue(rs.next()); assertEquals("SF Bay Area", rs.getString(1)); assertFalse(rs.next()); } }