You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@phoenix.apache.org by "Thomas D'Silva (JIRA)" <ji...@apache.org> on 2015/02/25 20:06:07 UTC

[jira] [Created] (PHOENIX-1684) Functional Index using REGEXP_SUBSTR doesn't work correctly

Thomas D'Silva created PHOENIX-1684:
---------------------------------------

             Summary: Functional Index using REGEXP_SUBSTR doesn't work correctly
                 Key: PHOENIX-1684
                 URL: https://issues.apache.org/jira/browse/PHOENIX-1684
             Project: Phoenix
          Issue Type: Bug
    Affects Versions: 4.0.0, 5.0.0
            Reporter: Thomas D'Silva
            Assignee: Thomas D'Silva


If you create a function index using REGEXP_SUBSTR(column_name,'id:[0-9]+') , the index is not used correctly. This is probably because of the special characters in the regex. 

{code}
protected void helpTestFunctionWithArgs(boolean mutable, boolean localIndex) throws Exception {
		Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
		Connection conn = DriverManager.getConnection(getUrl(), props);
		try {
			conn.createStatement().execute(
					"CREATE TABLE t (k VARCHAR NOT NULL PRIMARY KEY, v VARCHAR) "
							+ (mutable ? "IMMUTABLE_ROWS=true" : ""));
			String query = "SELECT * FROM t";
			ResultSet rs = conn.createStatement().executeQuery(query);
			assertFalse(rs.next());
			String ddl = "CREATE " + (localIndex ? "LOCAL" : "")
					+ " INDEX idx ON t (REGEXP_SUBSTR(v,'id:[0-9]+'))";
			PreparedStatement stmt = conn.prepareStatement(ddl);
			stmt.execute();
			query = "SELECT * FROM idx";
			rs = conn.createStatement().executeQuery(query);
			assertFalse(rs.next());

			stmt = conn.prepareStatement("UPSERT INTO t VALUES(?,?)");
			stmt.setString(1, "k1");
			stmt.setString(2, "v1");
			stmt.execute();
			stmt.setString(1, "k2");
			stmt.setString(2, "v2");
			stmt.execute();
			conn.commit();

			query = "SELECT k FROM t WHERE REGEXP_SUBSTR(v,'id:[0-9]+') = '1'";
			rs = conn.createStatement().executeQuery("EXPLAIN " + query);
			if (localIndex) {
				assertEquals(
						"CLIENT PARALLEL 1-WAY RANGE SCAN OVER IDX ['1']\n"
								+ "    SERVER FILTER BY FIRST KEY ONLY",
						QueryUtil.getExplainPlan(rs));
			} else {
				assertEquals(
						"CLIENT PARALLEL 1-WAY RANGE SCAN OVER IDX ['1']\n"
								+ "    SERVER FILTER BY FIRST KEY ONLY",
						QueryUtil.getExplainPlan(rs));
			}

			rs = conn.createStatement().executeQuery(query);
			assertTrue(rs.next());
			assertEquals("k1", rs.getString(1));
			assertFalse(rs.next());
		} finally {
			conn.close();
		}
	}
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)