blob: a6632166d88fdbd05eb56cb8cf753714534e7ade [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable
* law or agreed to in writing, software distributed under the License is distributed on an "AS IS"
* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
* for the specific language governing permissions and limitations under the License.
*/
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.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* End to end tests for Hexadecimal and Binary literals
*/
@Category(ParallelStatsDisabledTest.class)
public class BinaryStringLiteralIT extends ParallelStatsDisabledIT {
private static String EMPTY = "";
private static String THREE_HEX = "0001AA";
private static String NINE_HEX = "0102030405607080F0";
private static String THREE_BIN = "00000000" + "00000001" + "10101010";
private static String NINE_BIN =
"00000001" + "00000010" + "00000011" + "00000100" + "00000101" + "01100000" + "01110000"
+ "10000000" + "11110000";
private String PARSER_STRESS = "x'0 12 ' --comment \n /* comment */ ' 34 567' \n \n 'aA'";
private String toHex(String s) {
return "X'" + s + "'";
}
private String toBin(String s) {
return "B'" + s + "'";
}
private void insertRow(Statement stmt, String tableName, int id, String s) throws SQLException {
stmt.executeUpdate("UPSERT INTO " + tableName + " VALUES (" + id + "," + s + "," + s + ")");
}
@Test
public void testBinary() throws Exception {
String tableName = generateUniqueName();
try (Connection conn = DriverManager.getConnection(getUrl());
Statement stmt = conn.createStatement();) {
String ddl =
"CREATE TABLE " + tableName
+ " (id INTEGER NOT NULL PRIMARY KEY, b BINARY(10), vb VARBINARY)";
stmt.execute(ddl);
conn.commit();
insertRow(stmt, tableName, 1, toHex(EMPTY));
insertRow(stmt, tableName, 3, toHex(THREE_HEX));
insertRow(stmt, tableName, 9, toHex(NINE_HEX));
insertRow(stmt, tableName, 10, PARSER_STRESS);
insertRow(stmt, tableName, 101, toBin(EMPTY));
insertRow(stmt, tableName, 103, toBin(THREE_BIN));
insertRow(stmt, tableName, 109, toBin(NINE_BIN));
conn.commit();
ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName + " ORDER BY ID ASC");
assertTrue(rs.next());
assertEquals(1, rs.getInt(1));
assertEquals(null, rs.getString(2));
assertEquals(null, rs.getString(3));
assertTrue(rs.next());
assertEquals(3, rs.getInt(1));
assertEquals("0001aa00000000000000", rs.getString(2));
assertEquals("0001aa", rs.getString(3));
assertTrue(rs.next());
assertEquals(9, rs.getInt(1));
assertEquals("0102030405607080f000", rs.getString(2));
assertEquals("0102030405607080f0", rs.getString(3));
assertTrue(rs.next());
assertEquals(10, rs.getInt(1));
assertEquals("01234567aa0000000000", rs.getString(2));
assertEquals("01234567aa", rs.getString(3));
assertTrue(rs.next());
assertEquals(101, rs.getInt(1));
assertEquals(null, rs.getString(2));
assertEquals(null, rs.getString(3));
assertTrue(rs.next());
assertEquals(103, rs.getInt(1));
assertEquals("0001aa00000000000000", rs.getString(2));
assertEquals("0001aa", rs.getString(3));
assertTrue(rs.next());
assertEquals(109, rs.getInt(1));
assertEquals("0102030405607080f000", rs.getString(2));
assertEquals("0102030405607080f0", rs.getString(3));
assertFalse(rs.next());
}
}
@Test
public void testBinaryArray() throws Exception {
String tableName = generateUniqueName();
try (Connection conn = DriverManager.getConnection(getUrl());
Statement stmt = conn.createStatement();) {
String ddl =
"CREATE TABLE " + tableName
+ " (id INTEGER NOT NULL PRIMARY KEY, b BINARY(10), a BINARY(10)[])";
stmt.execute(ddl);
conn.commit();
stmt.executeUpdate("UPSERT INTO " + tableName + " VALUES (" + 3 + "," + toHex(THREE_HEX) + ", ARRAY[" + toHex(THREE_HEX)+", "+toHex(THREE_HEX)+", "+toHex(THREE_HEX)+"])");
conn.commit();
ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName + " ORDER BY ID ASC");
assertTrue(rs.next());
assertEquals("0001aa00000000000000", rs.getString(2));
//FIXME we're using a different string representation here than for the scalar values
assertEquals("[X'0001aa00000000000000', X'0001aa00000000000000', X'0001aa00000000000000']", rs.getString(3));
assertFalse(rs.next());
}
}
}