Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
4.0.0
-
None
-
None
Description
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.
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(); } }