http://git-wip-us.apache.org/repos/asf/phoenix/blob/527f786a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java index cf86614..ddc965a 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ArrayIT.java @@ -19,35 +19,48 @@ package org.apache.phoenix.end2end; import static org.apache.phoenix.util.TestUtil.B_VALUE; import static org.apache.phoenix.util.TestUtil.ROW1; -import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; 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.SQLException; import java.sql.Types; import java.util.Properties; import org.apache.phoenix.query.BaseTest; -import org.apache.phoenix.schema.types.PhoenixArray; -import org.apache.phoenix.util.PropertiesUtil; -import org.apache.phoenix.util.SchemaUtil; -import org.apache.phoenix.util.StringUtil; -import org.junit.Test; -import com.google.common.primitives.Floats; +public abstract class ArrayIT extends ParallelStatsDisabledIT { -public class ArrayIT extends ParallelStatsDisabledIT { + protected static String createTableWithArray(String url, byte[][] bs, Object object) throws SQLException { + String tableName = generateUniqueName(); + String ddlStmt = "create table " + + tableName + + " (organization_id char(15) not null, \n" + + " entity_id char(15) not null,\n" + + " a_string_array varchar(100) array[3],\n" + + " b_string varchar(100),\n" + + " a_integer integer,\n" + + " a_date date,\n" + + " a_time time,\n" + + " a_timestamp timestamp,\n" + + " x_decimal decimal(31,10),\n" + + " x_long_array bigint[5],\n" + + " x_integer integer,\n" + + " a_byte_array tinyint array,\n" + + " a_short smallint,\n" + + " a_float float,\n" + + " a_double_array double array[],\n" + + " a_unsigned_float unsigned_float,\n" + + " a_unsigned_double unsigned_double \n" + + " CONSTRAINT pk PRIMARY KEY (organization_id, entity_id)\n" + + ")"; + BaseTest.createTestTable(url, ddlStmt, bs, null); + return tableName; + } - private static void initTablesWithArrays(String tableName, String tenantId, Date date, boolean useNull, String url) throws Exception { + protected static void initTablesWithArrays(String tableName, String tenantId, Date date, boolean useNull, String url) throws Exception { Properties props = new Properties(); Connection conn = DriverManager.getConnection(url, props); try { @@ -121,2504 +134,4 @@ public class ArrayIT extends ParallelStatsDisabledIT { conn.close(); } } - - @Test - public void testScanByArrayValue() throws Exception { - String tenantId = getOrganizationId(); - String tableName = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(tableName, tenantId, null, false, getUrl()); - String query = "SELECT a_double_array, /* comment ok? */ b_string, a_float FROM " + tableName + " WHERE ?=organization_id and ?=a_float"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - analyzeTable(conn, tableName); - try { - PreparedStatement statement = conn.prepareStatement(query); - statement.setString(1, tenantId); - statement.setFloat(2, 0.01f); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - // Need to support primitive - Double[] doubleArr = new Double[4]; - doubleArr[0] = 25.343; - doubleArr[1] = 36.763; - doubleArr[2] = 37.56; - doubleArr[3] = 386.63; - Array array = conn.createArrayOf("DOUBLE", - doubleArr); - PhoenixArray resultArray = (PhoenixArray) rs.getArray(1); - assertEquals(resultArray, array); - assertEquals("[25.343, 36.763, 37.56, 386.63]", rs.getString(1)); - assertEquals(rs.getString("B_string"), B_VALUE); - assertTrue(Floats.compare(rs.getFloat(3), 0.01f) == 0); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - private void analyzeTable(Connection conn, String tableWithArray) throws SQLException { - String analyse = "UPDATE STATISTICS "+tableWithArray; - PreparedStatement statement = conn.prepareStatement(analyse); - statement.execute(); - } - - @Test - public void testScanWithArrayInWhereClause() throws Exception { - String tenantId = getOrganizationId(); - String tableName = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(tableName, tenantId, null, false, getUrl()); - String query = "SELECT a_double_array, /* comment ok? */ b_string, a_float FROM " + tableName + " WHERE ?=organization_id and ?=a_byte_array"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - //TODO: samarth do we need this? - analyzeTable(conn, tableName); - try { - PreparedStatement statement = conn.prepareStatement(query); - statement.setString(1, tenantId); - // Need to support primitive - Byte[] byteArr = new Byte[2]; - byteArr[0] = 25; - byteArr[1] = 36; - Array array = conn.createArrayOf("TINYINT", byteArr); - statement.setArray(2, array); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - // Need to support primitive - Double[] doubleArr = new Double[4]; - doubleArr[0] = 25.343; - doubleArr[1] = 36.763; - doubleArr[2] = 37.56; - doubleArr[3] = 386.63; - array = conn.createArrayOf("DOUBLE", doubleArr); - Array resultArray = rs.getArray(1); - assertEquals(resultArray, array); - assertEquals("[25.343, 36.763, 37.56, 386.63]", rs.getString(1)); - assertEquals(rs.getString("B_string"), B_VALUE); - assertTrue(Floats.compare(rs.getFloat(3), 0.01f) == 0); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testScanWithNonFixedWidthArrayInWhereClause() throws Exception { - String tenantId = getOrganizationId(); - String tableName = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(tableName, tenantId, null, false, getUrl()); - String query = "SELECT a_double_array, /* comment ok? */ b_string, a_float FROM " + tableName + " WHERE ?=organization_id and ?=a_string_array"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - statement.setString(1, tenantId); - // Need to support primitive - String[] strArr = new String[4]; - strArr[0] = "ABC"; - strArr[1] = "CEDF"; - strArr[2] = "XYZWER"; - strArr[3] = "AB"; - Array array = conn.createArrayOf("VARCHAR", strArr); - statement.setArray(2, array); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - // Need to support primitive - Double[] doubleArr = new Double[4]; - doubleArr[0] = 25.343; - doubleArr[1] = 36.763; - doubleArr[2] = 37.56; - doubleArr[3] = 386.63; - array = conn.createArrayOf("DOUBLE", doubleArr); - Array resultArray = rs.getArray(1); - assertEquals(resultArray, array); - assertEquals("[25.343, 36.763, 37.56, 386.63]", rs.getString(1)); - assertEquals(rs.getString("B_string"), B_VALUE); - assertTrue(Floats.compare(rs.getFloat(3), 0.01f) == 0); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testScanWithNonFixedWidthArrayInSelectClause() throws Exception { - String tenantId = getOrganizationId(); - String tableName = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(tableName, tenantId, null, false, getUrl()); - String query = "SELECT a_string_array FROM " + tableName; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - String[] strArr = new String[4]; - strArr[0] = "ABC"; - strArr[1] = "CEDF"; - strArr[2] = "XYZWER"; - strArr[3] = "AB"; - Array array = conn.createArrayOf("VARCHAR", strArr); - PhoenixArray resultArray = (PhoenixArray) rs.getArray(1); - assertEquals(resultArray, array); - assertEquals("['ABC', 'CEDF', 'XYZWER', 'AB']", rs.getString(1)); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testSelectSpecificIndexOfAnArrayAsArrayFunction() - throws Exception { - String tenantId = getOrganizationId(); - String tableName = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(tableName, tenantId, null, false, getUrl()); - String query = "SELECT ARRAY_ELEM(a_double_array,2) FROM " + tableName; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - // Need to support primitive - Double[] doubleArr = new Double[1]; - doubleArr[0] = 36.763; - conn.createArrayOf("DOUBLE", doubleArr); - Double result = rs.getDouble(1); - assertEquals(doubleArr[0], result); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testSelectSpecificIndexOfAnArray() throws Exception { - String tenantId = getOrganizationId(); - String tableName = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(tableName, tenantId, null, false, getUrl()); - String query = "SELECT a_double_array[3] FROM " + tableName; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - // Need to support primitive - Double[] doubleArr = new Double[1]; - doubleArr[0] = 37.56; - Double result = rs.getDouble(1); - assertEquals(doubleArr[0], result); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testCaseWithArray() throws Exception { - String tenantId = getOrganizationId(); - String tableName = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(tableName, tenantId, null, false, getUrl()); - String query = "SELECT CASE WHEN A_INTEGER = 1 THEN a_double_array ELSE null END [3] FROM " + tableName; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - // Need to support primitive - Double[] doubleArr = new Double[1]; - doubleArr[0] = 37.56; - Double result = rs.getDouble(1); - assertEquals(doubleArr[0], result); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testUpsertValuesWithArray() throws Exception { - String tenantId = getOrganizationId(); - String tableName = createTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - String query = "upsert into " + tableName + " (ORGANIZATION_ID,ENTITY_ID,a_double_array) values('" + tenantId - + "','00A123122312312',ARRAY[2.0,345.8])"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - // at - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - int executeUpdate = statement.executeUpdate(); - assertEquals(1, executeUpdate); - conn.commit(); - statement.close(); - conn.close(); - // create another connection - props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - query = "SELECT ARRAY_ELEM(a_double_array,2) FROM " + tableName; - statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - // Need to support primitive - Double[] doubleArr = new Double[1]; - doubleArr[0] = 345.8d; - conn.createArrayOf("DOUBLE", doubleArr); - Double result = rs.getDouble(1); - assertEquals(doubleArr[0], result); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testUpsertSelectWithSelectAsSubQuery1() throws Exception { - String tenantId = getOrganizationId(); - String table1 = createTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - Connection conn = null; - try { - String table2 = createSimpleTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - initSimpleArrayTable(table2, tenantId, null, false); - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String query = "upsert into " + table1 + " (ORGANIZATION_ID,ENTITY_ID,a_double_array) " - + "SELECT organization_id, entity_id, a_double_array FROM " + table2 - + " WHERE a_double_array[2] = 89.96"; - PreparedStatement statement = conn.prepareStatement(query); - int executeUpdate = statement.executeUpdate(); - assertEquals(1, executeUpdate); - conn.commit(); - statement.close(); - conn.close(); - // create another connection - props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - query = "SELECT ARRAY_ELEM(a_double_array,2) FROM " + table1; - statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - // Need to support primitive - Double[] doubleArr = new Double[1]; - doubleArr[0] = 89.96d; - Double result = rs.getDouble(1); - assertEquals(result, doubleArr[0]); - assertFalse(rs.next()); - - } finally { - if (conn != null) { - conn.close(); - } - } - } - - @Test - public void testArraySelectWithORCondition() throws Exception { - String tenantId = getOrganizationId(); - Connection conn = null; - try { - String table = createSimpleTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - initSimpleArrayTable(table, tenantId, null, false); - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String query = "SELECT a_double_array[1] FROM " + table - + " WHERE a_double_array[2] = 89.96 or a_char_array[0] = 'a'"; - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - Double[] doubleArr = new Double[1]; - doubleArr[0] = 64.87d; - Double result = rs.getDouble(1); - assertEquals(result, doubleArr[0]); - assertFalse(rs.next()); - - } finally { - if (conn != null) { - conn.close(); - } - } - } - - @Test - public void testArraySelectWithANY() throws Exception { - String tenantId = getOrganizationId(); - Connection conn = null; - try { - String table = createSimpleTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - initSimpleArrayTable(table, tenantId, null, false); - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String query = "SELECT a_double_array[1] FROM " + table - + " WHERE CAST(89.96 AS DOUBLE) = ANY(a_double_array)"; - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - Double[] doubleArr = new Double[1]; - doubleArr[0] = 64.87d; - Double result = rs.getDouble(1); - assertEquals(result, doubleArr[0]); - assertFalse(rs.next()); - } finally { - if (conn != null) { - conn.close(); - } - } - } - - @Test - public void testArraySelectWithALL() throws Exception { - String tenantId = getOrganizationId(); - Connection conn = null; - try { - String table = createSimpleTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - initSimpleArrayTable(table, tenantId, null, false); - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String query = "SELECT a_double_array[1] FROM " + table - + " WHERE CAST(64.87 as DOUBLE) = ALL(a_double_array)"; - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertFalse(rs.next()); - } finally { - if (conn != null) { - conn.close(); - } - } - } - - @Test - public void testArraySelectWithANYCombinedWithOR() throws Exception { - String tenantId = getOrganizationId(); - Connection conn = null; - try { - String table = createSimpleTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - initSimpleArrayTable(table, tenantId, null, false); - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String query = "SELECT a_double_array[1] FROM " + table - + " WHERE a_char_array[0] = 'f' or CAST(89.96 AS DOUBLE) > ANY(a_double_array)"; - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - Double[] doubleArr = new Double[1]; - doubleArr[0] = 64.87d; - Double result = rs.getDouble(1); - assertEquals(result, doubleArr[0]); - assertFalse(rs.next()); - } finally { - if (conn != null) { - conn.close(); - } - } - } - - @Test - public void testArraySelectWithALLCombinedWithOR() throws Exception { - - String tenantId = getOrganizationId(); - Connection conn = null; - try { - String table = createSimpleTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - initSimpleArrayTable(table, tenantId, null, false); - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String query = "SELECT a_double_array[1], a_double_array[2] FROM " + table - + " WHERE a_char_array[0] = 'f' or CAST(100.0 AS DOUBLE) > ALL(a_double_array)"; - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - Double[] doubleArr = new Double[1]; - doubleArr[0] = 64.87d; - Double result = rs.getDouble(1); - assertEquals(result, doubleArr[0]); - doubleArr = new Double[1]; - doubleArr[0] = 89.96d; - result = rs.getDouble(2); - assertEquals(result, doubleArr[0]); - } finally { - if (conn != null) { - conn.close(); - } - } - } - - @Test - public void testArraySelectWithANYUsingVarLengthArray() throws Exception { - Connection conn = null; - try { - - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String query = "SELECT a_string_array[1] FROM " + table - + " WHERE 'XYZWER' = ANY(a_string_array)"; - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - String[] strArr = new String[1]; - strArr[0] = "ABC"; - String result = rs.getString(1); - assertEquals(result, strArr[0]); - assertFalse(rs.next()); - query = "SELECT a_string_array[1] FROM " + table + " WHERE 'AB' = ANY(a_string_array)"; - statement = conn.prepareStatement(query); - rs = statement.executeQuery(); - assertTrue(rs.next()); - result = rs.getString(1); - assertEquals(result, strArr[0]); - assertFalse(rs.next()); - } finally { - if (conn != null) { - conn.close(); - } - } - } - - @Test - public void testSelectWithArrayWithColumnRef() throws Exception { - - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT a_integer,ARRAY[1,2,a_integer] FROM " + table + " where organization_id = '" - + tenantId + "'"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - int val = rs.getInt(1); - assertEquals(val, 1); - Array array = rs.getArray(2); - // Need to support primitive - Integer[] intArr = new Integer[3]; - intArr[0] = 1; - intArr[1] = 2; - intArr[2] = 1; - Array resultArr = conn.createArrayOf("INTEGER", intArr); - assertEquals(resultArr, array); - assertEquals("[1, 2, 1]", rs.getString(2)); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testSelectWithArrayWithColumnRefWithVarLengthArray() throws Exception { - - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT b_string,ARRAY['abc','defgh',b_string] FROM " + table + " where organization_id = '" - + tenantId + "'"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - String val = rs.getString(1); - assertEquals(val, "b"); - Array array = rs.getArray(2); - // Need to support primitive - String[] strArr = new String[3]; - strArr[0] = "abc"; - strArr[1] = "defgh"; - strArr[2] = "b"; - Array resultArr = conn.createArrayOf("VARCHAR", strArr); - assertEquals(resultArr, array); - // since array is var length, last string element is messed up - String expectedPrefix = "['abc', 'defgh', 'b"; - assertTrue("Expected to start with " + expectedPrefix, - rs.getString(2).startsWith(expectedPrefix)); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testSelectWithArrayWithColumnRefWithVarLengthArrayWithNullValue() throws Exception { - - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT b_string,ARRAY['abc',null,'bcd',null,null,b_string] FROM " + table + " where organization_id = '" - + tenantId + "'"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - String val = rs.getString(1); - assertEquals(val, "b"); - Array array = rs.getArray(2); - // Need to support primitive - String[] strArr = new String[6]; - strArr[0] = "abc"; - strArr[1] = null; - strArr[2] = "bcd"; - strArr[3] = null; - strArr[4] = null; - strArr[5] = "b"; - Array resultArr = conn.createArrayOf("VARCHAR", strArr); - assertEquals(resultArr, array); - String expectedPrefix = "['abc', null, 'bcd', null, null, 'b"; - assertTrue("Expected to start with " + expectedPrefix, - rs.getString(2).startsWith(expectedPrefix)); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testUpsertSelectWithColumnRef() throws Exception { - - String tenantId = getOrganizationId(); - String table1 = createTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - Connection conn = null; - try { - String table2 = createSimpleTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - initSimpleArrayTable(table2, tenantId, null, false); - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String query = "upsert into " + table1 + " (ORGANIZATION_ID,ENTITY_ID, a_unsigned_double, a_double_array) " - + "SELECT organization_id, entity_id, x_double, ARRAY[23.4, 22.1, x_double] FROM " + table2 - + " WHERE a_double_array[2] = 89.96"; - PreparedStatement statement = conn.prepareStatement(query); - int executeUpdate = statement.executeUpdate(); - assertEquals(1, executeUpdate); - conn.commit(); - statement.close(); - conn.close(); - // create another connection - props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - query = "SELECT ARRAY_ELEM(a_double_array,2) FROM " + table1; - statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - // Need to support primitive - Double[] doubleArr = new Double[1]; - doubleArr[0] = 22.1d; - Double result = rs.getDouble(1); - assertEquals(result, doubleArr[0]); - assertFalse(rs.next()); - - } finally { - if (conn != null) { - conn.close(); - } - } - } - - @Test - public void testCharArraySpecificIndex() throws Exception { - - String tenantId = getOrganizationId(); - String table = createSimpleTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - initSimpleArrayTable(table, tenantId, null, false); - String query = "SELECT a_char_array[2] FROM " + table; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - String[] charArr = new String[1]; - charArr[0] = "b"; - String result = rs.getString(1); - assertEquals(charArr[0], result); - } finally { - conn.close(); - } - } - - @Test - public void testArrayWithDescOrder() throws Exception { - Connection conn; - PreparedStatement stmt; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - conn.createStatement().execute( - "CREATE TABLE " + table + " ( k VARCHAR, a_string_array VARCHAR(100) ARRAY[4], b_string_array VARCHAR(100) ARRAY[4] \n" - + " CONSTRAINT pk PRIMARY KEY (k, b_string_array DESC)) \n"); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - stmt = conn.prepareStatement("UPSERT INTO " + table + " VALUES(?,?,?)"); - stmt.setString(1, "a"); - String[] s = new String[] { "abc", "def", "ghi", "jkll", null, null, "xxx" }; - Array array = conn.createArrayOf("VARCHAR", s); - stmt.setArray(2, array); - s = new String[] { "abc", "def", "ghi", "jkll", null, null, null, "xxx" }; - array = conn.createArrayOf("VARCHAR", s); - stmt.setArray(3, array); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.createStatement().executeQuery("SELECT b_string_array FROM " + table); - assertTrue(rs.next()); - PhoenixArray strArr = (PhoenixArray)rs.getArray(1); - assertEquals(array, strArr); - assertEquals("['abc', 'def', 'ghi', 'jkll', null, null, null, 'xxx']", rs.getString(1)); - conn.close(); - } - - @Test - public void testArrayWithFloatArray() throws Exception { - Connection conn; - PreparedStatement stmt; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - conn.createStatement().execute("CREATE TABLE " + table + " ( k VARCHAR PRIMARY KEY, a Float ARRAY[])"); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - stmt = conn.prepareStatement("UPSERT INTO " + table + " VALUES('a',ARRAY[2.0,3.0])"); - int res = stmt.executeUpdate(); - assertEquals(1, res); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.createStatement().executeQuery("SELECT ARRAY_ELEM(a,2) FROM " + table); - assertTrue(rs.next()); - Float f = new Float(3.0); - assertEquals(f, (Float)rs.getFloat(1)); - conn.close(); - } - - @Test - public void testArrayWithVarCharArray() throws Exception { - Connection conn; - PreparedStatement stmt; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - conn.createStatement().execute("CREATE TABLE " + table + " ( k VARCHAR PRIMARY KEY, a VARCHAR ARRAY[])"); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - stmt = conn.prepareStatement("UPSERT INTO " + table + " VALUES('a',ARRAY['a',null])"); - int res = stmt.executeUpdate(); - assertEquals(1, res); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.createStatement().executeQuery("SELECT ARRAY_ELEM(a,2) FROM " + table); - assertTrue(rs.next()); - assertEquals(null, rs.getString(1)); - conn.close(); - } - - @Test - public void testArraySelectSingleArrayElemWithCast() throws Exception { - Connection conn; - PreparedStatement stmt; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - conn.createStatement().execute("CREATE TABLE " + table + " ( k VARCHAR PRIMARY KEY, a bigint ARRAY[])"); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - stmt = conn.prepareStatement("UPSERT INTO " + table + " VALUES(?,?)"); - stmt.setString(1, "a"); - Long[] s = new Long[] {1l, 2l}; - Array array = conn.createArrayOf("BIGINT", s); - stmt.setArray(2, array); - stmt.execute(); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.createStatement().executeQuery("SELECT k, CAST(a[2] AS DOUBLE) FROM " + table); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - Double d = new Double(2.0); - assertEquals(d, (Double)rs.getDouble(2)); - conn.close(); - } - - @Test - public void testArraySelectGetString() throws Exception { - Connection conn; - PreparedStatement stmt; - - String tenantId = getOrganizationId(); - - // create the table - String tableName = createTableWithAllArrayTypes(getUrl(), getDefaultSplits(tenantId), null); - - // populate the table with data - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - stmt = - conn.prepareStatement("UPSERT INTO " - + tableName - + "(ORGANIZATION_ID, ENTITY_ID, BOOLEAN_ARRAY, BYTE_ARRAY, DOUBLE_ARRAY, FLOAT_ARRAY, INT_ARRAY, LONG_ARRAY, SHORT_ARRAY, STRING_ARRAY)\n" - + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); - stmt.setString(1, tenantId); - stmt.setString(2, ROW1); - // boolean array - Array boolArray = conn.createArrayOf("BOOLEAN", new Boolean[] { true, false }); - int boolIndex = 3; - stmt.setArray(boolIndex, boolArray); - // byte array - Array byteArray = conn.createArrayOf("TINYINT", new Byte[] { 11, 22 }); - int byteIndex = 4; - stmt.setArray(byteIndex, byteArray); - // double array - Array doubleArray = conn.createArrayOf("DOUBLE", new Double[] { 67.78, 78.89 }); - int doubleIndex = 5; - stmt.setArray(doubleIndex, doubleArray); - // float array - Array floatArray = conn.createArrayOf("FLOAT", new Float[] { 12.23f, 45.56f }); - int floatIndex = 6; - stmt.setArray(floatIndex, floatArray); - // int array - Array intArray = conn.createArrayOf("INTEGER", new Integer[] { 5555, 6666 }); - int intIndex = 7; - stmt.setArray(intIndex, intArray); - // long array - Array longArray = conn.createArrayOf("BIGINT", new Long[] { 7777777L, 8888888L }); - int longIndex = 8; - stmt.setArray(longIndex, longArray); - // short array - Array shortArray = conn.createArrayOf("SMALLINT", new Short[] { 333, 444 }); - int shortIndex = 9; - stmt.setArray(shortIndex, shortArray); - // create character array - Array stringArray = conn.createArrayOf("VARCHAR", new String[] { "a", "b" }); - int stringIndex = 10; - stmt.setArray(stringIndex, stringArray); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - stmt = - conn.prepareStatement("SELECT organization_id, entity_id, boolean_array, byte_array, double_array, float_array, int_array, long_array, short_array, string_array FROM " - + tableName); - //TODO: samarth check if this is needed - analyzeTable(conn, tableName); - - ResultSet rs = stmt.executeQuery(); - assertTrue(rs.next()); - - assertEquals(tenantId, rs.getString(1)); - assertEquals(ROW1, rs.getString(2)); - - assertArrayGetString(rs, boolIndex, boolArray, "true, false"); - assertArrayGetString(rs, byteIndex, byteArray, "11, 22"); - assertArrayGetString(rs, doubleIndex, doubleArray, "67.78, 78.89"); - assertArrayGetString(rs, floatIndex, floatArray, "12.23, 45.56"); - assertArrayGetString(rs, intIndex, intArray, "5555, 6666"); - assertArrayGetString(rs, longIndex, longArray, "7777777, 8888888"); - assertArrayGetString(rs, shortIndex, shortArray, "333, 444"); - assertArrayGetString(rs, stringIndex, stringArray, "'a', 'b'"); - conn.close(); - } - - private void assertArrayGetString(ResultSet rs, int arrayIndex, Array expectedArray, String expectedString) - throws SQLException { - assertEquals(expectedArray, rs.getArray(arrayIndex)); - assertEquals("[" + expectedString + "]", rs.getString(arrayIndex)); - } - - @Test - public void testArrayWithCast() throws Exception { - Connection conn; - PreparedStatement stmt; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - conn.createStatement().execute("CREATE TABLE " + table + " ( k VARCHAR PRIMARY KEY, a bigint ARRAY[])"); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - stmt = conn.prepareStatement("UPSERT INTO " + table + " VALUES(?,?)"); - stmt.setString(1, "a"); - Long[] s = new Long[] { 1l, 2l }; - Array array = conn.createArrayOf("BIGINT", s); - stmt.setArray(2, array); - stmt.execute(); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.createStatement().executeQuery("SELECT CAST(a AS DOUBLE []) FROM " + table); - assertTrue(rs.next()); - Double[] d = new Double[] { 1.0, 2.0 }; - array = conn.createArrayOf("DOUBLE", d); - PhoenixArray arr = (PhoenixArray)rs.getArray(1); - assertEquals(array, arr); - assertEquals("[1.0, 2.0]", rs.getString(1)); - conn.close(); - } - - @Test - public void testArrayWithCastForVarLengthArr() throws Exception { - Connection conn; - PreparedStatement stmt; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - conn.createStatement().execute("CREATE TABLE " + table + " ( k VARCHAR PRIMARY KEY, a VARCHAR(5) ARRAY)"); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - stmt = conn.prepareStatement("UPSERT INTO " + table + " VALUES(?,?)"); - stmt.setString(1, "a"); - String[] s = new String[] { "1", "2" }; - PhoenixArray array = (PhoenixArray)conn.createArrayOf("VARCHAR", s); - stmt.setArray(2, array); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.createStatement().executeQuery("SELECT CAST(a AS CHAR ARRAY) FROM " + table); - assertTrue(rs.next()); - PhoenixArray arr = (PhoenixArray)rs.getArray(1); - String[] array2 = (String[])array.getArray(); - String[] array3 = (String[])arr.getArray(); - assertEquals(array2[0], array3[0]); - assertEquals(array2[1], array3[1]); - assertEquals("['1', '2']", rs.getString(1)); - conn.close(); - } - - @Test - public void testFixedWidthCharArray() throws Exception { - Connection conn; - PreparedStatement stmt; - ResultSet rs; - - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - conn.createStatement().execute("CREATE TABLE " + table + " ( k VARCHAR PRIMARY KEY, a CHAR(5) ARRAY)"); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.getMetaData().getColumns(null, null, table, "A"); - assertTrue(rs.next()); - assertEquals(5, rs.getInt("COLUMN_SIZE")); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - stmt = conn.prepareStatement("UPSERT INTO " + table + " VALUES(?,?)"); - stmt.setString(1, "a"); - String[] s = new String[] {"1","2"}; - Array array = conn.createArrayOf("CHAR", s); - stmt.setArray(2, array); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.createStatement().executeQuery("SELECT k, a[2] FROM " + table); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("2",rs.getString(2)); - conn.close(); - } - - @Test - public void testSelectArrayUsingUpsertLikeSyntax() throws Exception { - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT a_double_array FROM " + table + " WHERE a_double_array = CAST(ARRAY [ 25.343, 36.763, 37.56,386.63] AS DOUBLE ARRAY)"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - Double[] doubleArr = new Double[4]; - doubleArr[0] = 25.343; - doubleArr[1] = 36.763; - doubleArr[2] = 37.56; - doubleArr[3] = 386.63; - Array array = conn.createArrayOf("DOUBLE", doubleArr); - PhoenixArray resultArray = (PhoenixArray) rs.getArray(1); - assertEquals(resultArray, array); - assertEquals("[25.343, 36.763, 37.56, 386.63]", rs.getString(1)); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testArrayIndexUsedInWhereClause() throws Exception { - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - int a_index = 0; - String query = "SELECT a_double_array[2] FROM " + table + " where a_double_array["+a_index+"2]<?"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - Double[] doubleArr = new Double[1]; - doubleArr[0] = 40.0; - conn.createArrayOf("DOUBLE", doubleArr); - statement.setDouble(1, 40.0d); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - // Need to support primitive - doubleArr = new Double[1]; - doubleArr[0] = 36.763; - Double result = rs.getDouble(1); - assertEquals(doubleArr[0], result); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testArrayIndexUsedInGroupByClause() throws Exception { - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT a_double_array[2] FROM " + table + " GROUP BY a_double_array[2]"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - Double[] doubleArr = new Double[1]; - doubleArr[0] = 40.0; - conn.createArrayOf("DOUBLE", doubleArr); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - doubleArr = new Double[1]; - doubleArr[0] = 36.763; - Double result = rs.getDouble(1); - assertEquals(doubleArr[0], result); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testVariableLengthArrayWithNullValue() throws Exception { - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, true, getUrl()); - String query = "SELECT a_string_array[2] FROM " + table; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - String[] strArr = new String[1]; - strArr[0] = "XYZWER"; - String result = rs.getString(1); - assertNull(result); - } finally { - conn.close(); - } - } - - @Test - public void testSelectSpecificIndexOfAVariableArrayAlongWithAnotherColumn1() throws Exception { - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT a_string_array[3],A_INTEGER FROM " + table; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - String[] strArr = new String[1]; - strArr[0] = "XYZWER"; - String result = rs.getString(1); - assertEquals(strArr[0], result); - int a_integer = rs.getInt(2); - assertEquals(1, a_integer); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testSelectSpecificIndexOfAVariableArrayAlongWithAnotherColumn2() throws Exception { - - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT A_INTEGER, a_string_array[3] FROM " + table; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - String[] strArr = new String[1]; - strArr[0] = "XYZWER"; - int a_integer = rs.getInt(1); - assertEquals(1, a_integer); - String result = rs.getString(2); - assertEquals(strArr[0], result); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testSelectMultipleArrayColumns() throws Exception { - - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT a_string_array[3], a_double_array[2] FROM " + table; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - String[] strArr = new String[1]; - strArr[0] = "XYZWER"; - Double[] doubleArr = new Double[1]; - doubleArr[0] = 36.763d; - Double a_double = rs.getDouble(2); - assertEquals(doubleArr[0], a_double); - String result = rs.getString(1); - assertEquals(strArr[0], result); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testSelectSameArrayColumnMultipleTimesWithDifferentIndices() throws Exception { - - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT a_string_array[1], a_string_array[2], " + - "a_string_array[3], a_double_array[1], a_double_array[2], a_double_array[3] " + - "FROM " + table; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - assertEquals("ABC", rs.getString(1)); - assertEquals("CEDF", rs.getString(2)); - assertEquals("XYZWER", rs.getString(3)); - assertEquals(25.343, rs.getDouble(4), 0.0); - assertEquals(36.763, rs.getDouble(5), 0.0); - assertEquals(37.56, rs.getDouble(6), 0.0); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testSelectSameArrayColumnMultipleTimesWithSameIndices() throws Exception { - - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT a_string_array[3], a_string_array[3] FROM " + table; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - String[] strArr = new String[1]; - strArr[0] = "XYZWER"; - String result = rs.getString(1); - assertEquals(strArr[0], result); - result = rs.getString(2); - assertEquals(strArr[0], result); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testSelectSpecificIndexOfAVariableArray() throws Exception { - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT a_string_array[3] FROM " + table; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - String[] strArr = new String[1]; - strArr[0] = "XYZWER"; - String result = rs.getString(1); - assertEquals(strArr[0], result); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testWithOutOfRangeIndex() throws Exception { - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT a_double_array[100] FROM " + table; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - PhoenixArray resultArray = (PhoenixArray) rs.getArray(1); - assertNull(resultArray); - } finally { - conn.close(); - } - } - - @Test - public void testArrayLengthFunctionForVariableLength() throws Exception { - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT ARRAY_LENGTH(a_string_array) FROM " + table; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - int result = rs.getInt(1); - assertEquals(result, 4); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - - @Test - public void testArrayLengthFunctionForFixedLength() throws Exception { - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - initTablesWithArrays(table, tenantId, null, false, getUrl()); - String query = "SELECT ARRAY_LENGTH(a_double_array) FROM " + table; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - int result = rs.getInt(1); - assertEquals(result, 4); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testArraySizeRoundtrip() throws Exception { - - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), - getDefaultSplits(tenantId), null); - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - ResultSet rs = conn.getMetaData().getColumns(null, null, StringUtil.escapeLike(table), StringUtil.escapeLike(SchemaUtil.normalizeIdentifier("x_long_array"))); - assertTrue(rs.next()); - assertEquals(5, rs.getInt("ARRAY_SIZE")); - assertFalse(rs.next()); - - rs = conn.getMetaData().getColumns(null, null, StringUtil.escapeLike(table), StringUtil.escapeLike(SchemaUtil.normalizeIdentifier("a_string_array"))); - assertTrue(rs.next()); - assertEquals(3, rs.getInt("ARRAY_SIZE")); - assertFalse(rs.next()); - - rs = conn.getMetaData().getColumns(null, null, StringUtil.escapeLike(table), StringUtil.escapeLike(SchemaUtil.normalizeIdentifier("a_double_array"))); - assertTrue(rs.next()); - assertEquals(0, rs.getInt("ARRAY_SIZE")); - assertTrue(rs.wasNull()); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testVarLengthArrComparisonInWhereClauseWithSameArrays() throws Exception { - Connection conn; - PreparedStatement stmt; - ResultSet rs; - - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - conn.createStatement() - .execute( - "CREATE TABLE " + table + " ( k VARCHAR PRIMARY KEY, a_string_array VARCHAR(100) ARRAY[4], b_string_array VARCHAR(100) ARRAY[4])"); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - stmt = conn.prepareStatement("UPSERT INTO " + table + " VALUES(?,?,?)"); - stmt.setString(1, "a"); - String[] s = new String[] {"abc","def", "ghi","jkl"}; - Array array = conn.createArrayOf("VARCHAR", s); - stmt.setArray(2, array); - s = new String[] {"abc","def", "ghi","jkl"}; - array = conn.createArrayOf("VARCHAR", s); - stmt.setArray(3, array); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.createStatement().executeQuery("SELECT k, a_string_array[2] FROM " + table + " where a_string_array=b_string_array"); - assertTrue(rs.next()); - assertEquals("a",rs.getString(1)); - assertEquals("def",rs.getString(2)); - conn.close(); - } - - @Test - public void testVarLengthArrComparisonInWhereClauseWithDiffSizeArrays() throws Exception { - Connection conn; - PreparedStatement stmt; - ResultSet rs; - - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - conn.createStatement() - .execute( - "CREATE TABLE " + table + " ( k VARCHAR PRIMARY KEY, a_string_array VARCHAR(100) ARRAY[4], b_string_array VARCHAR(100) ARRAY[4])"); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - stmt = conn.prepareStatement("UPSERT INTO " + table + " VALUES(?,?,?)"); - stmt.setString(1, "a"); - String[] s = new String[] { "abc", "def", "ghi", "jkll" }; - Array array = conn.createArrayOf("VARCHAR", s); - stmt.setArray(2, array); - s = new String[] { "abc", "def", "ghi", "jklm" }; - array = conn.createArrayOf("VARCHAR", s); - stmt.setArray(3, array); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.createStatement().executeQuery( - "SELECT k, a_string_array[2] FROM " + table + " where a_string_array<b_string_array"); - assertTrue(rs.next()); - assertEquals("a", rs.getString(1)); - assertEquals("def", rs.getString(2)); - conn.close(); - } - - @Test - public void testVarLengthArrComparisonWithNulls() throws Exception { - Connection conn; - PreparedStatement stmt; - ResultSet rs; - - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - conn.createStatement() - .execute( - "CREATE TABLE " + table + " ( k VARCHAR PRIMARY KEY, a_string_array VARCHAR(100) ARRAY[4], b_string_array VARCHAR(100) ARRAY[4])"); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - stmt = conn.prepareStatement("UPSERT INTO " + table + " VALUES(?,?,?)"); - stmt.setString(1, "a"); - String[] s = new String[] { "abc", "def", "ghi", "jkll", null, null, "xxx" }; - Array array = conn.createArrayOf("VARCHAR", s); - stmt.setArray(2, array); - s = new String[] { "abc", "def", "ghi", "jkll", null, null, null, "xxx" }; - array = conn.createArrayOf("VARCHAR", s); - stmt.setArray(3, array); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.createStatement().executeQuery( - "SELECT k, a_string_array[2] FROM " + table + " where a_string_array>b_string_array"); - assertTrue(rs.next()); - assertEquals("a", rs.getString(1)); - assertEquals("def", rs.getString(2)); - conn.close(); - } - - @Test - public void testUpsertValuesWithNull() throws Exception { - - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - String query = "upsert into " + table + " (ORGANIZATION_ID,ENTITY_ID,a_double_array) values('" + tenantId - + "','00A123122312312',null)"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - // at - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - int executeUpdate = statement.executeUpdate(); - assertEquals(1, executeUpdate); - conn.commit(); - statement.close(); - conn.close(); - // create another connection - props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - query = "SELECT ARRAY_ELEM(a_double_array,2) FROM " + table; - statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - // Need to support primitive - Double[] doubleArr = new Double[1]; - doubleArr[0] = 0.0d; - conn.createArrayOf("DOUBLE", doubleArr); - Double result = rs.getDouble(1); - assertEquals(doubleArr[0], result); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testUpsertValuesWithNullUsingPreparedStmt() throws Exception { - - String tenantId = getOrganizationId(); - String table = createTableWithArray(getUrl(), getDefaultSplits(tenantId), null); - String query = "upsert into " + table + " (ORGANIZATION_ID,ENTITY_ID,a_string_array) values(?, ?, ?)"; - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - // at - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement statement = conn.prepareStatement(query); - statement.setString(1, tenantId); - statement.setString(2, "00A123122312312"); - statement.setNull(3, Types.ARRAY); - int executeUpdate = statement.executeUpdate(); - assertEquals(1, executeUpdate); - conn.commit(); - statement.close(); - conn.close(); - // create another connection - props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - query = "SELECT ARRAY_ELEM(a_string_array,1) FROM " + table; - statement = conn.prepareStatement(query); - ResultSet rs = statement.executeQuery(); - assertTrue(rs.next()); - String[] strArr = new String[1]; - strArr[0] = null; - conn.createArrayOf("VARCHAR", strArr); - String result = rs.getString(1); - assertEquals(strArr[0], result); - assertFalse(rs.next()); - } finally { - conn.close(); - } - } - - @Test - public void testPKWithArray() throws Exception { - Connection conn; - PreparedStatement stmt; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - conn.createStatement() - .execute( - "CREATE TABLE " + table + " ( k VARCHAR, a_string_array VARCHAR(100) ARRAY[4], b_string_array VARCHAR(100) ARRAY[4] \n" - + " CONSTRAINT pk PRIMARY KEY (k, b_string_array)) \n"); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - stmt = conn.prepareStatement("UPSERT INTO " + table + " VALUES(?,?,?)"); - stmt.setString(1, "a"); - String[] s = new String[] { "abc", "def", "ghi", "jkll", null, null, "xxx" }; - Array array = conn.createArrayOf("VARCHAR", s); - stmt.setArray(2, array); - s = new String[] { "abc", "def", "ghi", "jkll", null, null, null, "xxx" }; - array = conn.createArrayOf("VARCHAR", s); - stmt.setArray(3, array); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.createStatement().executeQuery( - "SELECT k, a_string_array[2] FROM " + table + " where b_string_array[8]='xxx'"); - assertTrue(rs.next()); - assertEquals("a", rs.getString(1)); - assertEquals("def", rs.getString(2)); - conn.close(); - } - - @Test - public void testPKWithArrayNotInEnd() throws Exception { - Connection conn; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - try { - conn.createStatement().execute( - "CREATE TABLE " + table + " ( a_string_array VARCHAR(100) ARRAY[4], b_string_array VARCHAR(100) ARRAY[4], k VARCHAR \n" - + " CONSTRAINT pk PRIMARY KEY (b_string_array, k))"); - conn.close(); - fail(); - } catch (SQLException e) { - } finally { - if (conn != null) { - conn.close(); - } - } - - } - - @Test - public void testArrayRefToLiteral() throws Exception { - Connection conn; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - try { - PreparedStatement stmt = conn.prepareStatement("select ?[2] from \"SYSTEM\".\"catalog\" limit 1"); - Array array = conn.createArrayOf("CHAR", new String[] {"a","b","c"}); - stmt.setArray(1, array); - ResultSet rs = stmt.executeQuery(); - assertTrue(rs.next()); - assertEquals("b", rs.getString(1)); - assertFalse(rs.next()); - } catch (SQLException e) { - } finally { - if (conn != null) { - conn.close(); - } - } - - } - - private static String createTableWithAllArrayTypes(String url, byte[][] bs, Object object) throws SQLException { - String tableName = generateUniqueName(); - String ddlStmt = "create table " - + tableName - + " (organization_id char(15) not null, \n" - + " entity_id char(15) not null,\n" - + " boolean_array boolean array,\n" - + " byte_array tinyint array,\n" - + " double_array double array[],\n" - + " float_array float array,\n" - + " int_array integer array,\n" - + " long_array bigint[5],\n" - + " short_array smallint array,\n" - + " string_array varchar(100) array[3],\n" - + " CONSTRAINT pk PRIMARY KEY (organization_id, entity_id)\n" - + ")"; - BaseTest.createTestTable(url, ddlStmt, bs, null); - return tableName; - } - - private static String createTableWithArray(String url, byte[][] bs, Object object) throws SQLException { - String tableName = generateUniqueName(); - String ddlStmt = "create table " - + tableName - + " (organization_id char(15) not null, \n" - + " entity_id char(15) not null,\n" - + " a_string_array varchar(100) array[3],\n" - + " b_string varchar(100),\n" - + " a_integer integer,\n" - + " a_date date,\n" - + " a_time time,\n" - + " a_timestamp timestamp,\n" - + " x_decimal decimal(31,10),\n" - + " x_long_array bigint[5],\n" - + " x_integer integer,\n" - + " a_byte_array tinyint array,\n" - + " a_short smallint,\n" - + " a_float float,\n" - + " a_double_array double array[],\n" - + " a_unsigned_float unsigned_float,\n" - + " a_unsigned_double unsigned_double \n" - + " CONSTRAINT pk PRIMARY KEY (organization_id, entity_id)\n" - + ")"; - BaseTest.createTestTable(url, ddlStmt, bs, null); - return tableName; - } - - private static String createSimpleTableWithArray(String url, byte[][] bs, Object object) throws SQLException { - String tableName = generateUniqueName(); - String ddlStmt = "create table " - + tableName - + " (organization_id char(15) not null, \n" - + " entity_id char(15) not null,\n" - + " x_double double,\n" - + " a_double_array double array[],\n" - + " a_char_array char(5) array[],\n" - + " CONSTRAINT pk PRIMARY KEY (organization_id, entity_id)\n" - + ")"; - BaseTest.createTestTable(url, ddlStmt, bs, null); - return tableName; - } - - private static void initSimpleArrayTable(String tableName, String tenantId, Date date, boolean useNull) throws Exception { - Properties props = new Properties(); - - Connection conn = DriverManager.getConnection(getUrl(), props); - try { - // Insert all rows at ts - PreparedStatement stmt = conn.prepareStatement( - "upsert into " + tableName + - "(" + - " ORGANIZATION_ID, " + - " ENTITY_ID, " + - " x_double, " + - " a_double_array, a_char_array)" + - "VALUES (?, ?, ?, ?, ?)"); - stmt.setString(1, tenantId); - stmt.setString(2, ROW1); - stmt.setDouble(3, 1.2d); - // Need to support primitive - Double[] doubleArr = new Double[2]; - doubleArr[0] = 64.87; - doubleArr[1] = 89.96; - //doubleArr[2] = 9.9; - Array array = conn.createArrayOf("DOUBLE", doubleArr); - stmt.setArray(4, array); - - // create character array - String[] charArr = new String[2]; - charArr[0] = "a"; - charArr[1] = "b"; - array = conn.createArrayOf("CHAR", charArr); - stmt.setArray(5, array); - stmt.execute(); - - conn.commit(); - } finally { - conn.close(); - } - } - - @Test - public void testArrayConstructorWithMultipleRows1() throws Exception { - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - String ddl = "CREATE TABLE " + table + " (region_name VARCHAR PRIMARY KEY, a INTEGER, b INTEGER)"; - conn.createStatement().execute(ddl); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('a', 6,3)"); - stmt.execute(); - stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('b', 2,4)"); - stmt.execute(); - stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('c', 6,3)"); - stmt.execute(); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - ResultSet rs; - rs = conn.createStatement().executeQuery("SELECT COUNT(DISTINCT ARRAY[a,b]) from " + table); - assertTrue(rs.next()); - assertEquals(2, rs.getInt(1)); - } - - @Test - public void testArrayConstructorWithMultipleRows2() throws Exception { - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - String ddl = "CREATE TABLE " + table + " (region_name VARCHAR PRIMARY KEY, a INTEGER, b INTEGER)"; - conn.createStatement().execute(ddl); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('a', 6,3)"); - stmt.execute(); - stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('b', 2,4)"); - stmt.execute(); - stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('c', 6,3)"); - stmt.execute(); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - ResultSet rs; - rs = conn.createStatement().executeQuery("SELECT ARRAY[a,b] from " + table + " "); - assertTrue(rs.next()); - Array arr = conn.createArrayOf("INTEGER", new Object[]{6, 3}); - assertEquals(arr, rs.getArray(1)); - rs.next(); - arr = conn.createArrayOf("INTEGER", new Object[]{2, 4}); - assertEquals(arr, rs.getArray(1)); - rs.next(); - arr = conn.createArrayOf("INTEGER", new Object[]{6, 3}); - assertEquals(arr, rs.getArray(1)); - rs.next(); - } - - @Test - public void testArrayConstructorWithMultipleRows3() throws Exception { - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - String ddl = "CREATE TABLE " + table + " (region_name VARCHAR PRIMARY KEY, a VARCHAR, b VARCHAR)"; - conn.createStatement().execute(ddl); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('a', 'foo', 'abc')"); - stmt.execute(); - stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('b', 'abc', 'dfg')"); - stmt.execute(); - stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('c', 'foo', 'abc')"); - stmt.execute(); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - ResultSet rs; - rs = conn.createStatement().executeQuery("SELECT ARRAY[a,b] from " + table + " "); - assertTrue(rs.next()); - Array arr = conn.createArrayOf("VARCHAR", new Object[]{"foo", "abc"}); - assertEquals(arr, rs.getArray(1)); - rs.next(); - arr = conn.createArrayOf("VARCHAR", new Object[]{"abc", "dfg"}); - assertEquals(arr, rs.getArray(1)); - rs.next(); - arr = conn.createArrayOf("VARCHAR", new Object[]{"foo", "abc"}); - assertEquals(arr, rs.getArray(1)); - rs.next(); - } - - @Test - public void testArrayConstructorWithMultipleRows4() throws Exception { - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - String ddl = "CREATE TABLE " + table + " (region_name VARCHAR PRIMARY KEY, a VARCHAR, b VARCHAR)"; - conn.createStatement().execute(ddl); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('a', 'foo', 'abc')"); - stmt.execute(); - stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('b', 'abc', 'dfg')"); - stmt.execute(); - stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('c', 'foo', 'abc')"); - stmt.execute(); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - ResultSet rs; - rs = conn.createStatement().executeQuery("SELECT COUNT(DISTINCT ARRAY[a,b]) from " + table); - assertTrue(rs.next()); - assertEquals(2, rs.getInt(1)); - } - - @Test - public void testArrayConstructorWithMultipleRows5() throws Exception { - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - String ddl = "CREATE TABLE " + table + " (region_name VARCHAR PRIMARY KEY, a VARCHAR, b VARCHAR)"; - conn.createStatement().execute(ddl); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('a', 'foo', 'abc')"); - stmt.execute(); - stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('b', 'abc', 'dfg')"); - stmt.execute(); - stmt = conn.prepareStatement("UPSERT INTO " + table + " (region_name, a, b) VALUES('c', 'foo', 'abc')"); - stmt.execute(); - conn.commit(); - conn.close(); - conn = DriverManager.getConnection(getUrl(), props); - ResultSet rs; - rs = conn.createStatement().executeQuery("SELECT ARRAY_APPEND(ARRAY[a,b], 'oo') from " + table); - assertTrue(rs.next()); - Array arr = conn.createArrayOf("VARCHAR", new Object[]{"foo", "abc", "oo"}); - assertEquals(arr, rs.getArray(1)); - rs.next(); - arr = conn.createArrayOf("VARCHAR", new Object[]{"abc", "dfg", "oo"}); - assertEquals(arr, rs.getArray(1)); - rs.next(); - arr = conn.createArrayOf("VARCHAR", new Object[]{"foo", "abc", "oo"}); - assertEquals(arr, rs.getArray(1)); - rs.next(); - } - - @Test - public void testPKWithDescArray() throws Exception { - Connection conn; - PreparedStatement stmt; - ResultSet rs; - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - conn.createStatement() - .execute( - "CREATE TABLE " + table + " ( a VARCHAR ARRAY PRIMARY KEY DESC)\n"); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - stmt = conn.prepareStatement("UPSERT INTO " + table + " VALUES(?)"); - Array a1 = conn.createArrayOf("VARCHAR", new String[] { "a", "ba" }); - stmt.setArray(1, a1); - stmt.execute(); - Array a2 = conn.createArrayOf("VARCHAR", new String[] { "a", "c" }); - stmt.setArray(1, a2); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.createStatement().executeQuery("SELECT a FROM " + table + " ORDER BY a DESC"); - assertTrue(rs.next()); - assertEquals(a2, rs.getArray(1)); - assertTrue(rs.next()); - assertEquals(a1, rs.getArray(1)); - assertFalse(rs.next()); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - stmt = conn.prepareStatement("UPSERT INTO " + table + " VALUES(?)"); - Array a3 = conn.createArrayOf("VARCHAR", new String[] { "a", "b" }); - stmt.setArray(1, a3); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - rs = conn.createStatement().executeQuery("SELECT a FROM " + table + " ORDER BY a DESC"); - assertTrue(rs.next()); - assertEquals(a2, rs.getArray(1)); - assertTrue(rs.next()); - assertEquals(a1, rs.getArray(1)); - assertTrue(rs.next()); - assertEquals(a3, rs.getArray(1)); - assertFalse(rs.next()); - conn.close(); - } - - @Test - public void testComparisonOperatorsForDesc1()throws Exception{ - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - String ddl = "create table " + table + " (k varchar array primary key desc)"; - conn.createStatement().execute(ddl); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement stmt = conn.prepareStatement("upsert into " + table + " values (array['a', 'c'])"); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - ResultSet rs; - stmt = conn.prepareStatement("select * from " + table + " where k >= array['a', 'b']"); - rs = stmt.executeQuery(); - assertTrue(rs.next()); - } - - @Test - public void testComparisonOperatorsForDesc2()throws Exception{ - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - String ddl = "create table " + table + " (k varchar array primary key desc)"; - conn.createStatement().execute(ddl); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement stmt = conn.prepareStatement("upsert into " + table + " values (array['a', 'c'])"); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - ResultSet rs; - stmt = conn.prepareStatement("select * from " + table + " where k >= array['a', 'c']"); - rs = stmt.executeQuery(); - assertTrue(rs.next()); - } - - @Test - public void testComparisonOperatorsForDesc3()throws Exception{ - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - String ddl = "create table " + table + " (k varchar array primary key desc)"; - conn.createStatement().execute(ddl); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement stmt = conn.prepareStatement("upsert into " + table + " values (array['a', 'c'])"); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - ResultSet rs; - stmt = conn.prepareStatement("select * from " + table + " where k > array['a', 'b']"); - rs = stmt.executeQuery(); - assertTrue(rs.next()); - } - - @Test - public void testComparisonOperatorsForDesc4()throws Exception{ - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - String ddl = "create table " + table + " (k varchar array primary key desc)"; - conn.createStatement().execute(ddl); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement stmt = conn.prepareStatement("upsert into " + table + " values (array['a', 'b'])"); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - ResultSet rs; - stmt = conn.prepareStatement("select * from " + table + " where k <= array['a', 'c']"); - rs = stmt.executeQuery(); - assertTrue(rs.next()); - } - - @Test - public void testComparisonOperatorsForDesc5()throws Exception{ - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - String ddl = "create table " + table + " (k varchar array primary key desc)"; - conn.createStatement().execute(ddl); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement stmt = conn.prepareStatement("upsert into " + table + " values (array['a', 'b'])"); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - ResultSet rs; - stmt = conn.prepareStatement("select * from " + table + " where k <= array['a', 'b']"); - rs = stmt.executeQuery(); - assertTrue(rs.next()); - } - - @Test - public void testComparisonOperatorsForDesc6()throws Exception{ - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - String ddl = "create table " + table + " (k varchar array primary key desc)"; - conn.createStatement().execute(ddl); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement stmt = conn.prepareStatement("upsert into " + table + " values (array['a', 'b'])"); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - ResultSet rs; - stmt = conn.prepareStatement("select * from " + table + " where k < array['a', 'c']"); - rs = stmt.executeQuery(); - assertTrue(rs.next()); - } - - @Test - public void testComparisonOperatorsForDesc7()throws Exception{ - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName(); - String ddl = "create table " + table + " (k integer array primary key desc)"; - conn.createStatement().execute(ddl); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - PreparedStatement stmt = conn.prepareStatement("upsert into " + table + " values (array[1, 2])"); - stmt.execute(); - conn.commit(); - conn.close(); - - conn = DriverManager.getConnection(getUrl(), props); - ResultSet rs; - stmt = conn.prepareStatement("select * from " + table + " where k < array[1, 4]"); - rs = stmt.executeQuery(); - assertTrue(rs.next()); - } - - @Test - public void testComparisonOperatorsForDesc8()throws Exception{ - - Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); - Connection conn = DriverManager.getConnection(getUrl(), props); - String table = generateUniqueName
<TRUNCATED>
