| /* |
| * 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.apache.phoenix.query.QueryConstants.MILLIS_IN_DAY; |
| import static org.apache.phoenix.util.TestUtil.BTABLE_NAME; |
| import static org.apache.phoenix.util.TestUtil.PTSDB2_NAME; |
| import static org.apache.phoenix.util.TestUtil.PTSDB_NAME; |
| 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.math.BigDecimal; |
| 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.Statement; |
| import java.sql.Types; |
| import java.text.Format; |
| import java.util.Properties; |
| |
| import org.apache.phoenix.exception.SQLExceptionCode; |
| import org.apache.phoenix.schema.ConstraintViolationException; |
| import org.apache.phoenix.util.DateUtil; |
| import org.apache.phoenix.util.PropertiesUtil; |
| import org.junit.Test; |
| |
| |
| public class VariableLengthPKIT extends ParallelStatsDisabledIT { |
| private static final String DS1 = "1970-01-01 00:58:00"; |
| private static final Date D1 = toDate(DS1); |
| |
| private static Date toDate(String dateString) { |
| return DateUtil.parseDate(dateString); |
| } |
| |
| protected static void initGroupByRowKeyColumns(String pTSDBtableName) throws Exception { |
| ensureTableCreated(getUrl(),pTSDBtableName, PTSDB_NAME, null, null, null); |
| // Insert all rows at ts |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| PreparedStatement stmt = conn.prepareStatement( |
| "upsert into " + pTSDBtableName+ |
| " (" + |
| " INST, " + |
| " HOST," + |
| " \"DATE\")" + |
| "VALUES (?, ?, CURRENT_DATE())"); |
| stmt.setString(1, "ab"); |
| stmt.setString(2, "a"); |
| stmt.execute(); |
| stmt.setString(1, "ac"); |
| stmt.setString(2, "b"); |
| stmt.execute(); |
| stmt.setString(1, "ad"); |
| stmt.setString(2, "a"); |
| stmt.execute(); |
| conn.commit(); |
| conn.close(); |
| } |
| |
| private static void initVarcharKeyTableValues(byte[][] splits, String varcharKeyTestTableName) throws Exception { |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| |
| String ddl = "create table " +varcharKeyTestTableName+ |
| " (pk varchar not null primary key)"; |
| createTestTable(getUrl(), ddl, splits, null); |
| PreparedStatement stmt = conn.prepareStatement( |
| "upsert into " + varcharKeyTestTableName+ |
| "(pk) " + |
| "VALUES (?)"); |
| stmt.setString(1, " def"); |
| stmt.execute(); |
| stmt.setString(1, "jkl "); |
| stmt.execute(); |
| stmt.setString(1, " ghi "); |
| stmt.execute(); |
| |
| conn.commit(); |
| conn.close(); |
| } |
| |
| private static void initPTSDBTableValues(byte[][] splits, String pTSDBtableName) throws Exception { |
| ensureTableCreated(getUrl(),pTSDBtableName, PTSDB_NAME, splits, null, null); |
| // Insert all rows at ts |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| PreparedStatement stmt = conn.prepareStatement( |
| "upsert into " + pTSDBtableName + |
| " (" + |
| " INST, " + |
| " HOST," + |
| " \"DATE\"," + |
| " VAL)" + |
| "VALUES (?, ?, ?, ?)"); |
| stmt.setString(1, "abc"); |
| stmt.setString(2, "abc-def-ghi"); |
| stmt.setDate(3, new Date(System.currentTimeMillis())); |
| stmt.setBigDecimal(4, new BigDecimal(.5)); |
| stmt.execute(); |
| conn.close(); |
| } |
| |
| private static void initBTableValues(byte[][] splits, String bTableName) throws Exception { |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| ensureTableCreated(getUrl(),bTableName, BTABLE_NAME, splits, null, null); |
| |
| PreparedStatement stmt = conn.prepareStatement( |
| "upsert into " + bTableName+ |
| " (" + |
| " A_STRING, " + |
| " A_ID," + |
| " B_STRING," + |
| " A_INTEGER," + |
| " B_INTEGER," + |
| " C_INTEGER," + |
| " D_STRING," + |
| " E_STRING)" + |
| "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); |
| stmt.setString(1, "abc"); |
| stmt.setString(2, "111"); |
| stmt.setString(3, "x"); |
| stmt.setInt(4, 1); |
| stmt.setInt(5, 10); |
| stmt.setInt(6, 1000); |
| stmt.setString(7, null); |
| stmt.setString(8, "0123456789"); |
| stmt.execute(); |
| |
| stmt.setString(1, "abcd"); |
| stmt.setString(2, "222"); |
| stmt.setString(3, "xy"); |
| stmt.setInt(4, 2); |
| stmt.setNull(5, Types.INTEGER); |
| stmt.setNull(6, Types.INTEGER); |
| stmt.execute(); |
| |
| stmt.setString(3, "xyz"); |
| stmt.setInt(4, 3); |
| stmt.setInt(5, 10); |
| stmt.setInt(6, 1000); |
| stmt.setString(7, "efg"); |
| stmt.execute(); |
| |
| stmt.setString(3, "xyzz"); |
| stmt.setInt(4, 4); |
| stmt.setInt(5, 40); |
| stmt.setNull(6, Types.INTEGER); |
| stmt.setString(7, null); |
| stmt.execute(); |
| |
| conn.commit(); |
| conn.close(); |
| } |
| |
| @Test |
| public void testSingleColumnScanKey() throws Exception { |
| String bTableName = generateUniqueName(); |
| String query = "SELECT A_STRING,substr(a_id,1,1),B_STRING,A_INTEGER,B_INTEGER FROM "+bTableName+" WHERE A_STRING=?"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| statement.setString(1, "abc"); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("abc", rs.getString(1)); |
| assertEquals("1", rs.getString(2)); |
| assertEquals("x", rs.getString(3)); |
| assertEquals(1, rs.getInt(4)); |
| assertEquals(10, rs.getInt(5)); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testSingleColumnGroupBy() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| String query = "SELECT INST FROM "+pTSDBTableName+" GROUP BY INST"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| |
| try { |
| initPTSDBTableValues(null, pTSDBTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("abc", rs.getString(1)); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testNonfirstColumnGroupBy() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| String query = "SELECT HOST FROM "+pTSDBTableName+" WHERE INST='abc' GROUP BY HOST"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initPTSDBTableValues(null, pTSDBTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("abc-def-ghi", rs.getString(1)); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testGroupByRowKeyColumns() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| String query = "SELECT SUBSTR(INST,1,1),HOST FROM "+pTSDBTableName+" GROUP BY SUBSTR(INST,1,1),HOST"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initGroupByRowKeyColumns(pTSDBTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("a", rs.getString(1)); |
| assertEquals("a", rs.getString(2)); |
| assertTrue(rs.next()); |
| assertEquals("a", rs.getString(1)); |
| assertEquals("b", rs.getString(2)); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testSkipScan() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| String query = "SELECT HOST FROM "+pTSDBTableName+" WHERE INST='abc' AND \"DATE\">=TO_DATE('1970-01-01 00:00:00') AND \"DATE\" <TO_DATE('2171-01-01 00:00:00')"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initPTSDBTableValues(null, pTSDBTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("abc-def-ghi", rs.getString(1)); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testSkipMax() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| String query = "SELECT MAX(INST),MAX(\"DATE\") FROM "+pTSDBTableName+" WHERE INST='abc' AND \"DATE\">=TO_DATE('1970-01-01 00:00:00') AND \"DATE\" <TO_DATE('2171-01-01 00:00:00')"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initPTSDBTableValues(null, pTSDBTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("abc", rs.getString(1)); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testSkipMaxWithLimit() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| String query = "SELECT MAX(INST),MAX(\"DATE\") FROM "+pTSDBTableName+" WHERE INST='abc' AND \"DATE\">=TO_DATE('1970-01-01 00:00:00') AND \"DATE\" <TO_DATE('2171-01-01 00:00:00') LIMIT 2"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initPTSDBTableValues(null, pTSDBTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("abc", rs.getString(1)); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testSingleColumnKeyFilter() throws Exception { |
| String bTableName = generateUniqueName(); |
| // Requires not null column to be projected, since the only one projected in the query is |
| // nullable and will cause the no key value to be returned if it is the only one projected. |
| String query = "SELECT A_STRING,substr(a_id,1,1),B_STRING,A_INTEGER,B_INTEGER FROM "+bTableName+" WHERE B_STRING=?"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null, bTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| statement.setString(1, "xy"); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("abcd", rs.getString(1)); |
| assertEquals("2", rs.getString(2)); |
| assertEquals("xy", rs.getString(3)); |
| assertEquals(2, rs.getInt(4)); |
| assertEquals(0, rs.getInt(5)); |
| assertTrue(rs.wasNull()); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testMultiColumnEqScanKey() throws Exception { |
| String bTableName = generateUniqueName(); |
| String query = "SELECT A_STRING,substr(a_id,1,1),B_STRING,A_INTEGER,B_INTEGER FROM "+bTableName+" WHERE A_STRING=? AND A_ID=? AND B_STRING=?"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null, bTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| statement.setString(1, "abcd"); |
| statement.setString(2, "222"); |
| statement.setString(3, "xy"); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("abcd", rs.getString(1)); |
| assertEquals("2", rs.getString(2)); |
| assertEquals("xy", rs.getString(3)); |
| assertEquals(2, rs.getInt(4)); |
| assertEquals(0, rs.getInt(5)); |
| assertTrue(rs.wasNull()); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testMultiColumnGTScanKey() throws Exception { |
| String bTableName = generateUniqueName(); |
| String query = "SELECT A_STRING,substr(a_id,1,1),B_STRING,A_INTEGER,B_INTEGER FROM "+bTableName+" WHERE A_STRING=? AND A_ID=? AND B_STRING>?"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null, bTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| statement.setString(1, "abcd"); |
| statement.setString(2, "222"); |
| statement.setString(3, "xy"); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("abcd", rs.getString(1)); |
| assertEquals("2", rs.getString(2)); |
| assertEquals("xyz", rs.getString(3)); |
| assertEquals(3, rs.getInt(4)); |
| assertEquals(10, rs.getInt(5)); |
| assertTrue(rs.next()); |
| assertEquals("abcd", rs.getString(1)); |
| assertEquals("2", rs.getString(2)); |
| assertEquals("xyzz", rs.getString(3)); |
| assertEquals(4, rs.getInt(4)); |
| assertEquals(40, rs.getInt(5)); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testMultiColumnGTKeyFilter() throws Exception { |
| String bTableName = generateUniqueName(); |
| String query = "SELECT A_STRING,substr(a_id,1,1),B_STRING,A_INTEGER,B_INTEGER FROM "+bTableName+" WHERE A_STRING>? AND A_INTEGER>=?"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null, bTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| statement.setString(1, "abc"); |
| statement.setInt(2, 4); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("abcd", rs.getString(1)); |
| assertEquals("2", rs.getString(2)); |
| assertEquals("xyzz", rs.getString(3)); |
| assertEquals(4, rs.getInt(4)); |
| assertEquals(40, rs.getInt(5)); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testNullValueEqualityScan() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| ensureTableCreated(getUrl(),pTSDBTableName, PTSDB_NAME, null, null, null); |
| // Insert all rows at ts |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| PreparedStatement stmt = conn.prepareStatement("upsert into "+pTSDBTableName+" VALUES ('', '', ?, 0.5)"); |
| stmt.setDate(1, D1); |
| stmt.execute(); |
| conn.close(); |
| |
| // Comparisons against null are always false. |
| String query = "SELECT HOST,\"DATE\" FROM "+pTSDBTableName+" WHERE HOST='' AND INST=''"; |
| url = getUrl(); |
| conn = DriverManager.getConnection(url, props); |
| try { |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testVarLengthPKColScan() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| ensureTableCreated(getUrl(),pTSDBTableName, PTSDB_NAME, null, null, null); |
| String url = getUrl(); // Insert at timestamp 0 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| PreparedStatement stmt = conn.prepareStatement("upsert into "+pTSDBTableName+" VALUES (?, 'y', ?, 0.5)"); |
| stmt.setString(1, "x"); |
| stmt.setDate(2, D1); |
| stmt.execute(); |
| stmt.setString(1, "xy"); |
| stmt.execute(); |
| conn.close(); |
| |
| String query = "SELECT HOST,\"DATE\" FROM "+pTSDBTableName+" WHERE INST='x' AND HOST='y'"; |
| url = getUrl(); |
| conn = DriverManager.getConnection(url, props); |
| try { |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(D1, rs.getDate(2)); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testEscapedQuoteScan() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| ensureTableCreated(getUrl(), pTSDBTableName, PTSDB_NAME, null, null, null); |
| String url = getUrl(); // Insert at timestamp 0 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| PreparedStatement stmt = conn.prepareStatement("upsert into "+pTSDBTableName+" VALUES (?, 'y', ?, 0.5)"); |
| stmt.setString(1, "x'y"); |
| stmt.setDate(2, D1); |
| stmt.execute(); |
| stmt.setString(1, "x"); |
| stmt.execute(); |
| conn.close(); |
| |
| String query1 = "SELECT INST,\"DATE\" FROM "+pTSDBTableName+" WHERE INST='x''y'"; |
| String query2 = "SELECT INST,\"DATE\" FROM "+pTSDBTableName+" WHERE INST='x\\\'y'"; |
| url = getUrl(); |
| conn = DriverManager.getConnection(url, props); |
| try { |
| PreparedStatement statement = conn.prepareStatement(query1); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("x'y", rs.getString(1)); |
| assertEquals(D1, rs.getDate(2)); |
| assertFalse(rs.next()); |
| |
| statement = conn.prepareStatement(query2); |
| rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("x'y", rs.getString(1)); |
| assertEquals(D1, rs.getDate(2)); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| private static void initPTSDBTableValues1(String pTSDBTableName) throws Exception { |
| ensureTableCreated(getUrl(),pTSDBTableName, PTSDB_NAME, null, null, null); |
| String url = getUrl(); // Insert at timestamp 0 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| PreparedStatement stmt = conn.prepareStatement("upsert into "+pTSDBTableName+" VALUES ('x', 'y', ?, 0.5)"); |
| stmt.setDate(1, D1); |
| stmt.execute(); |
| conn.close(); |
| } |
| |
| @Test |
| public void testToStringOnDate() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| initPTSDBTableValues1(pTSDBTableName); |
| String query = "SELECT HOST,\"DATE\" FROM "+pTSDBTableName+" WHERE INST='x' AND HOST='y'"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(DateUtil.DEFAULT_DATE_FORMATTER.format(D1), rs.getString(2)); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| private static void initPTSDBTableValues2(String pTSDB2TableName, Date d) throws Exception { |
| ensureTableCreated(getUrl(),pTSDB2TableName, PTSDB2_NAME, null, null, null); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| PreparedStatement stmt = conn.prepareStatement("upsert into "+pTSDB2TableName+"(inst,\"DATE\",val2) VALUES (?, ?, ?)"); |
| stmt.setString(1, "a"); |
| stmt.setDate(2, d); |
| stmt.setDouble(3, 101.3); |
| stmt.execute(); |
| stmt.setString(1, "a"); |
| stmt.setDate(2, new Date(d.getTime() + 1 * MILLIS_IN_DAY)); |
| stmt.setDouble(3, 99.7); |
| stmt.execute(); |
| stmt.setString(1, "a"); |
| stmt.setDate(2, new Date(d.getTime() - 1 * MILLIS_IN_DAY)); |
| stmt.setDouble(3, 105.3); |
| stmt.execute(); |
| stmt.setString(1, "b"); |
| stmt.setDate(2, d); |
| stmt.setDouble(3, 88.5); |
| stmt.execute(); |
| stmt.setString(1, "b"); |
| stmt.setDate(2, new Date(d.getTime() + 1 * MILLIS_IN_DAY)); |
| stmt.setDouble(3, 89.7); |
| stmt.execute(); |
| stmt.setString(1, "b"); |
| stmt.setDate(2, new Date(d.getTime() - 1 * MILLIS_IN_DAY)); |
| stmt.setDouble(3, 94.9); |
| stmt.execute(); |
| conn.close(); |
| } |
| |
| @Test |
| public void testRoundOnDate() throws Exception { |
| String pTSDB2TableName = generateUniqueName(); |
| |
| Date date = new Date(System.currentTimeMillis()); |
| initPTSDBTableValues2(pTSDB2TableName, date); |
| |
| String query = "SELECT MAX(val2)" |
| + " FROM "+pTSDB2TableName |
| + " WHERE inst='a'" |
| + " GROUP BY ROUND(\"DATE\",'day',1)" |
| + " ORDER BY MAX(val2)"; // disambiguate row order |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(99.7, rs.getDouble(1), 1e-6); |
| assertTrue(rs.next()); |
| assertEquals(101.3, rs.getDouble(1), 1e-6); |
| assertTrue(rs.next()); |
| assertEquals(105.3, rs.getDouble(1), 1e-6); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testOrderBy() throws Exception { |
| String pTSDB2TableName = generateUniqueName(); |
| Date date = new Date(System.currentTimeMillis()); |
| initPTSDBTableValues2(pTSDB2TableName, date); |
| |
| String query = "SELECT inst,MAX(val2),MIN(val2)" |
| + " FROM "+pTSDB2TableName |
| + " GROUP BY inst,ROUND(\"DATE\",'day',1)" |
| + " ORDER BY inst,ROUND(\"DATE\",'day',1)" |
| ; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("a", rs.getString(1)); |
| assertEquals(105.3, rs.getDouble(2), 1e-6); |
| assertEquals(105.3, rs.getDouble(3), 1e-6); |
| assertTrue(rs.next()); |
| assertEquals("a", rs.getString(1)); |
| assertEquals(101.3, rs.getDouble(2), 1e-6); |
| assertEquals(101.3, rs.getDouble(3), 1e-6); |
| assertTrue(rs.next()); |
| assertEquals("a", rs.getString(1)); |
| assertEquals(99.7, rs.getDouble(2), 1e-6); |
| assertEquals(99.7, rs.getDouble(3), 1e-6); |
| assertTrue(rs.next()); |
| assertEquals("b", rs.getString(1)); |
| assertEquals(94.9, rs.getDouble(2), 1e-6); |
| assertEquals(94.9, rs.getDouble(3), 1e-6); |
| assertTrue(rs.next()); |
| assertEquals("b", rs.getString(1)); |
| assertEquals(88.5, rs.getDouble(2), 1e-6); |
| assertEquals(88.5, rs.getDouble(3), 1e-6); |
| assertTrue(rs.next()); |
| assertEquals("b", rs.getString(1)); |
| assertEquals(89.7, rs.getDouble(2), 1e-6); |
| assertEquals(89.7, rs.getDouble(3), 1e-6); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testSelectCount() throws Exception { |
| String pTSDB2TableName = generateUniqueName(); |
| Date date = new Date(System.currentTimeMillis()); |
| initPTSDBTableValues2(pTSDB2TableName, date); |
| String query = "SELECT COUNT(*)" |
| + " FROM "+pTSDB2TableName |
| + " WHERE inst='a'"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(3, rs.getInt(1)); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testBatchUpsert() throws Exception { |
| String pTSDB2TableName = generateUniqueName(); |
| Date d = new Date(System.currentTimeMillis()); |
| ensureTableCreated(getUrl(),pTSDB2TableName, PTSDB2_NAME, null, null, null); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| String query = "SELECT SUM(val1),SUM(val2),SUM(val3) FROM "+pTSDB2TableName; |
| String sql1 = "UPSERT INTO "+pTSDB2TableName+"(inst,\"DATE\",val1) VALUES (?, ?, ?)"; |
| String sql2 = "UPSERT INTO "+pTSDB2TableName+"(inst,\"DATE\",val2) VALUES (?, ?, ?)"; |
| String sql3 = "UPSERT INTO "+pTSDB2TableName+"(inst,\"DATE\",val3) VALUES (?, ?, ?)"; |
| Connection conn = DriverManager.getConnection(getUrl(), props); |
| conn.setAutoCommit(false); |
| // conn.setAutoCommit(true); |
| |
| { |
| // verify precondition: SUM(val{1,2,3}) are null |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertNull(rs.getBigDecimal(1)); |
| assertNull(rs.getBigDecimal(2)); |
| assertNull(rs.getBigDecimal(3)); |
| assertFalse(rs.next()); |
| statement.close(); |
| } |
| |
| { |
| PreparedStatement s = conn.prepareStatement(sql1); |
| s.setString(1, "a"); |
| s.setDate(2, d); |
| s.setInt(3, 1); |
| assertEquals(1, s.executeUpdate()); |
| s.close(); |
| } |
| { |
| PreparedStatement s = conn.prepareStatement(sql2); |
| s.setString(1, "b"); |
| s.setDate(2, d); |
| s.setInt(3, 1); |
| assertEquals(1, s.executeUpdate()); |
| s.close(); |
| } |
| { |
| PreparedStatement s = conn.prepareStatement(sql3); |
| s.setString(1, "c"); |
| s.setDate(2, d); |
| s.setInt(3, 1); |
| assertEquals(1, s.executeUpdate()); |
| s.close(); |
| } |
| { |
| PreparedStatement s = conn.prepareStatement(sql1); |
| s.setString(1, "a"); |
| s.setDate(2, d); |
| s.setInt(3, 5); |
| assertEquals(1, s.executeUpdate()); |
| s.close(); |
| } |
| { |
| PreparedStatement s = conn.prepareStatement(sql1); |
| s.setString(1, "b"); |
| s.setDate(2, d); |
| s.setInt(3, 5); |
| assertEquals(1, s.executeUpdate()); |
| s.close(); |
| } |
| { |
| PreparedStatement s = conn.prepareStatement(sql1); |
| s.setString(1, "c"); |
| s.setDate(2, d); |
| s.setInt(3, 5); |
| assertEquals(1, s.executeUpdate()); |
| s.close(); |
| } |
| conn.commit(); |
| conn.close(); |
| |
| // Query at a time after the upsert to confirm they took place |
| conn = DriverManager.getConnection(getUrl(), props); |
| { |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(15, rs.getDouble(1), 1e-6); |
| assertEquals(1, rs.getDouble(2), 1e-6); |
| assertEquals(1, rs.getDouble(3), 1e-6); |
| assertFalse(rs.next()); |
| statement.close(); |
| } |
| } |
| |
| @Test |
| public void testSelectStar() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| initPTSDBTableValues1(pTSDBTableName); |
| String query = "SELECT * FROM "+pTSDBTableName+" WHERE INST='x' AND HOST='y'"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("x",rs.getString("inst")); |
| assertEquals("y",rs.getString("host")); |
| assertEquals(D1, rs.getDate("DATE")); |
| assertEquals(BigDecimal.valueOf(0.5), rs.getBigDecimal("val")); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testToCharOnDate() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| |
| initPTSDBTableValues1(pTSDBTableName); |
| |
| String query = "SELECT HOST,TO_CHAR(\"DATE\") FROM "+pTSDBTableName+" WHERE INST='x' AND HOST='y'"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(DateUtil.DEFAULT_DATE_FORMATTER.format(D1), rs.getString(2)); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testToCharWithFormatOnDate() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| |
| initPTSDBTableValues1(pTSDBTableName); |
| String format = "HH:mm:ss"; |
| Format dateFormatter = DateUtil.getDateFormatter(format); |
| String query = "SELECT HOST,TO_CHAR(\"DATE\",'" + format + "') FROM "+pTSDBTableName+" WHERE INST='x' AND HOST='y'"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(dateFormatter.format(D1), rs.getString(2)); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testToDateWithFormatOnDate() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| |
| initPTSDBTableValues1(pTSDBTableName); |
| |
| String format = "yyyy-MM-dd HH:mm:ss.S"; |
| Format dateFormatter = DateUtil.getDateFormatter(format); |
| String query = "SELECT HOST,TO_CHAR(\"DATE\",'" + format + "') FROM "+pTSDBTableName+" WHERE INST='x' AND HOST='y' and \"DATE\"=TO_DATE(?,'" + format + "')"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| PreparedStatement statement = conn.prepareStatement(query); |
| statement.setString(1, dateFormatter.format(D1)); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(dateFormatter.format(D1), rs.getString(2)); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testMissingPKColumn() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| ensureTableCreated(getUrl(),pTSDBTableName, PTSDB_NAME, null, null, null); |
| String url = getUrl(); // Insert at timestamp 0 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| Statement stmt = conn.createStatement(); |
| try { |
| stmt.execute("upsert into "+pTSDBTableName+"(INST,HOST,VAL) VALUES ('abc', 'abc-def-ghi', 0.5)"); |
| fail(); |
| } catch (SQLException e) { |
| assertEquals(SQLExceptionCode.CONSTRAINT_VIOLATION.getErrorCode(), e.getErrorCode()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testNoKVColumn() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| |
| ensureTableCreated(getUrl(),pTSDBTableName, BTABLE_NAME, null, null, null); |
| String url = getUrl(); // Insert at timestamp 0 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| PreparedStatement stmt = conn.prepareStatement( |
| "upsert into "+pTSDBTableName+" VALUES (?, ?, ?, ?, ?)"); |
| stmt.setString(1, "abc"); |
| stmt.setString(2, "123"); |
| stmt.setString(3, "x"); |
| stmt.setInt(4, 1); |
| stmt.setString(5, "ab"); |
| // Succeeds since we have an empty KV |
| stmt.execute(); |
| } |
| |
| @Test |
| public void testTooShortKVColumn() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| ensureTableCreated(getUrl(),pTSDBTableName, BTABLE_NAME, null, null, null); |
| String url = getUrl(); // Insert at timestamp 0 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| // Insert all rows at ts |
| PreparedStatement stmt = conn.prepareStatement( |
| "upsert into " + pTSDBTableName + |
| " (" + |
| " A_STRING, " + |
| " A_ID," + |
| " B_STRING," + |
| " A_INTEGER," + |
| " C_STRING," + |
| " E_STRING)" + |
| "VALUES (?, ?, ?, ?, ?, ?)"); |
| stmt.setString(1, "abc"); |
| stmt.setString(2, "123"); |
| stmt.setString(3, "x"); |
| stmt.setInt(4, 1); |
| stmt.setString(5, "ab"); |
| stmt.setString(6, "01234"); |
| |
| try { |
| stmt.execute(); |
| } catch (ConstraintViolationException e) { |
| fail("Constraint voilation Exception should not be thrown, the characters have to be padded"); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testTooShortPKColumn() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| ensureTableCreated(getUrl(),pTSDBTableName, BTABLE_NAME, null, null, null); |
| String url = getUrl(); // Insert at timestamp 0 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| // Insert all rows at ts |
| PreparedStatement stmt = conn.prepareStatement( |
| "upsert into " + pTSDBTableName+ |
| " (" + |
| " A_STRING, " + |
| " A_ID," + |
| " B_STRING," + |
| " A_INTEGER," + |
| " C_STRING," + |
| " E_STRING)" + |
| "VALUES (?, ?, ?, ?, ?, ?)"); |
| stmt.setString(1, "abc"); |
| stmt.setString(2, "12"); |
| stmt.setString(3, "x"); |
| stmt.setInt(4, 1); |
| stmt.setString(5, "ab"); |
| stmt.setString(6, "0123456789"); |
| |
| try { |
| stmt.execute(); |
| } catch (ConstraintViolationException e) { |
| fail("Constraint voilation Exception should not be thrown, the characters have to be padded"); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testTooLongPKColumn() throws Exception { |
| String bTableName = generateUniqueName(); |
| ensureTableCreated(getUrl(),bTableName, BTABLE_NAME, null, null, null); |
| String url = getUrl(); // Insert at timestamp 0 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| // Insert all rows at ts |
| PreparedStatement stmt = conn.prepareStatement( |
| "upsert into " + bTableName+ |
| "(" + |
| " A_STRING, " + |
| " A_ID," + |
| " B_STRING," + |
| " A_INTEGER," + |
| " C_STRING," + |
| " E_STRING)" + |
| "VALUES (?, ?, ?, ?, ?, ?)"); |
| stmt.setString(1, "abc"); |
| stmt.setString(2, "123"); |
| stmt.setString(3, "x"); |
| stmt.setInt(4, 1); |
| stmt.setString(5, "abc"); |
| stmt.setString(6, "0123456789"); |
| |
| try { |
| stmt.execute(); |
| fail(); |
| } catch (SQLException e) { |
| assertEquals(SQLExceptionCode.DATA_EXCEEDS_MAX_CAPACITY.getErrorCode(),e.getErrorCode()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testTooLongKVColumn() throws Exception { |
| String bTableName = generateUniqueName(); |
| ensureTableCreated(getUrl(),bTableName, BTABLE_NAME, null, null, null); |
| String url = getUrl(); // Insert at timestamp 0 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| // Insert all rows at ts |
| PreparedStatement stmt = conn.prepareStatement( |
| "upsert into " + bTableName+ |
| "(" + |
| " A_STRING, " + |
| " A_ID," + |
| " B_STRING," + |
| " A_INTEGER," + |
| " C_STRING," + |
| " D_STRING," + |
| " E_STRING)" + |
| "VALUES (?, ?, ?, ?, ?, ?, ?)"); |
| stmt.setString(1, "abc"); |
| stmt.setString(2, "123"); |
| stmt.setString(3, "x"); |
| stmt.setInt(4, 1); |
| stmt.setString(5, "ab"); |
| stmt.setString(6,"abcd"); |
| stmt.setString(7, "0123456789"); |
| |
| try { |
| stmt.execute(); |
| fail(); |
| } catch (SQLException e) { |
| assertEquals(SQLExceptionCode.DATA_EXCEEDS_MAX_CAPACITY.getErrorCode(),e.getErrorCode()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testMultiFixedLengthNull() throws Exception { |
| String bTableName = generateUniqueName(); |
| String query = "SELECT B_INTEGER,C_INTEGER,COUNT(1) FROM "+bTableName+" GROUP BY B_INTEGER,C_INTEGER"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null, bTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(0, rs.getInt(1)); |
| assertTrue(rs.wasNull()); |
| assertEquals(0, rs.getInt(2)); |
| assertTrue(rs.wasNull()); |
| assertEquals(1, rs.getLong(3)); |
| |
| assertTrue(rs.next()); |
| assertEquals(10, rs.getInt(1)); |
| assertEquals(1000, rs.getInt(2)); |
| assertEquals(2, rs.getLong(3)); |
| |
| assertTrue(rs.next()); |
| assertEquals(40, rs.getInt(1)); |
| assertEquals(0, rs.getInt(2)); |
| assertTrue(rs.wasNull()); |
| assertEquals(1, rs.getLong(3)); |
| |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testSingleFixedLengthNull() throws Exception { |
| String bTableName = generateUniqueName(); |
| String query = "SELECT C_INTEGER,COUNT(1) FROM "+bTableName+" GROUP BY C_INTEGER"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(0, rs.getInt(1)); |
| assertTrue(rs.wasNull()); |
| assertEquals(2, rs.getLong(2)); |
| |
| assertTrue(rs.next()); |
| assertEquals(1000, rs.getInt(1)); |
| assertEquals(2, rs.getLong(2)); |
| |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testMultiMixedTypeGroupBy() throws Exception { |
| String bTableName = generateUniqueName(); |
| String query = "SELECT A_ID, E_STRING, D_STRING, C_INTEGER, COUNT(1) FROM "+bTableName+" GROUP BY A_ID, E_STRING, D_STRING, C_INTEGER"; |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| PreparedStatement statement = conn.prepareStatement(query); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals("111", rs.getString(1)); |
| assertEquals("0123456789", rs.getString(2)); |
| assertEquals(null, rs.getString(3)); |
| assertEquals(1000, rs.getInt(4)); |
| assertEquals(1, rs.getInt(5)); |
| |
| assertTrue(rs.next()); |
| assertEquals("222", rs.getString(1)); |
| assertEquals("0123456789", rs.getString(2)); |
| assertEquals(null, rs.getString(3)); |
| assertEquals(0, rs.getInt(4)); |
| assertTrue(rs.wasNull()); |
| assertEquals(2, rs.getInt(5)); |
| |
| assertTrue(rs.next()); |
| assertEquals("222", rs.getString(1)); |
| assertEquals("0123456789", rs.getString(2)); |
| assertEquals("efg", rs.getString(3)); |
| assertEquals(1000, rs.getInt(4)); |
| assertEquals(1, rs.getInt(5)); |
| |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testSubstrFunction() throws Exception { |
| String bTableName = generateUniqueName(); |
| String varcharKeyTestTable = generateUniqueName(); |
| String query[] = { |
| "SELECT substr('ABC',-1,1) FROM "+bTableName+" LIMIT 1", |
| "SELECT substr('ABC',-4,1) FROM "+bTableName+" LIMIT 1", |
| "SELECT substr('ABC',2,4) FROM "+bTableName+" LIMIT 1", |
| "SELECT substr('ABC',1,1) FROM "+bTableName+" LIMIT 1", |
| "SELECT substr('ABC',0,1) FROM "+bTableName+" LIMIT 1", |
| // Test for multibyte characters support. |
| "SELECT substr('ĎďĒ',0,1) FROM "+bTableName+" LIMIT 1", |
| "SELECT substr('ĎďĒ',0,2) FROM "+bTableName+" LIMIT 1", |
| "SELECT substr('ĎďĒ',1,1) FROM "+bTableName+" LIMIT 1", |
| "SELECT substr('ĎďĒ',1,2) FROM "+bTableName+" LIMIT 1", |
| "SELECT substr('ĎďĒ',2,1) FROM "+bTableName+" LIMIT 1", |
| "SELECT substr('ĎďĒ',2,2) FROM "+bTableName+" LIMIT 1", |
| "SELECT substr('ĎďĒ',-1,1) FROM "+bTableName+" LIMIT 1", |
| "SELECT substr('Ďďɚʍ',2,4) FROM "+bTableName+" LIMIT 1", |
| "SELECT pk FROM "+varcharKeyTestTable+" WHERE substr(pk, 0, 3)='jkl'", |
| }; |
| String result[] = { |
| "C", |
| null, |
| "BC", |
| "A", |
| "A", |
| "Ď", |
| "Ďď", |
| "Ď", |
| "Ďď", |
| "ď", |
| "ďĒ", |
| "Ē", |
| "ďɚʍ", |
| "jkl ", |
| }; |
| assertEquals(query.length,result.length); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| initVarcharKeyTableValues(null,varcharKeyTestTable); |
| for (int i = 0; i < query.length; i++) { |
| PreparedStatement statement = conn.prepareStatement(query[i]); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(result[i], rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testRegexReplaceFunction() throws Exception { |
| String bTableName = generateUniqueName(); |
| // NOTE: we need to double escape the "\\" here because conn.prepareStatement would |
| // also try to evaluate the escaping. As a result, to represent what normally would be |
| // a "\d" in this test, it would become "\\\\d". |
| String query[] = { |
| "SELECT regexp_replace('', '') FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_replace('', 'abc', 'def') FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_replace('123abcABC', '[a-z]+') FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_replace('123-abc-ABC', '-[a-zA-Z-]+') FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_replace('abcABC123', '\\\\d+', '') FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_replace('abcABC123', '\\\\D+', '') FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_replace('abc', 'abc', 'def') FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_replace('abc123ABC', '\\\\d+', 'def') FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_replace('abc123ABC', '[0-9]+', '#') FROM "+bTableName+" LIMIT 1", |
| "SELECT CASE WHEN regexp_replace('abcABC123', '[a-zA-Z]+') = '123' THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| "SELECT A_STRING FROM "+bTableName+" WHERE A_ID = regexp_replace('abcABC111', '[a-zA-Z]+') LIMIT 1", // 111 |
| // Test for multibyte characters support. |
| "SELECT regexp_replace('Ďď Ēĕ ĜĞ ϗϘϛϢ', '[a-zA-Z]+') FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_replace('Ďď Ēĕ ĜĞ ϗϘϛϢ', '[Ď-ě]+', '#') FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_replace('Ďď Ēĕ ĜĞ ϗϘϛϢ', '.+', 'replacement') FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_replace('Ďď Ēĕ ĜĞ ϗϘϛϢ', 'Ďď', 'DD') FROM "+bTableName+" LIMIT 1", |
| }; |
| String result[] = { |
| null, |
| null, |
| "123ABC", |
| "123", |
| "abcABC", |
| "123", |
| "def", |
| "abcdefABC", |
| "abc#ABC", |
| "1", |
| "abc", // the first column |
| "Ďď Ēĕ ĜĞ ϗϘϛϢ", |
| "# # ĜĞ ϗϘϛϢ", |
| "replacement", |
| "DD Ēĕ ĜĞ ϗϘϛϢ", |
| }; |
| assertEquals(query.length,result.length); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| for (int i = 0; i < query.length; i++) { |
| PreparedStatement statement = conn.prepareStatement(query[i]); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(result[i], rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testRegexpSubstrFunction() throws Exception { |
| String bTableName = generateUniqueName(); |
| String query[] = { |
| "SELECT regexp_substr('', '', 0) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('', '', 1) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('', 'abc', 0) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('abc', '', 0) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('123', '123', 3) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('123', '123', -4) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('123ABC', '[a-z]+', 0) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('123ABC', '[0-9]+', 4) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('123ABCabc', '\\\\d+', 0) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('123ABCabc', '\\\\D+', 0) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('123ABCabc', '\\\\D+', 4) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('123ABCabc', '\\\\D+', 7) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('na11-app5-26-sjl', '[^-]+', 0) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('na11-app5-26-sjl', '[^-]+') FROM "+bTableName+" LIMIT 1", |
| // Test for multibyte characters support. |
| "SELECT regexp_substr('ĎďĒĕĜĞ', '.+') FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('ĎďĒĕĜĞ', '.+', 3) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('ĎďĒĕĜĞ', '[a-zA-Z]+', 0) FROM "+bTableName+" LIMIT 1", |
| "SELECT regexp_substr('ĎďĒĕĜĞ', '[Ď-ě]+', 3) FROM "+bTableName+" LIMIT 1", |
| }; |
| String result[] = { |
| null, |
| null, |
| null, |
| null, |
| null, |
| null, |
| null, |
| null, |
| "123", |
| "ABCabc", |
| "ABCabc", |
| "abc", |
| "na11", |
| "na11", |
| "ĎďĒĕĜĞ", |
| "ĒĕĜĞ", |
| null, |
| "Ēĕ", |
| }; |
| assertEquals(query.length,result.length); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| for (int i = 0; i < query.length; i++) { |
| PreparedStatement statement = conn.prepareStatement(query[i]); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(result[i], rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testRegexpSubstrFunction2() throws Exception { |
| String tTableName = generateUniqueName(); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| String ddl = "create table " + tTableName + " (k INTEGER NOT NULL PRIMARY KEY, name VARCHAR)"; |
| conn.createStatement().execute(ddl); |
| conn.close(); |
| |
| String dml = "upsert into " + tTableName + " values(?,?)"; |
| conn = DriverManager.getConnection(url, props); |
| PreparedStatement stmt = conn.prepareStatement(dml); |
| String[] values = new String[] {"satax","jruls","hrjcu","yqtrv","jjcvw"}; |
| for (int i = 0; i < values.length; i++) { |
| stmt.setInt(1, i+1); |
| stmt.setString(2, values[i]); |
| stmt.execute(); |
| } |
| conn.commit(); |
| conn.close(); |
| |
| // This matches what Oracle returns for regexp_substr, even through |
| // it seems oke for "satax", it should return null. |
| String query = "select regexp_substr(name,'[^s]+',1) from " + tTableName + " limit 5"; |
| conn = DriverManager.getConnection(url, props); |
| ResultSet rs = conn.createStatement().executeQuery(query); |
| int count = 0; |
| String[] results = new String[] {"atax","jrul","hrjcu","yqtrv","jjcvw"}; |
| while (rs.next()) { |
| assertEquals(results[count],rs.getString(1)); |
| count++; |
| } |
| } |
| |
| @Test |
| public void testLikeConstant() throws Exception { |
| String bTableName = generateUniqueName(); |
| String query[] = { |
| "SELECT CASE WHEN 'ABC' LIKE '' THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| "SELECT CASE WHEN 'ABC' LIKE 'A_' THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| "SELECT CASE WHEN 'ABC' LIKE 'A__' THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| "SELECT CASE WHEN 'AB_C' LIKE 'AB\\_C' THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| "SELECT CASE WHEN 'ABC%DE' LIKE 'ABC\\%D%' THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| }; |
| String result[] = { |
| "2", |
| "2", |
| "1", |
| "1", |
| "1", |
| }; |
| assertEquals(query.length,result.length); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| for (int i = 0; i < query.length; i++) { |
| PreparedStatement statement = conn.prepareStatement(query[i]); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(query[i],result[i], rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testInListConstant() throws Exception { |
| String bTableName = generateUniqueName(); |
| |
| String query[] = { |
| "SELECT CASE WHEN 'a' IN (null,'a') THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| "SELECT CASE WHEN NOT 'a' IN (null,'b') THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| "SELECT CASE WHEN 'a' IN (null,'b') THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| "SELECT CASE WHEN NOT 'a' IN ('c','b') THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| "SELECT CASE WHEN 1 IN ('foo',2,1) THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| "SELECT CASE WHEN NOT null IN ('c','b') THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| "SELECT CASE WHEN NOT null IN (null,'c','b') THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| "SELECT CASE WHEN null IN (null,'c','b') THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| "SELECT CASE WHEN 'a' IN (null,1) THEN '1' ELSE '2' END FROM "+bTableName+" LIMIT 1", |
| }; |
| String result[] = { |
| "1", |
| "1", |
| "2", |
| "1", |
| "1", |
| "2", |
| "2", |
| "2", |
| "2" |
| }; |
| assertEquals(query.length,result.length); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| for (int i = 0; i < query.length; i++) { |
| PreparedStatement statement = conn.prepareStatement(query[i]); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(query[i],result[i], rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testLikeOnColumn() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| ensureTableCreated(getUrl(),pTSDBTableName, PTSDB_NAME, null, null, null); |
| // Insert all rows at ts |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| PreparedStatement stmt = conn.prepareStatement("upsert into "+pTSDBTableName+" VALUES (?, ?, ?, 0.5)"); |
| stmt.setDate(3, D1); |
| |
| stmt.setString(1, "a"); |
| stmt.setString(2, "a"); |
| stmt.execute(); |
| |
| stmt.setString(1, "x"); |
| stmt.setString(2, "a"); |
| stmt.execute(); |
| |
| stmt.setString(1, "xy"); |
| stmt.setString(2, "b"); |
| stmt.execute(); |
| |
| stmt.setString(1, "xyz"); |
| stmt.setString(2, "c"); |
| stmt.execute(); |
| |
| stmt.setString(1, "xyza"); |
| stmt.setString(2, "d"); |
| stmt.execute(); |
| |
| stmt.setString(1, "xyzab"); |
| stmt.setString(2, "e"); |
| stmt.execute(); |
| |
| stmt.setString(1, "z"); |
| stmt.setString(2, "e"); |
| stmt.execute(); |
| |
| conn.commit(); |
| conn.close(); |
| |
| url = getUrl(); |
| conn = DriverManager.getConnection(url, props); |
| PreparedStatement statement; |
| ResultSet rs; |
| try { |
| // Test 1 |
| statement = conn.prepareStatement("SELECT INST FROM "+pTSDBTableName+" WHERE INST LIKE 'x%'"); |
| rs = statement.executeQuery(); |
| |
| assertTrue(rs.next()); |
| assertEquals("x", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xy", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyz", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyza", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyzab", rs.getString(1)); |
| |
| assertFalse(rs.next()); |
| |
| // Test 2 |
| statement = conn.prepareStatement("SELECT INST FROM "+pTSDBTableName+" WHERE INST LIKE 'xy_a%'"); |
| rs = statement.executeQuery(); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyza", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyzab", rs.getString(1)); |
| |
| assertFalse(rs.next()); |
| |
| // Test 3 |
| statement = conn.prepareStatement("SELECT INST FROM "+pTSDBTableName+" WHERE INST NOT LIKE 'xy_a%'"); |
| rs = statement.executeQuery(); |
| |
| assertTrue(rs.next()); |
| assertEquals("a", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("x", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xy", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyz", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("z", rs.getString(1)); |
| |
| assertFalse(rs.next()); |
| |
| // Test 4 |
| statement = conn.prepareStatement("SELECT INST FROM "+pTSDBTableName+" WHERE 'xzabc' LIKE 'xy_a%'"); |
| rs = statement.executeQuery(); |
| assertFalse(rs.next()); |
| |
| // Test 5 |
| statement = conn.prepareStatement("SELECT INST FROM "+pTSDBTableName+" WHERE 'abcdef' LIKE '%bCd%'"); |
| rs = statement.executeQuery(); |
| assertFalse(rs.next()); |
| |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testILikeOnColumn() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| ensureTableCreated(getUrl(),pTSDBTableName, PTSDB_NAME, null, null, null); |
| // Insert all rows at ts |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| PreparedStatement stmt = conn.prepareStatement("upsert into "+pTSDBTableName+"(INST, HOST, \"DATE\", VAL, PATTERN VARCHAR) VALUES (?, ?, ?, 0.5, 'x_Z%')"); |
| stmt.setDate(3, D1); |
| |
| stmt.setString(1, "a"); |
| stmt.setString(2, "a"); |
| stmt.execute(); |
| |
| stmt.setString(1, "x"); |
| stmt.setString(2, "a"); |
| stmt.execute(); |
| |
| stmt.setString(1, "xy"); |
| stmt.setString(2, "b"); |
| stmt.execute(); |
| |
| stmt.setString(1, "xyz"); |
| stmt.setString(2, "c"); |
| stmt.execute(); |
| |
| stmt.setString(1, "xyza"); |
| stmt.setString(2, "d"); |
| stmt.execute(); |
| |
| stmt.setString(1, "xyzab"); |
| stmt.setString(2, "e"); |
| stmt.execute(); |
| |
| stmt.setString(1, "z"); |
| stmt.setString(2, "e"); |
| stmt.execute(); |
| |
| conn.commit(); |
| conn.close(); |
| |
| url = getUrl(); |
| conn = DriverManager.getConnection(url, props); |
| PreparedStatement statement; |
| ResultSet rs; |
| try { |
| // Test 1 |
| statement = conn.prepareStatement("SELECT INST FROM "+pTSDBTableName+" WHERE INST ILIKE 'x%'"); |
| rs = statement.executeQuery(); |
| |
| assertTrue(rs.next()); |
| assertEquals("x", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xy", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyz", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyza", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyzab", rs.getString(1)); |
| |
| assertFalse(rs.next()); |
| |
| // Test 2 |
| statement = conn.prepareStatement("SELECT INST FROM "+pTSDBTableName+" WHERE INST ILIKE 'xy_a%'"); |
| rs = statement.executeQuery(); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyza", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyzab", rs.getString(1)); |
| |
| assertFalse(rs.next()); |
| |
| // Test 3 |
| statement = conn.prepareStatement("SELECT INST FROM "+pTSDBTableName+" WHERE INST NOT ILIKE 'xy_a%'"); |
| rs = statement.executeQuery(); |
| |
| assertTrue(rs.next()); |
| assertEquals("a", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("x", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xy", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyz", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("z", rs.getString(1)); |
| |
| assertFalse(rs.next()); |
| |
| // Test 4 |
| statement = conn.prepareStatement("SELECT INST FROM "+pTSDBTableName+" WHERE 'xzabc' ILIKE 'xy_a%'"); |
| rs = statement.executeQuery(); |
| assertFalse(rs.next()); |
| |
| // Test 5 |
| statement = conn.prepareStatement("SELECT INST FROM "+pTSDBTableName+" WHERE 'abcdef' ILIKE '%bCd%'"); |
| rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| |
| // Test 5 |
| statement = conn.prepareStatement("SELECT INST FROM "+pTSDBTableName+"(PATTERN VARCHAR) WHERE INST ILIKE PATTERN"); |
| rs = statement.executeQuery(); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyz", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyza", rs.getString(1)); |
| |
| assertTrue(rs.next()); |
| assertEquals("xyzab", rs.getString(1)); |
| |
| assertFalse(rs.next()); |
| |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testIsNullInPK() throws Exception { |
| String pTSDBTableName = generateUniqueName(); |
| ensureTableCreated(getUrl(),pTSDBTableName, PTSDB_NAME, null, null, null); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| PreparedStatement stmt = conn.prepareStatement("upsert into "+pTSDBTableName+" VALUES ('', '', ?, 0.5)"); |
| stmt.setDate(1, D1); |
| stmt.execute(); |
| conn.close(); |
| |
| String query = "SELECT HOST,INST,\"DATE\" FROM "+pTSDBTableName+" WHERE HOST IS NULL AND INST IS NULL AND \"DATE\"=?"; |
| url = getUrl(); |
| conn = DriverManager.getConnection(url, props); |
| try { |
| PreparedStatement statement = conn.prepareStatement(query); |
| statement.setDate(1, D1); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertNull(rs.getString(1)); |
| assertNull(rs.getString(2)); |
| assertEquals(D1, rs.getDate(3)); |
| assertFalse(rs.next()); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testLengthFunction() throws Exception { |
| String bTableName = generateUniqueName(); |
| String query[] = { |
| "SELECT length('') FROM "+bTableName+" LIMIT 1", |
| "SELECT length(' ') FROM "+bTableName+" LIMIT 1", |
| "SELECT length('1') FROM "+bTableName+" LIMIT 1", |
| "SELECT length('1234') FROM "+bTableName+" LIMIT 1", |
| "SELECT length('ɚɦɰɸ') FROM "+bTableName+" LIMIT 1", |
| "SELECT length('ǢǛǟƈ') FROM "+bTableName+" LIMIT 1", |
| "SELECT length('This is a test!') FROM "+bTableName+" LIMIT 1", |
| "SELECT A_STRING FROM "+bTableName+" WHERE length(A_STRING)=3", |
| }; |
| String result[] = { |
| null, |
| "1", |
| "1", |
| "4", |
| "4", |
| "4", |
| "15", |
| "abc", |
| }; |
| assertEquals(query.length,result.length); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| for (int i = 0; i < query.length; i++) { |
| PreparedStatement statement = conn.prepareStatement(query[i]); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(query[i],result[i], rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testUpperFunction() throws Exception { |
| String bTableName = generateUniqueName(); |
| String query[] = { |
| "SELECT upper('abc') FROM "+bTableName+" LIMIT 1", |
| "SELECT upper('Abc') FROM "+bTableName+" LIMIT 1", |
| "SELECT upper('ABC') FROM "+bTableName+" LIMIT 1", |
| "SELECT upper('ĎďĒ') FROM "+bTableName+" LIMIT 1", |
| "SELECT upper('ß') FROM "+bTableName+" LIMIT 1", |
| }; |
| String result[] = { |
| "ABC", |
| "ABC", |
| "ABC", |
| "ĎĎĒ", |
| "SS", |
| }; |
| assertEquals(query.length, result.length); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| for (int i = 0; i < query.length; i++) { |
| PreparedStatement statement = conn.prepareStatement(query[i]); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(query[i],result[i], rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testLowerFunction() throws Exception { |
| String bTableName = generateUniqueName(); |
| String query[] = { |
| "SELECT lower('abc') FROM "+bTableName+" LIMIT 1", |
| "SELECT lower('Abc') FROM "+bTableName+" LIMIT 1", |
| "SELECT lower('ABC') FROM "+bTableName+" LIMIT 1", |
| "SELECT lower('ĎďĒ') FROM "+bTableName+" LIMIT 1", |
| "SELECT lower('ß') FROM "+bTableName+" LIMIT 1", |
| "SELECT lower('SS') FROM "+bTableName+" LIMIT 1", |
| }; |
| String result[] = { |
| "abc", |
| "abc", |
| "abc", |
| "ďďē", |
| "ß", |
| "ss", |
| }; |
| assertEquals(query.length, result.length); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| for (int i = 0; i < query.length; i++) { |
| PreparedStatement statement = conn.prepareStatement(query[i]); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(query[i],result[i], rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testRTrimFunction() throws Exception { |
| String bTableName = generateUniqueName(); |
| String varcharKeyTestTable = generateUniqueName(); |
| String query[] = { |
| "SELECT rtrim('') FROM "+bTableName+" LIMIT 1", |
| "SELECT rtrim(' ') FROM "+bTableName+" LIMIT 1", |
| "SELECT rtrim(' ') FROM "+bTableName+" LIMIT 1", |
| "SELECT rtrim('abc') FROM "+bTableName+" LIMIT 1", |
| "SELECT rtrim('abc ') FROM "+bTableName+" LIMIT 1", |
| "SELECT rtrim('abc def') FROM "+bTableName+" LIMIT 1", |
| "SELECT rtrim('abc def ') FROM "+bTableName+" LIMIT 1", |
| "SELECT rtrim('ĎďĒ ') FROM "+bTableName+" LIMIT 1", |
| "SELECT pk FROM "+varcharKeyTestTable+" WHERE rtrim(pk)='jkl' LIMIT 1", |
| }; |
| String result[] = { |
| null, |
| null, |
| null, |
| "abc", |
| "abc", |
| "abc def", |
| "abc def", |
| "ĎďĒ", |
| "jkl ", |
| }; |
| assertEquals(query.length, result.length); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| initVarcharKeyTableValues(null,varcharKeyTestTable); |
| for (int i = 0; i < query.length; i++) { |
| PreparedStatement statement = conn.prepareStatement(query[i]); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(query[i],result[i], rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testLTrimFunction() throws Exception { |
| String bTableName = generateUniqueName(); |
| String varcharKeyTestTable = generateUniqueName(); |
| String query[] = { |
| "SELECT ltrim('') FROM "+bTableName+" LIMIT 1", |
| "SELECT ltrim(' ') FROM "+bTableName+" LIMIT 1", |
| "SELECT ltrim(' ') FROM "+bTableName+" LIMIT 1", |
| "SELECT ltrim('abc') FROM "+bTableName+" LIMIT 1", |
| "SELECT ltrim(' abc') FROM "+bTableName+" LIMIT 1", |
| "SELECT ltrim('abc def') FROM "+bTableName+" LIMIT 1", |
| "SELECT ltrim(' abc def') FROM "+bTableName+" LIMIT 1", |
| "SELECT ltrim(' ĎďĒ') FROM "+bTableName+" LIMIT 1", |
| "SELECT pk FROM "+varcharKeyTestTable+" WHERE ltrim(pk)='def' LIMIT 1", |
| }; |
| String result[] = { |
| null, |
| null, |
| null, |
| "abc", |
| "abc", |
| "abc def", |
| "abc def", |
| "ĎďĒ", |
| " def", |
| }; |
| assertEquals(query.length, result.length); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| initVarcharKeyTableValues(null,varcharKeyTestTable); |
| for (int i = 0; i < query.length; i++) { |
| PreparedStatement statement = conn.prepareStatement(query[i]); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(query[i],result[i], rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testSubstrFunctionOnRowKeyInWhere() throws Exception { |
| String substrTestTableName = generateUniqueName(); |
| String url = getUrl(); |
| Connection conn = DriverManager.getConnection(url); |
| conn.createStatement().execute("CREATE TABLE "+substrTestTableName+" (s1 varchar not null, s2 varchar not null constraint pk primary key(s1,s2))"); |
| conn.close(); |
| |
| url = getUrl(); |
| conn = DriverManager.getConnection(url); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abc','a')"); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abcd','b')"); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abce','c')"); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abcde','d')"); |
| conn.commit(); |
| conn.close(); |
| |
| url = getUrl(); |
| conn = DriverManager.getConnection(url); |
| ResultSet rs = conn.createStatement().executeQuery("SELECT s1 from "+substrTestTableName+" where substr(s1,1,4) = 'abcd'"); |
| assertTrue(rs.next()); |
| assertEquals("abcd",rs.getString(1)); |
| assertTrue(rs.next()); |
| assertEquals("abcde",rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| |
| @Test |
| public void testRTrimFunctionOnRowKeyInWhere() throws Exception { |
| String substrTestTableName = generateUniqueName(); |
| String url = getUrl(); |
| Connection conn = DriverManager.getConnection(url); |
| conn.createStatement().execute("CREATE TABLE "+substrTestTableName+" (s1 varchar not null, s2 varchar not null constraint pk primary key(s1,s2))"); |
| conn.close(); |
| |
| url = getUrl(); |
| conn = DriverManager.getConnection(url); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abc','a')"); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abcd','b')"); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abcd ','c')"); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abcd ','c')"); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abcd a','c')"); // Need TRAVERSE_AND_LEAVE for cases like this |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abcde','d')"); |
| conn.commit(); |
| conn.close(); |
| |
| url = getUrl(); |
| conn = DriverManager.getConnection(url); |
| ResultSet rs = conn.createStatement().executeQuery("SELECT s1 from "+substrTestTableName+" where rtrim(s1) = 'abcd'"); |
| assertTrue(rs.next()); |
| assertEquals("abcd",rs.getString(1)); |
| assertTrue(rs.next()); |
| assertEquals("abcd ",rs.getString(1)); |
| assertTrue(rs.next()); |
| assertEquals("abcd ",rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| |
| @Test |
| public void testLikeFunctionOnRowKeyInWhere() throws Exception { |
| String substrTestTableName = generateUniqueName(); |
| String url = getUrl(); |
| Connection conn = DriverManager.getConnection(url); |
| conn.createStatement().execute("CREATE TABLE "+substrTestTableName+" (s1 varchar not null, s2 varchar not null constraint pk primary key(s1,s2))"); |
| conn.close(); |
| |
| url = getUrl(); |
| conn = DriverManager.getConnection(url); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abc','a')"); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abcd','b')"); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abcd-','c')"); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abcd-1','c')"); |
| conn.createStatement().execute("UPSERT INTO "+substrTestTableName+" VALUES('abce','d')"); |
| conn.commit(); |
| conn.close(); |
| |
| url = getUrl(); |
| conn = DriverManager.getConnection(url); |
| ResultSet rs = conn.createStatement().executeQuery("SELECT s1 from "+substrTestTableName+" where s1 like 'abcd%1'"); |
| assertTrue(rs.next()); |
| assertEquals("abcd-1",rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| |
| @Test |
| public void testTrimFunction() throws Exception { |
| String bTableName = generateUniqueName(); |
| String varcharKeyTestTable = generateUniqueName(); |
| String query[] = { |
| "SELECT trim('') FROM "+bTableName+" LIMIT 1", |
| "SELECT trim(' ') FROM "+bTableName+" LIMIT 1", |
| "SELECT trim(' ') FROM "+bTableName+" LIMIT 1", |
| "SELECT trim('abc') FROM "+bTableName+" LIMIT 1", |
| "SELECT trim(' abc') FROM "+bTableName+" LIMIT 1", |
| "SELECT trim('abc ') FROM "+bTableName+" LIMIT 1", |
| "SELECT trim('abc def') FROM "+bTableName+" LIMIT 1", |
| "SELECT trim(' abc def') FROM "+bTableName+" LIMIT 1", |
| "SELECT trim('abc def ') FROM "+bTableName+" LIMIT 1", |
| "SELECT trim(' abc def ') FROM "+bTableName+" LIMIT 1", |
| "SELECT trim(' ĎďĒ ') FROM "+bTableName+" LIMIT 1", |
| "SELECT pk FROM "+varcharKeyTestTable+" WHERE trim(pk)='ghi'", |
| }; |
| String result[] = { |
| null, |
| null, |
| null, |
| "abc", |
| "abc", |
| "abc", |
| "abc def", |
| "abc def", |
| "abc def", |
| "abc def", |
| "ĎďĒ", |
| " ghi ", |
| }; |
| assertEquals(query.length, result.length); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initBTableValues(null,bTableName); |
| initVarcharKeyTableValues(null,varcharKeyTestTable); |
| for (int i = 0; i < query.length; i++) { |
| PreparedStatement statement = conn.prepareStatement(query[i]); |
| ResultSet rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| assertEquals(query[i],result[i], rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| } finally { |
| conn.close(); |
| } |
| } |
| } |