Skip to content

Phoenix 7512 Report an undefined column error instead of the StringIndexOutOfBoundsException exception #2098

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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));
}
Expand Down Expand Up @@ -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);
Expand All @@ -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));
Expand Down Expand Up @@ -590,7 +596,7 @@ public static void addTupleAsOneCell(List<Cell> 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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<PColumn> pindexCols = pindexTable.getColumns();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down