diff --git a/phoenix-core-client/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java b/phoenix-core-client/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java index 876ace02270..6ab561f03b9 100644 --- a/phoenix-core-client/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java +++ b/phoenix-core-client/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java @@ -39,9 +39,21 @@ import java.io.EOFException; import java.io.IOException; import java.sql.SQLException; -import java.util.*; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Arrays; +import java.util.BitSet; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import java.util.Map.Entry; +import java.util.NavigableSet; +import java.util.Queue; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; +import java.util.UUID; import java.util.concurrent.CancellationException; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutionException; @@ -97,6 +109,7 @@ import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.query.QueryServicesOptions; import org.apache.phoenix.schema.ColumnFamilyNotFoundException; +import org.apache.phoenix.schema.ColumnNotFoundException; import org.apache.phoenix.schema.CompiledConditionalTTLExpression; import org.apache.phoenix.schema.PColumn; import org.apache.phoenix.schema.PColumnFamily; @@ -763,7 +776,7 @@ private static class GuidePostEstimate { private long lastUpdated = Long.MAX_VALUE; } - private int computeColumnsInCommon() { + private int computeColumnsInCommon() throws ColumnNotFoundException { PTable dataTable; if ((dataTable=dataPlan.getTableRef().getTable()).getBucketNum() != null) { // unable to compute prefix range for salted data table return 0; diff --git a/phoenix-core-client/src/main/java/org/apache/phoenix/schema/IndexUncoveredDataColumnRef.java b/phoenix-core-client/src/main/java/org/apache/phoenix/schema/IndexUncoveredDataColumnRef.java index 2bffdbb5c39..951056eb156 100644 --- a/phoenix-core-client/src/main/java/org/apache/phoenix/schema/IndexUncoveredDataColumnRef.java +++ b/phoenix-core-client/src/main/java/org/apache/phoenix/schema/IndexUncoveredDataColumnRef.java @@ -66,7 +66,7 @@ public ColumnRef cloneAtTimestamp(long timestamp) { } @Override - public ColumnExpression newColumnExpression(boolean schemaNameCaseSensitive, boolean colNameCaseSensitive) { + public ColumnExpression newColumnExpression(boolean schemaNameCaseSensitive, boolean colNameCaseSensitive) throws ColumnNotFoundException { String displayName = this.getTableRef().getColumnDisplayName(this, schemaNameCaseSensitive, colNameCaseSensitive); return new ProjectedColumnExpression(this.getColumn(), columns, position, displayName); } diff --git a/phoenix-core-client/src/main/java/org/apache/phoenix/schema/TableRef.java b/phoenix-core-client/src/main/java/org/apache/phoenix/schema/TableRef.java index 64f13acf6b9..e2a6b98d8d2 100644 --- a/phoenix-core-client/src/main/java/org/apache/phoenix/schema/TableRef.java +++ b/phoenix-core-client/src/main/java/org/apache/phoenix/schema/TableRef.java @@ -121,7 +121,7 @@ public void setHinted(boolean hinted) { this.hinted = hinted; } - public String getColumnDisplayName(ColumnRef ref, boolean cfCaseSensitive, boolean cqCaseSensitive) { + public String getColumnDisplayName(ColumnRef ref, boolean cfCaseSensitive, boolean cqCaseSensitive) throws ColumnNotFoundException { String cf = null; String cq = null; PColumn column = ref.getColumn(); diff --git a/phoenix-core-client/src/main/java/org/apache/phoenix/util/IndexUtil.java b/phoenix-core-client/src/main/java/org/apache/phoenix/util/IndexUtil.java index 01762600ab5..5b5e50e7d93 100644 --- a/phoenix-core-client/src/main/java/org/apache/phoenix/util/IndexUtil.java +++ b/phoenix-core-client/src/main/java/org/apache/phoenix/util/IndexUtil.java @@ -194,8 +194,12 @@ public static String getDataColumnName(String name) { return name.substring(name.indexOf(INDEX_COLUMN_NAME_SEP) + 1); } - public static String getDataColumnFamilyName(String name) { - return name.substring(0,name.indexOf(INDEX_COLUMN_NAME_SEP)); + public static String getDataColumnFamilyName(String name) throws ColumnNotFoundException { + int idxOfSeparator = name.indexOf(INDEX_COLUMN_NAME_SEP); + if (idxOfSeparator == -1){ + throw new ColumnNotFoundException(name); + } + return name.substring(0, idxOfSeparator); } public static String getActualColumnFamilyName(String name) { @@ -205,7 +209,7 @@ public static String getActualColumnFamilyName(String name) { return name; } - public static String getCaseSensitiveDataColumnFullName(String name) { + public static String getCaseSensitiveDataColumnFullName(String name) throws ColumnNotFoundException { int index = name.indexOf(INDEX_COLUMN_NAME_SEP) ; return SchemaUtil.getCaseSensitiveColumnDisplayName(getDataColumnFamilyName(name), name.substring(index+1)); } @@ -245,7 +249,7 @@ public static byte[] getLocalIndexColumnFamily(byte[] dataColumnFamilyBytes) { return getLocalIndexColumnFamily(dataCF).getBytes(StandardCharsets.UTF_8); } - public static PColumn getDataColumn(PTable dataTable, String indexColumnName) { + public static PColumn getDataColumn(PTable dataTable, String indexColumnName) throws ColumnNotFoundException { PColumn column = getDataColumnOrNull(dataTable, indexColumnName); if (column == null) { throw new IllegalArgumentException("Could not find column \"" + SchemaUtil.getColumnName(getDataColumnFamilyName(indexColumnName), getDataColumnName(indexColumnName)) + " in " + dataTable); @@ -270,6 +274,8 @@ public static PColumn getDataColumnOrNull(PTable dataTable, String indexColumnNa family = dataTable.getColumnFamily(getDataColumnFamilyName(indexColumnName)); } catch (ColumnFamilyNotFoundException e) { return null; + } catch (ColumnNotFoundException e) { + return null; } try { return family.getPColumnForColumnName(indexColumnName.substring(pos+1)); @@ -590,7 +596,7 @@ public static void addTupleAsOneCell(List result, result.add(keyValue); } - public static String getIndexColumnExpressionStr(PColumn col) { + public static String getIndexColumnExpressionStr(PColumn col) throws ColumnNotFoundException { return col.getExpressionStr() == null ? IndexUtil.getCaseSensitiveDataColumnFullName(col.getName().getString()) : col.getExpressionStr(); } diff --git a/phoenix-core-server/src/main/java/org/apache/phoenix/mapreduce/index/SourceTargetColumnNames.java b/phoenix-core-server/src/main/java/org/apache/phoenix/mapreduce/index/SourceTargetColumnNames.java index 1c7991ffe45..7bead7f8102 100644 --- a/phoenix-core-server/src/main/java/org/apache/phoenix/mapreduce/index/SourceTargetColumnNames.java +++ b/phoenix-core-server/src/main/java/org/apache/phoenix/mapreduce/index/SourceTargetColumnNames.java @@ -20,6 +20,7 @@ import java.util.List; import org.apache.phoenix.mapreduce.util.IndexColumnNames; +import org.apache.phoenix.schema.ColumnNotFoundException; import org.apache.phoenix.schema.PTable; import org.apache.phoenix.util.SchemaUtil; @@ -63,7 +64,7 @@ public static class DataSourceColNames extends IndexColumnNames * @param pdataTable the data table * @param pindexTable the index table for the data table */ - public DataSourceColNames(PTable pdataTable, PTable pindexTable) { + public DataSourceColNames(PTable pdataTable, PTable pindexTable) throws ColumnNotFoundException { super(pdataTable, pindexTable); } @@ -133,7 +134,7 @@ public static class IndexSourceColNames extends IndexColumnNames * @param pdataTable the data table * @param pindexTable the index table for the data table */ - public IndexSourceColNames(PTable pdataTable, PTable pindexTable) { + public IndexSourceColNames(PTable pdataTable, PTable pindexTable) throws ColumnNotFoundException { super(pdataTable, pindexTable); } diff --git a/phoenix-core-server/src/main/java/org/apache/phoenix/mapreduce/util/IndexColumnNames.java b/phoenix-core-server/src/main/java/org/apache/phoenix/mapreduce/util/IndexColumnNames.java index 2b93a861dde..bc45031bd34 100644 --- a/phoenix-core-server/src/main/java/org/apache/phoenix/mapreduce/util/IndexColumnNames.java +++ b/phoenix-core-server/src/main/java/org/apache/phoenix/mapreduce/util/IndexColumnNames.java @@ -23,6 +23,7 @@ import java.util.Set; import org.apache.phoenix.query.QueryConstants; +import org.apache.phoenix.schema.ColumnNotFoundException; import org.apache.phoenix.schema.PColumn; import org.apache.phoenix.schema.PTable; import org.apache.phoenix.schema.types.PDataType; @@ -48,7 +49,7 @@ public class IndexColumnNames { private PTable pdataTable; private PTable pindexTable; - public IndexColumnNames(final PTable pdataTable, final PTable pindexTable) { + public IndexColumnNames(final PTable pdataTable, final PTable pindexTable) throws ColumnNotFoundException { this.pdataTable = pdataTable; this.pindexTable = pindexTable; List pindexCols = pindexTable.getColumns(); diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java index 3d15b96a20d..8a5f1186cfd 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java @@ -62,12 +62,14 @@ import org.apache.phoenix.compile.QueryPlan; import org.apache.phoenix.coprocessorclient.BaseScannerRegionObserverConstants; import org.apache.phoenix.end2end.ExplainPlanWithStatsEnabledIT.Estimate; +import org.apache.phoenix.exception.SQLExceptionCode; import org.apache.phoenix.hbase.index.IndexRegionSplitPolicy; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.jdbc.PhoenixPreparedStatement; import org.apache.phoenix.jdbc.PhoenixResultSet; import org.apache.phoenix.jdbc.PhoenixStatement; import org.apache.phoenix.query.QueryConstants; +import org.apache.phoenix.schema.ColumnNotFoundException; import org.apache.phoenix.schema.PNameFactory; import org.apache.phoenix.schema.PTable; import org.apache.phoenix.schema.PTable.IndexType; @@ -234,6 +236,35 @@ public void testSelectFromIndexWithAdditionalWhereClause() throws Exception { testExtraWhere(conn, tableName); } + @Test + public void testSelectFromIndexWithWhereClauseButTheValueIsSurroundedByDoubleQuotes() throws Exception { + String tableName = schemaName + "." + generateUniqueName(); + String indexName = "IDX_" + generateUniqueName(); + String indexTableName = schemaName + "." + indexName; + try (Connection conn1 = getConnection()) { + if (isNamespaceMapped) { + conn1.createStatement().execute("CREATE SCHEMA IF NOT EXISTS " + schemaName); + } + String ddl = "CREATE TABLE " + tableName + " (t_id VARCHAR NOT NULL,\n" + + "k1 INTEGER NOT NULL,\n" + + "k2 INTEGER NOT NULL,\n" + + "k3 INTEGER,\n" + + "v1 VARCHAR,\n" + + "CONSTRAINT pk PRIMARY KEY (t_id, k1, k2))\n"; + conn1.createStatement().execute(ddl); + conn1.commit(); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(V1)"); + conn1.commit(); + ResultSet rs = conn1.createStatement() + .executeQuery("SELECT * FROM " + indexTableName + " WHERE \":T_ID\" = \"f\""); + assertTrue(rs.next()); + fail(); + } catch (ColumnNotFoundException e) { // Expected + assertEquals(SQLExceptionCode.COLUMN_NOT_FOUND.getErrorCode(), e.getErrorCode()); + assertEquals(new ColumnNotFoundException("f").getMessage(), e.getMessage()); + } + } + private void testExtraWhere(Connection conn, String tableName) throws SQLException { ResultSet rs = conn.createStatement().executeQuery("SELECT COUNT(*) FROM "+tableName+" WHERE v1 < 3 AND v2 < 4"); rs.next(); diff --git a/phoenix-core/src/test/java/org/apache/phoenix/mapreduce/util/IndexColumnNamesTest.java b/phoenix-core/src/test/java/org/apache/phoenix/mapreduce/util/IndexColumnNamesTest.java index 48c688f553c..63de78f9b07 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/mapreduce/util/IndexColumnNamesTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/mapreduce/util/IndexColumnNamesTest.java @@ -24,6 +24,7 @@ import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.mapreduce.index.BaseIndexTest; import org.apache.phoenix.parse.HintNode.Hint; +import org.apache.phoenix.schema.ColumnNotFoundException; import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.util.QueryUtil; import org.junit.Test; @@ -42,7 +43,7 @@ public class IndexColumnNamesTest extends BaseIndexTest { "CREATE INDEX PRECISION_NAME_IDX_TEST ON PRECISION_NAME_TEST(VARCHAR_TEST) INCLUDE (CHAR_TEST,DECIMAL_TEST,BINARY_TEST,VARCHAR_UNSPEC,DEC_UNSPEC)"; @Test - public void testGetColumnNames() { + public void testGetColumnNames() throws ColumnNotFoundException { IndexColumnNames indexColumnNames = new IndexColumnNames(pDataTable, pIndexTable); assertEquals("[ID, PK_PART2, 0.NAME, 0.ZIP]", indexColumnNames.getDataColNames().toString()); assertEquals("[:ID, :PK_PART2, 0:NAME, 0:ZIP]", indexColumnNames.getIndexColNames().toString()); //index column names, leading with the data table pk