blob: 7517dd6c75c0eb2fd6b1a2526cf82acf6e76ff3a [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 static org.junit.Assert.fail;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import org.apache.phoenix.exception.SQLExceptionCode;
import org.apache.phoenix.util.TestUtil;
import org.junit.Test;
import com.google.common.collect.Lists;
public class EncodeFunctionIT extends ParallelStatsDisabledIT {
/**
* Helper to test ENCODE function
*
* @param conn
* connection to be used
* @param colName
* name of column to query
* @param sortOrder
* sort order of the pk column
* @param expectedOutputList
* expected output of ENCODE function
*/
private void testEncodeHelper(Connection conn, String tableName, String colName, List<String> expectedOutputList, String sortOrder)
throws Exception {
for (int id = 0; id < expectedOutputList.size(); ++id) {
String sql = String.format("SELECT ENCODE(%s, 'base62') FROM " + tableName + "_%s WHERE id=?", colName, sortOrder);
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, id);
ResultSet rs = stmt.executeQuery();
assertTrue("Expected exactly one row to be returned ", rs.next());
assertEquals("ENCODE returned incorrect result ", expectedOutputList.get(id), rs.getString(1));
assertFalse("Expected exactly one row to be returned ", rs.next());
}
}
/**
* Helper to test ENCODE function
*
* @param conn
* connection to phoenix
* @param inputList
* list of values to test
* @param expectedOutputList
* expected output of ENCODE function
*/
private void testEncode(Connection conn, List<Object> inputList, List<String> expectedOutputList) throws Exception {
String tableName = TestUtil.initTables(conn, "BIGINT", inputList);
testEncodeHelper(conn, tableName, "pk", expectedOutputList, "ASC");
testEncodeHelper(conn, tableName, "pk", expectedOutputList, "DESC");
}
@Test
public void testEncode() throws Exception {
Connection conn = DriverManager.getConnection(getUrl());
testEncode(conn, Lists.<Object> newArrayList(Long.MAX_VALUE, 62, 10, 1, 0, -1, -10, -62, Long.MIN_VALUE),
Lists.newArrayList("AzL8n0Y58m7", "10", "A", "1", "0", "-1", "-A", "-10", "-AzL8n0Y58m8"));
}
@Test
public void testEncodeNullInput() throws Exception {
Connection conn = DriverManager.getConnection(getUrl());
String tableName = TestUtil.initTables(conn, "BIGINT", Collections.<Object> singletonList(0l));
testEncodeHelper(conn, tableName, "kv", Collections.<String> singletonList(null), "ASC");
testEncodeHelper(conn, tableName, "kv", Collections.<String> singletonList(null), "DESC");
}
@Test
public void testUpperCaseEncodingType() throws Exception {
Connection conn = DriverManager.getConnection(getUrl());
String tableName = generateUniqueName();
String ddl = "CREATE TABLE " + tableName + " ( pk VARCHAR(10) NOT NULL CONSTRAINT PK PRIMARY KEY (pk))";
conn.createStatement().execute(ddl);
PreparedStatement ps = conn.prepareStatement("UPSERT INTO " + tableName + " (pk) VALUES (?)");
ps.setString(1, "1");
ps.execute();
conn.commit();
ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM " + tableName + " WHERE pk = ENCODE(1, 'BASE62')");
assertTrue(rs.next());
}
@Test
public void testNullEncodingType() throws Exception {
Connection conn = DriverManager.getConnection(getUrl());
String tableName = generateUniqueName();
String ddl = "CREATE TABLE " + tableName + " ( pk VARCHAR(10) NOT NULL CONSTRAINT PK PRIMARY KEY (pk))";
conn.createStatement().execute(ddl);
ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM " + tableName + " WHERE pk = ENCODE(1, NULL)");
assertFalse(rs.next());
}
@Test
public void testUnsupportedEncodingType() throws Exception {
Connection conn = DriverManager.getConnection(getUrl());
String tableName = generateUniqueName();
String ddl = "CREATE TABLE " + tableName + " ( pk VARCHAR(10) NOT NULL CONSTRAINT PK PRIMARY KEY (pk))";
conn.createStatement().execute(ddl);
try {
conn.createStatement().executeQuery("SELECT * FROM " + tableName + " WHERE pk = ENCODE(1, 'HEX')");
fail();
} catch (SQLException e) {
assertEquals(SQLExceptionCode.ILLEGAL_DATA.getErrorCode(), e.getErrorCode());
}
}
@Test
public void testInvalidEncodingType() throws Exception {
Connection conn = DriverManager.getConnection(getUrl());
String tableName = generateUniqueName();
String ddl =
"CREATE TABLE " + tableName + " ( some_column BINARY(12) NOT NULL CONSTRAINT PK PRIMARY KEY (some_column))";
conn.createStatement().execute(ddl);
try {
conn.createStatement().executeQuery(
"SELECT * FROM " + tableName + " WHERE some_column = ENCODE(1, 'invalidEncodingFormat')");
fail();
} catch (SQLException e) {
}
}
}