| /* |
| * 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.PhoenixRuntime; |
| import org.apache.phoenix.util.PropertiesUtil; |
| import org.junit.Test; |
| |
| |
| |
| public class VariableLengthPKIT extends BaseClientManagedTimeIT { |
| 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(long ts) throws Exception { |
| ensureTableCreated(getUrl(),PTSDB_NAME, PTSDB_NAME, null, ts-2, null); |
| |
| // Insert all rows at ts |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| PreparedStatement stmt = conn.prepareStatement( |
| "upsert into " + |
| "PTSDB(" + |
| " 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(); |
| } |
| |
| protected static void initTableValues(byte[][] splits, long ts) throws Exception { |
| ensureTableCreated(getUrl(),PTSDB_NAME, PTSDB_NAME, splits, ts-2, null); |
| |
| // Insert all rows at ts |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| PreparedStatement stmt = conn.prepareStatement( |
| "upsert into " + |
| "PTSDB(" + |
| " 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(); |
| |
| ensureTableCreated(getUrl(),BTABLE_NAME, BTABLE_NAME, splits, ts-2, null); |
| conn.setAutoCommit(false); |
| |
| // Insert all rows at ts |
| stmt = conn.prepareStatement( |
| "upsert into " + |
| "BTABLE(" + |
| " 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(); |
| |
| String ddl = "create table VarcharKeyTest" + |
| " (pk varchar not null primary key)"; |
| createTestTable(getUrl(), ddl, splits, ts-2); |
| stmt = conn.prepareStatement( |
| "upsert into " + |
| "VarcharKeyTest(pk) " + |
| "VALUES (?)"); |
| stmt.setString(1, " def"); |
| stmt.execute(); |
| stmt.setString(1, "jkl "); |
| stmt.execute(); |
| stmt.setString(1, " ghi "); |
| stmt.execute(); |
| |
| conn.commit(); |
| conn.close(); |
| } |
| |
| @Test |
| public void testSingleColumnScanKey() throws Exception { |
| long ts = nextTimestamp(); |
| String query = "SELECT A_STRING,substr(a_id,1,1),B_STRING,A_INTEGER,B_INTEGER FROM BTABLE WHERE A_STRING=?"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query = "SELECT INST FROM PTSDB GROUP BY INST"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query = "SELECT HOST FROM PTSDB WHERE INST='abc' GROUP BY HOST"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query = "SELECT SUBSTR(INST,1,1),HOST FROM PTSDB GROUP BY SUBSTR(INST,1,1),HOST"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initGroupByRowKeyColumns(ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query = "SELECT HOST FROM PTSDB 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() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query = "SELECT MAX(INST),MAX(\"DATE\") FROM PTSDB 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() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query = "SELECT MAX(INST),MAX(\"DATE\") FROM PTSDB 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() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| // 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 BTABLE WHERE B_STRING=?"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| // TODO: add compile test to confirm start/stop scan key |
| String query = "SELECT A_STRING,substr(a_id,1,1),B_STRING,A_INTEGER,B_INTEGER FROM BTABLE WHERE A_STRING=? AND A_ID=? AND B_STRING=?"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| // TODO: add compile test to confirm start/stop scan key |
| String query = "SELECT A_STRING,substr(a_id,1,1),B_STRING,A_INTEGER,B_INTEGER FROM BTABLE WHERE A_STRING=? AND A_ID=? AND B_STRING>?"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| // TODO: add compile test to confirm start/stop scan key |
| String query = "SELECT A_STRING,substr(a_id,1,1),B_STRING,A_INTEGER,B_INTEGER FROM BTABLE WHERE A_STRING>? AND A_INTEGER>=?"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(),PTSDB_NAME, PTSDB_NAME, null, ts-2, null); |
| |
| // Insert all rows at ts |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| PreparedStatement stmt = conn.prepareStatement("upsert into PTSDB VALUES ('', '', ?, 0.5)"); |
| stmt.setDate(1, D1); |
| stmt.execute(); |
| conn.close(); |
| |
| // Comparisons against null are always false. |
| String query = "SELECT HOST,\"DATE\" FROM PTSDB WHERE HOST='' AND INST=''"; |
| url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| 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 { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(),PTSDB_NAME, PTSDB_NAME, null, ts-2, null); |
| |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; // 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 PTSDB 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 PTSDB WHERE INST='x' AND HOST='y'"; |
| url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| 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 { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(), PTSDB_NAME, PTSDB_NAME, null, ts-2, null); |
| |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; // 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 PTSDB 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 PTSDB WHERE INST='x''y'"; |
| String query2 = "SELECT INST,\"DATE\" FROM PTSDB WHERE INST='x\\\'y'"; |
| url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| 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 initPtsdbTableValues(long ts) throws Exception { |
| ensureTableCreated(getUrl(),PTSDB_NAME, PTSDB_NAME, null, ts-2, null); |
| |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; // 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 PTSDB VALUES ('x', 'y', ?, 0.5)"); |
| stmt.setDate(1, D1); |
| stmt.execute(); |
| conn.close(); |
| } |
| |
| @Test |
| public void testToStringOnDate() throws Exception { |
| long ts = nextTimestamp(); |
| initPtsdbTableValues(ts); |
| |
| String query = "SELECT HOST,\"DATE\" FROM PTSDB WHERE INST='x' AND HOST='y'"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| 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(long ts, Date d) throws Exception { |
| ensureTableCreated(getUrl(),PTSDB2_NAME, PTSDB2_NAME, null, ts-2, null); |
| |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; // 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 "+PTSDB2_NAME+"(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 { |
| long ts = nextTimestamp(); |
| Date date = new Date(System.currentTimeMillis()); |
| initPtsdbTableValues2(ts, date); |
| |
| String query = "SELECT MAX(val2)" |
| + " FROM "+PTSDB2_NAME |
| + " WHERE inst='a'" |
| + " GROUP BY ROUND(\"DATE\",'day',1)" |
| + " ORDER BY MAX(val2)"; // disambiguate row order |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| 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 { |
| long ts = nextTimestamp(); |
| Date date = new Date(System.currentTimeMillis()); |
| initPtsdbTableValues2(ts, date); |
| |
| String query = "SELECT inst,MAX(val2),MIN(val2)" |
| + " FROM "+PTSDB2_NAME |
| + " GROUP BY inst,ROUND(\"DATE\",'day',1)" |
| + " ORDER BY inst,ROUND(\"DATE\",'day',1)" |
| ; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| 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 { |
| long ts = nextTimestamp(); |
| Date date = new Date(System.currentTimeMillis()); |
| initPtsdbTableValues2(ts, date); |
| |
| String query = "SELECT COUNT(*)" |
| + " FROM "+PTSDB2_NAME |
| + " WHERE inst='a'"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| 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 { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(),PTSDB2_NAME, PTSDB2_NAME, null, ts-2, null); |
| Date d = new Date(ts); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); |
| String query = "SELECT SUM(val1),SUM(val2),SUM(val3) FROM "+PTSDB2_NAME; |
| String sql1 = "UPSERT INTO "+PTSDB2_NAME+"(inst,\"DATE\",val1) VALUES (?, ?, ?)"; |
| String sql2 = "UPSERT INTO "+PTSDB2_NAME+"(inst,\"DATE\",val2) VALUES (?, ?, ?)"; |
| String sql3 = "UPSERT INTO "+PTSDB2_NAME+"(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 |
| props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts+1)); |
| 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 { |
| long ts = nextTimestamp(); |
| initPtsdbTableValues(ts); |
| |
| String query = "SELECT * FROM PTSDB WHERE INST='x' AND HOST='y'"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| 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 { |
| long ts = nextTimestamp(); |
| initPtsdbTableValues(ts); |
| |
| String query = "SELECT HOST,TO_CHAR(\"DATE\") FROM PTSDB WHERE INST='x' AND HOST='y'"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| 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 { |
| long ts = nextTimestamp(); |
| initPtsdbTableValues(ts); |
| |
| String format = "HH:mm:ss"; |
| Format dateFormatter = DateUtil.getDateFormatter(format); |
| String query = "SELECT HOST,TO_CHAR(\"DATE\",'" + format + "') FROM PTSDB WHERE INST='x' AND HOST='y'"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| 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 { |
| long ts = nextTimestamp(); |
| initPtsdbTableValues(ts); |
| |
| String format = "yyyy-MM-dd HH:mm:ss.S"; |
| Format dateFormatter = DateUtil.getDateFormatter(format); |
| String query = "SELECT HOST,TO_CHAR(\"DATE\",'" + format + "') FROM PTSDB WHERE INST='x' AND HOST='y' and \"DATE\"=TO_DATE(?,'" + format + "')"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| 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 { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(),PTSDB_NAME, PTSDB_NAME, null, ts-2, null); |
| |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; // 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 PTSDB(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 { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(),BTABLE_NAME, BTABLE_NAME, null, ts-2, null); |
| |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; // 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 BTABLE 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(); |
| } |
| |
| // Broken, since we don't know if insert vs update. @Test |
| public void testMissingKVColumn() throws Exception { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(),BTABLE_NAME, BTABLE_NAME, null, ts-2, null); |
| |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; // 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 BTABLE VALUES (?, ?, ?, ?, ?, ?)"); |
| stmt.setString(1, "abc"); |
| stmt.setString(2, "123"); |
| stmt.setString(3, "x"); |
| stmt.setInt(4, 1); |
| stmt.setString(5, "ab"); |
| stmt.setInt(6, 1); |
| try { |
| stmt.execute(); |
| fail(); |
| } catch (ConstraintViolationException e) { |
| // Non nullable key value E_STRING has no value |
| assertTrue(e.getMessage().contains("may not be null")); |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testTooShortKVColumn() throws Exception { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(),BTABLE_NAME, BTABLE_NAME, null, ts-2, null); |
| |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; // 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 " + |
| "BTABLE(" + |
| " 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 { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(),BTABLE_NAME, BTABLE_NAME, null, ts-2, null); |
| |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; // 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 " + |
| "BTABLE(" + |
| " 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 { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(),BTABLE_NAME, BTABLE_NAME, null, ts-2, null); |
| |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; // 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 " + |
| "BTABLE(" + |
| " 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 { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(),BTABLE_NAME, BTABLE_NAME, null, ts-2, null); |
| |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; // 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 " + |
| "BTABLE(" + |
| " 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 { |
| long ts = nextTimestamp(); |
| String query = "SELECT B_INTEGER,C_INTEGER,COUNT(1) FROM BTABLE GROUP BY B_INTEGER,C_INTEGER"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query = "SELECT C_INTEGER,COUNT(1) FROM BTABLE GROUP BY C_INTEGER"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query = "SELECT A_ID, E_STRING, D_STRING, C_INTEGER, COUNT(1) FROM BTABLE GROUP BY A_ID, E_STRING, D_STRING, C_INTEGER"; |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query[] = { |
| "SELECT substr('ABC',-1,1) FROM BTABLE LIMIT 1", |
| "SELECT substr('ABC',-4,1) FROM BTABLE LIMIT 1", |
| "SELECT substr('ABC',2,4) FROM BTABLE LIMIT 1", |
| "SELECT substr('ABC',1,1) FROM BTABLE LIMIT 1", |
| "SELECT substr('ABC',0,1) FROM BTABLE LIMIT 1", |
| // Test for multibyte characters support. |
| "SELECT substr('ĎďĒ',0,1) FROM BTABLE LIMIT 1", |
| "SELECT substr('ĎďĒ',0,2) FROM BTABLE LIMIT 1", |
| "SELECT substr('ĎďĒ',1,1) FROM BTABLE LIMIT 1", |
| "SELECT substr('ĎďĒ',1,2) FROM BTABLE LIMIT 1", |
| "SELECT substr('ĎďĒ',2,1) FROM BTABLE LIMIT 1", |
| "SELECT substr('ĎďĒ',2,2) FROM BTABLE LIMIT 1", |
| "SELECT substr('ĎďĒ',-1,1) FROM BTABLE LIMIT 1", |
| "SELECT substr('Ďďɚʍ',2,4) FROM BTABLE LIMIT 1", |
| "SELECT pk FROM VarcharKeyTest WHERE substr(pk, 0, 3)='jkl'", |
| }; |
| String result[] = { |
| "C", |
| null, |
| "BC", |
| "A", |
| "A", |
| "Ď", |
| "Ďď", |
| "Ď", |
| "Ďď", |
| "ď", |
| "ďĒ", |
| "Ē", |
| "ďɚʍ", |
| "jkl ", |
| }; |
| assertEquals(query.length,result.length); |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| // 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 BTABLE LIMIT 1", |
| "SELECT regexp_replace('', 'abc', 'def') FROM BTABLE LIMIT 1", |
| "SELECT regexp_replace('123abcABC', '[a-z]+') FROM BTABLE LIMIT 1", |
| "SELECT regexp_replace('123-abc-ABC', '-[a-zA-Z-]+') FROM BTABLE LIMIT 1", |
| "SELECT regexp_replace('abcABC123', '\\\\d+', '') FROM BTABLE LIMIT 1", |
| "SELECT regexp_replace('abcABC123', '\\\\D+', '') FROM BTABLE LIMIT 1", |
| "SELECT regexp_replace('abc', 'abc', 'def') FROM BTABLE LIMIT 1", |
| "SELECT regexp_replace('abc123ABC', '\\\\d+', 'def') FROM BTABLE LIMIT 1", |
| "SELECT regexp_replace('abc123ABC', '[0-9]+', '#') FROM BTABLE LIMIT 1", |
| "SELECT CASE WHEN regexp_replace('abcABC123', '[a-zA-Z]+') = '123' THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| "SELECT A_STRING FROM BTABLE WHERE A_ID = regexp_replace('abcABC111', '[a-zA-Z]+') LIMIT 1", // 111 |
| // Test for multibyte characters support. |
| "SELECT regexp_replace('Ďď Ēĕ ĜĞ ϗϘϛϢ', '[a-zA-Z]+') from BTABLE LIMIT 1", |
| "SELECT regexp_replace('Ďď Ēĕ ĜĞ ϗϘϛϢ', '[Ď-ě]+', '#') from BTABLE LIMIT 1", |
| "SELECT regexp_replace('Ďď Ēĕ ĜĞ ϗϘϛϢ', '.+', 'replacement') from BTABLE LIMIT 1", |
| "SELECT regexp_replace('Ďď Ēĕ ĜĞ ϗϘϛϢ', 'Ďď', 'DD') from BTABLE 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() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query[] = { |
| "SELECT regexp_substr('', '', 0) FROM BTABLE LIMIT 1", |
| "SELECT regexp_substr('', '', 1) FROM BTABLE LIMIT 1", |
| "SELECT regexp_substr('', 'abc', 0) FROM BTABLE LIMIT 1", |
| "SELECT regexp_substr('abc', '', 0) FROM BTABLE LIMIT 1", |
| "SELECT regexp_substr('123', '123', 3) FROM BTABLE LIMIT 1", |
| "SELECT regexp_substr('123', '123', -4) FROM BTABLE LIMIT 1", |
| "SELECT regexp_substr('123ABC', '[a-z]+', 0) FROM BTABLE LIMIT 1", |
| "SELECT regexp_substr('123ABC', '[0-9]+', 4) FROM BTABLE LIMIT 1", |
| "SELECT regexp_substr('123ABCabc', '\\\\d+', 0) FROM BTABLE LIMIT 1", |
| "SELECT regexp_substr('123ABCabc', '\\\\D+', 0) FROM BTABLE LIMIT 1", |
| "SELECT regexp_substr('123ABCabc', '\\\\D+', 4) FROM BTABLE LIMIT 1", |
| "SELECT regexp_substr('123ABCabc', '\\\\D+', 7) FROM BTABLE LIMIT 1", |
| "SELECT regexp_substr('na11-app5-26-sjl', '[^-]+', 0) FROM BTABLE LIMIT 1", |
| "SELECT regexp_substr('na11-app5-26-sjl', '[^-]+') FROM BTABLE LIMIT 1", |
| // Test for multibyte characters support. |
| "SELECT regexp_substr('ĎďĒĕĜĞ', '.+') from BTABLE LIMIT 1", |
| "SELECT regexp_substr('ĎďĒĕĜĞ', '.+', 3) from BTABLE LIMIT 1", |
| "SELECT regexp_substr('ĎďĒĕĜĞ', '[a-zA-Z]+', 0) from BTABLE LIMIT 1", |
| "SELECT regexp_substr('ĎďĒĕĜĞ', '[Ď-ě]+', 3) from BTABLE 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() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String url = getUrl(); |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts)); |
| Connection conn = DriverManager.getConnection(url, props); |
| String ddl = "create table t (k INTEGER NOT NULL PRIMARY KEY, name VARCHAR)"; |
| conn.createStatement().execute(ddl); |
| conn.close(); |
| |
| String dml = "upsert into t values(?,?)"; |
| props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts+2)); |
| 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 t limit 5"; |
| props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts+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 { |
| long ts = nextTimestamp(); |
| String query[] = { |
| "SELECT CASE WHEN 'ABC' LIKE '' THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| "SELECT CASE WHEN 'ABC' LIKE 'A_' THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| "SELECT CASE WHEN 'ABC' LIKE 'A__' THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| "SELECT CASE WHEN 'AB_C' LIKE 'AB\\_C' THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| "SELECT CASE WHEN 'ABC%DE' LIKE 'ABC\\%D%' THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| }; |
| String result[] = { |
| "2", |
| "2", |
| "1", |
| "1", |
| "1", |
| }; |
| assertEquals(query.length,result.length); |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query[] = { |
| "SELECT CASE WHEN 'a' IN (null,'a') THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| "SELECT CASE WHEN NOT 'a' IN (null,'b') THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| "SELECT CASE WHEN 'a' IN (null,'b') THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| "SELECT CASE WHEN NOT 'a' IN ('c','b') THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| "SELECT CASE WHEN 1 IN ('foo',2,1) THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| "SELECT CASE WHEN NOT null IN ('c','b') THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| "SELECT CASE WHEN NOT null IN (null,'c','b') THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| "SELECT CASE WHEN null IN (null,'c','b') THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| "SELECT CASE WHEN 'a' IN (null,1) THEN '1' ELSE '2' END FROM BTABLE LIMIT 1", |
| }; |
| String result[] = { |
| "1", |
| "1", |
| "2", |
| "1", |
| "1", |
| "2", |
| "2", |
| "2", |
| "2" |
| }; |
| assertEquals(query.length,result.length); |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(),PTSDB_NAME, PTSDB_NAME, null, ts-2, null); |
| |
| // Insert all rows at ts |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| PreparedStatement stmt = conn.prepareStatement("upsert into PTSDB 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() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| conn = DriverManager.getConnection(url, props); |
| PreparedStatement statement; |
| ResultSet rs; |
| try { |
| // Test 1 |
| statement = conn.prepareStatement("SELECT INST FROM PTSDB 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 PTSDB 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 PTSDB 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 PTSDB WHERE 'xzabc' LIKE 'xy_a%'"); |
| rs = statement.executeQuery(); |
| assertFalse(rs.next()); |
| |
| // Test 5 |
| statement = conn.prepareStatement("SELECT INST FROM PTSDB WHERE 'abcdef' LIKE '%bCd%'"); |
| rs = statement.executeQuery(); |
| assertFalse(rs.next()); |
| |
| } finally { |
| conn.close(); |
| } |
| } |
| |
| @Test |
| public void testILikeOnColumn() throws Exception { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(),PTSDB_NAME, PTSDB_NAME, null, ts-2, null); |
| |
| // Insert all rows at ts |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| PreparedStatement stmt = conn.prepareStatement("upsert into PTSDB(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() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| conn = DriverManager.getConnection(url, props); |
| PreparedStatement statement; |
| ResultSet rs; |
| try { |
| // Test 1 |
| statement = conn.prepareStatement("SELECT INST FROM PTSDB 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 PTSDB 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 PTSDB 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 PTSDB WHERE 'xzabc' ILIKE 'xy_a%'"); |
| rs = statement.executeQuery(); |
| assertFalse(rs.next()); |
| |
| // Test 5 |
| statement = conn.prepareStatement("SELECT INST FROM PTSDB WHERE 'abcdef' ILIKE '%bCd%'"); |
| rs = statement.executeQuery(); |
| assertTrue(rs.next()); |
| |
| // Test 5 |
| statement = conn.prepareStatement("SELECT INST FROM PTSDB(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 { |
| long ts = nextTimestamp(); |
| ensureTableCreated(getUrl(),PTSDB_NAME, PTSDB_NAME, null, ts-2, null); |
| |
| // Insert all rows at ts |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + ts; |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| conn.setAutoCommit(true); |
| PreparedStatement stmt = conn.prepareStatement("upsert into PTSDB VALUES ('', '', ?, 0.5)"); |
| stmt.setDate(1, D1); |
| stmt.execute(); |
| conn.close(); |
| |
| String query = "SELECT HOST,INST,\"DATE\" FROM PTSDB WHERE HOST IS NULL AND INST IS NULL AND \"DATE\"=?"; |
| url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| 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 { |
| long ts = nextTimestamp(); |
| String query[] = { |
| "SELECT length('') FROM BTABLE LIMIT 1", |
| "SELECT length(' ') FROM BTABLE LIMIT 1", |
| "SELECT length('1') FROM BTABLE LIMIT 1", |
| "SELECT length('1234') FROM BTABLE LIMIT 1", |
| "SELECT length('ɚɦɰɸ') FROM BTABLE LIMIT 1", |
| "SELECT length('ǢǛǟƈ') FROM BTABLE LIMIT 1", |
| "SELECT length('This is a test!') FROM BTABLE LIMIT 1", |
| "SELECT A_STRING FROM BTABLE WHERE length(A_STRING)=3", |
| }; |
| String result[] = { |
| null, |
| "1", |
| "1", |
| "4", |
| "4", |
| "4", |
| "15", |
| "abc", |
| }; |
| assertEquals(query.length,result.length); |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query[] = { |
| "SELECT upper('abc') FROM BTABLE LIMIT 1", |
| "SELECT upper('Abc') FROM BTABLE LIMIT 1", |
| "SELECT upper('ABC') FROM BTABLE LIMIT 1", |
| "SELECT upper('ĎďĒ') FROM BTABLE LIMIT 1", |
| "SELECT upper('ß') FROM BTABLE LIMIT 1", |
| }; |
| String result[] = { |
| "ABC", |
| "ABC", |
| "ABC", |
| "ĎĎĒ", |
| "SS", |
| }; |
| assertEquals(query.length, result.length); |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query[] = { |
| "SELECT lower('abc') FROM BTABLE LIMIT 1", |
| "SELECT lower('Abc') FROM BTABLE LIMIT 1", |
| "SELECT lower('ABC') FROM BTABLE LIMIT 1", |
| "SELECT lower('ĎďĒ') FROM BTABLE LIMIT 1", |
| "SELECT lower('ß') FROM BTABLE LIMIT 1", |
| "SELECT lower('SS') FROM BTABLE LIMIT 1", |
| }; |
| String result[] = { |
| "abc", |
| "abc", |
| "abc", |
| "ďďē", |
| "ß", |
| "ss", |
| }; |
| assertEquals(query.length, result.length); |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query[] = { |
| "SELECT rtrim('') FROM BTABLE LIMIT 1", |
| "SELECT rtrim(' ') FROM BTABLE LIMIT 1", |
| "SELECT rtrim(' ') FROM BTABLE LIMIT 1", |
| "SELECT rtrim('abc') FROM BTABLE LIMIT 1", |
| "SELECT rtrim('abc ') FROM BTABLE LIMIT 1", |
| "SELECT rtrim('abc def') FROM BTABLE LIMIT 1", |
| "SELECT rtrim('abc def ') FROM BTABLE LIMIT 1", |
| "SELECT rtrim('ĎďĒ ') FROM BTABLE LIMIT 1", |
| "SELECT pk FROM VarcharKeyTest 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() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String query[] = { |
| "SELECT ltrim('') FROM BTABLE LIMIT 1", |
| "SELECT ltrim(' ') FROM BTABLE LIMIT 1", |
| "SELECT ltrim(' ') FROM BTABLE LIMIT 1", |
| "SELECT ltrim('abc') FROM BTABLE LIMIT 1", |
| "SELECT ltrim(' abc') FROM BTABLE LIMIT 1", |
| "SELECT ltrim('abc def') FROM BTABLE LIMIT 1", |
| "SELECT ltrim(' abc def') FROM BTABLE LIMIT 1", |
| "SELECT ltrim(' ĎďĒ') FROM BTABLE LIMIT 1", |
| "SELECT pk FROM VarcharKeyTest 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() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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 { |
| long ts = nextTimestamp(); |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts); |
| Connection conn = DriverManager.getConnection(url); |
| conn.createStatement().execute("CREATE TABLE substr_test (s1 varchar not null, s2 varchar not null constraint pk primary key(s1,s2))"); |
| conn.close(); |
| |
| url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 2); |
| conn = DriverManager.getConnection(url); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abc','a')"); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abcd','b')"); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abce','c')"); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abcde','d')"); |
| conn.commit(); |
| conn.close(); |
| |
| url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); |
| conn = DriverManager.getConnection(url); |
| ResultSet rs = conn.createStatement().executeQuery("SELECT s1 from substr_test 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 { |
| long ts = nextTimestamp(); |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts); |
| Connection conn = DriverManager.getConnection(url); |
| conn.createStatement().execute("CREATE TABLE substr_test (s1 varchar not null, s2 varchar not null constraint pk primary key(s1,s2))"); |
| conn.close(); |
| |
| url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 2); |
| conn = DriverManager.getConnection(url); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abc','a')"); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abcd','b')"); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abcd ','c')"); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abcd ','c')"); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abcd a','c')"); // Need TRAVERSE_AND_LEAVE for cases like this |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abcde','d')"); |
| conn.commit(); |
| conn.close(); |
| |
| url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); |
| conn = DriverManager.getConnection(url); |
| ResultSet rs = conn.createStatement().executeQuery("SELECT s1 from substr_test 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 { |
| long ts = nextTimestamp(); |
| String url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts); |
| Connection conn = DriverManager.getConnection(url); |
| conn.createStatement().execute("CREATE TABLE substr_test (s1 varchar not null, s2 varchar not null constraint pk primary key(s1,s2))"); |
| conn.close(); |
| |
| url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 2); |
| conn = DriverManager.getConnection(url); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abc','a')"); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abcd','b')"); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abcd-','c')"); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abcd-1','c')"); |
| conn.createStatement().execute("UPSERT INTO substr_test VALUES('abce','d')"); |
| conn.commit(); |
| conn.close(); |
| |
| url = getUrl() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); |
| conn = DriverManager.getConnection(url); |
| ResultSet rs = conn.createStatement().executeQuery("SELECT s1 from substr_test where s1 like 'abcd%1'"); |
| assertTrue(rs.next()); |
| assertEquals("abcd-1",rs.getString(1)); |
| assertFalse(rs.next()); |
| } |
| |
| @Test |
| public void testTrimFunction() throws Exception { |
| long ts = nextTimestamp(); |
| String query[] = { |
| "SELECT trim('') FROM BTABLE LIMIT 1", |
| "SELECT trim(' ') FROM BTABLE LIMIT 1", |
| "SELECT trim(' ') FROM BTABLE LIMIT 1", |
| "SELECT trim('abc') FROM BTABLE LIMIT 1", |
| "SELECT trim(' abc') FROM BTABLE LIMIT 1", |
| "SELECT trim('abc ') FROM BTABLE LIMIT 1", |
| "SELECT trim('abc def') FROM BTABLE LIMIT 1", |
| "SELECT trim(' abc def') FROM BTABLE LIMIT 1", |
| "SELECT trim('abc def ') FROM BTABLE LIMIT 1", |
| "SELECT trim(' abc def ') FROM BTABLE LIMIT 1", |
| "SELECT trim(' ĎďĒ ') FROM BTABLE LIMIT 1", |
| "SELECT pk FROM VarcharKeyTest 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() + ";" + PhoenixRuntime.CURRENT_SCN_ATTRIB + "=" + (ts + 5); // Run query at timestamp 5 |
| Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| Connection conn = DriverManager.getConnection(url, props); |
| try { |
| initTableValues(null, ts); |
| 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(); |
| } |
| } |
| } |