This is an automated email from the ASF dual-hosted git repository. stoty pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/master by this push: new 00d0f38780 PHOENIX-6920 PhoenixResultSetMetaData doesn't distinguish between label and column_name 00d0f38780 is described below commit 00d0f387804aa817c1908a843969416a56be7d79 Author: Aron Meszaros <meszaros.aron.att...@gmail.com> AuthorDate: Thu Aug 24 15:44:35 2023 +0200 PHOENIX-6920 PhoenixResultSetMetaData doesn't distinguish between label and column_name --- .../apache/phoenix/compile/ColumnProjector.java | 10 +- .../phoenix/compile/ExpressionProjector.java | 16 +++- .../apache/phoenix/compile/ListJarsQueryPlan.java | 2 +- .../apache/phoenix/compile/ProjectionCompiler.java | 34 +++++-- .../org/apache/phoenix/compile/RowProjector.java | 7 +- .../org/apache/phoenix/compile/TraceQueryPlan.java | 2 +- .../org/apache/phoenix/compile/UnionCompiler.java | 2 +- .../phoenix/jdbc/PhoenixDatabaseMetaData.java | 84 ++++++++--------- .../org/apache/phoenix/jdbc/PhoenixResultSet.java | 2 +- .../phoenix/jdbc/PhoenixResultSetMetaData.java | 3 +- .../org/apache/phoenix/jdbc/PhoenixStatement.java | 6 +- .../apache/phoenix/compile/QueryCompilerTest.java | 6 ++ .../apache/phoenix/compile/QueryMetaDataTest.java | 3 +- .../phoenix/jdbc/PhoenixResultSetMetadataTest.java | 105 +++++++++++++++++++++ 14 files changed, 213 insertions(+), 69 deletions(-) diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/ColumnProjector.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/ColumnProjector.java index 88c795685c..9cd600cdd7 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/ColumnProjector.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/ColumnProjector.java @@ -36,11 +36,17 @@ import org.apache.phoenix.schema.tuple.Tuple; */ public interface ColumnProjector { /** - * Get the column name as it was referenced in the query + * Get the column name * @return the database column name */ String getName(); - + + /** + * Get the expression string + * @return the label as it was referenced in the query + */ + String getLabel(); + /** * Get the expression * @return the expression for the column projector diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionProjector.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionProjector.java index 39349b0fbe..bc8902df25 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionProjector.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionProjector.java @@ -26,12 +26,11 @@ import org.apache.phoenix.schema.types.PDataType; import org.apache.phoenix.schema.tuple.Tuple; - /** * * Projector for getting value from a select statement for an expression * - * + * * @since 0.1 */ public class ExpressionProjector implements ColumnProjector { @@ -39,14 +38,16 @@ public class ExpressionProjector implements ColumnProjector { private final Expression expression; private final String tableName; private final boolean isCaseSensitive; - - public ExpressionProjector(String name, String tableName, Expression expression, boolean isCaseSensitive) { + private final String label; + + public ExpressionProjector(String name, String label, String tableName, Expression expression, boolean isCaseSensitive) { this.name = name; + this.label = label; this.expression = expression; this.tableName = tableName; this.isCaseSensitive = isCaseSensitive; } - + @Override public String getTableName() { return tableName; @@ -62,6 +63,11 @@ public class ExpressionProjector implements ColumnProjector { return name; } + @Override + public String getLabel() { + return label; + } + @Override public final Object getValue(Tuple tuple, PDataType type, ImmutableBytesWritable ptr) throws SQLException { try { diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java index 945c047197..61bab5e50a 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java @@ -91,7 +91,7 @@ public class ListJarsQueryPlan implements QueryPlan { columns.add(column); Expression expression = new RowKeyColumnExpression(column, new RowKeyValueAccessor(columns, 0)); - projectedColumns.add(new ExpressionProjector("jar_location", "", expression, + projectedColumns.add(new ExpressionProjector("jar_location", "jar_location", "", expression, true)); int estimatedByteSize = SizedUtil.KEY_VALUE_SIZE; JARS_PROJECTOR = new RowProjector(projectedColumns, estimatedByteSize, false); diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java index 1fc74297b2..4de0681aad 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java @@ -180,7 +180,7 @@ public class ProjectionCompiler { } projectedExpressions.add(expression); boolean isCaseSensitive = !SchemaUtil.normalizeIdentifier(colName).equals(colName); - projectedColumns.add(new ExpressionProjector(colName, tableRef.getTableAlias() == null ? table.getName().getString() : tableRef.getTableAlias(), expression, isCaseSensitive)); + projectedColumns.add(new ExpressionProjector(colName, colName, tableRef.getTableAlias() == null ? table.getName().getString() : tableRef.getTableAlias(), expression, isCaseSensitive)); } } @@ -277,7 +277,7 @@ public class ProjectionCompiler { // appear as a column in an index projectedExpressions.add(expression); boolean isCaseSensitive = !SchemaUtil.normalizeIdentifier(colName).equals(colName); - ExpressionProjector projector = new ExpressionProjector(colName, tableRef.getTableAlias() == null ? dataTable.getName().getString() : tableRef.getTableAlias(), expression, isCaseSensitive); + ExpressionProjector projector = new ExpressionProjector(colName, colName, tableRef.getTableAlias() == null ? dataTable.getName().getString() : tableRef.getTableAlias(), expression, isCaseSensitive); projectedColumns.add(projector); } } @@ -294,7 +294,7 @@ public class ProjectionCompiler { projectedExpressions.add(expression); String colName = column.getName().toString(); boolean isCaseSensitive = !SchemaUtil.normalizeIdentifier(colName).equals(colName); - projectedColumns.add(new ExpressionProjector(colName, tableRef.getTableAlias() == null ? + projectedColumns.add(new ExpressionProjector(colName, colName, tableRef.getTableAlias() == null ? table.getName().getString() : tableRef.getTableAlias(), expression, isCaseSensitive)); } } @@ -350,7 +350,7 @@ public class ProjectionCompiler { projectedExpressions.add(expression); String colName = column.getName().toString(); boolean isCaseSensitive = !SchemaUtil.normalizeIdentifier(colName).equals(colName); - projectedColumns.add(new ExpressionProjector(colName, + projectedColumns.add(new ExpressionProjector(colName, colName, tableRef.getTableAlias() == null ? dataTable.getName().getString() : tableRef.getTableAlias(), expression, isCaseSensitive)); @@ -470,10 +470,24 @@ public class ProjectionCompiler { ExpressionCompiler.throwNonAggExpressionInAggException(expression.toString()); } } - String columnAlias = aliasedNode.getAlias() != null ? aliasedNode.getAlias() : SchemaUtil.normalizeIdentifier(aliasedNode.getNode().getAlias()); - boolean isCaseSensitive = aliasedNode.getAlias() != null ? aliasedNode.isCaseSensitve() : (columnAlias != null ? SchemaUtil.isCaseSensitive(aliasedNode.getNode().getAlias()) : selectVisitor.isCaseSensitive); - String name = columnAlias == null ? expression.toString() : columnAlias; - projectedColumns.add(new ExpressionProjector(name, tableRef.getTableAlias() == null ? (table.getName() == null ? "" : table.getName().getString()) : tableRef.getTableAlias(), expression, isCaseSensitive)); + + String tableName = tableRef.getTableAlias() == null ? + (table.getName() == null ? + "" : + table.getName().getString()) : + tableRef.getTableAlias(); + String colName = SchemaUtil.normalizeIdentifier(aliasedNode.getNode().getAlias()); + String name = colName == null ? expression.toString() : colName; + boolean isCaseSensitive = aliasedNode.getAlias() != null ? + aliasedNode.isCaseSensitve() : + (colName != null ? + SchemaUtil.isCaseSensitive(aliasedNode.getNode().getAlias()) : + selectVisitor.isCaseSensitive); + if (null != aliasedNode.getAlias()){ + projectedColumns.add(new ExpressionProjector(name, aliasedNode.getAlias(), tableName, expression, isCaseSensitive)); + } else { + projectedColumns.add(new ExpressionProjector(name, name, tableName, expression, isCaseSensitive)); + } } selectVisitor.reset(); @@ -513,7 +527,9 @@ public class ProjectionCompiler { ReplaceArrayFunctionExpressionVisitor visitor = new ReplaceArrayFunctionExpressionVisitor(replacementMap); for (int i = 0; i < projectedColumns.size(); i++) { ExpressionProjector projector = projectedColumns.get(i); - projectedColumns.set(i, new ExpressionProjector(projector.getName(), tableRef.getTableAlias() == null ? (table.getName() == null ? "" : table.getName().getString()) : tableRef.getTableAlias(), projector.getExpression().accept(visitor), projector.isCaseSensitive())); + projectedColumns.set(i, new ExpressionProjector(projector.getName(), + projector.getLabel(), + tableRef.getTableAlias() == null ? (table.getName() == null ? "" : table.getName().getString()) : tableRef.getTableAlias(), projector.getExpression().accept(visitor), projector.isCaseSensitive())); } } diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/RowProjector.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/RowProjector.java index 02cd547f93..1d997cb8a5 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/RowProjector.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/RowProjector.java @@ -93,9 +93,9 @@ public class RowProjector { ColumnProjector colProjector = columnProjectors.get(position); allCaseSensitive &= colProjector.isCaseSensitive(); someCaseSensitive |= colProjector.isCaseSensitive(); - reverseIndex.put(colProjector.getName(), position); + reverseIndex.put(colProjector.getLabel(), position); if (!colProjector.getTableName().isEmpty()) { - reverseIndex.put(SchemaUtil.getColumnName(colProjector.getTableName(), colProjector.getName()), position); + reverseIndex.put(SchemaUtil.getColumnName(colProjector.getTableName(), colProjector.getLabel()), position); } } this.allCaseSensitive = allCaseSensitive; @@ -130,7 +130,8 @@ public class RowProjector { CloneExpressionVisitor visitor = new CloneExpressionVisitor(); Expression clonedExpression = expression.accept(visitor); clonedColProjectors.add(new ExpressionProjector(colProjector.getName(), - colProjector.getTableName(), + colProjector.getLabel(), + colProjector.getTableName(), clonedExpression, colProjector.isCaseSensitive())); } else { diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/TraceQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/TraceQueryPlan.java index 44dd21d1c1..d8238c05be 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/TraceQueryPlan.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/TraceQueryPlan.java @@ -88,7 +88,7 @@ public class TraceQueryPlan implements QueryPlan { columns.add(column); Expression expression = new RowKeyColumnExpression(column, new RowKeyValueAccessor(columns, 0)); - projectedColumns.add(new ExpressionProjector(MetricInfo.TRACE.columnName, "", expression, + projectedColumns.add(new ExpressionProjector(MetricInfo.TRACE.columnName, MetricInfo.TRACE.columnName, "", expression, true)); int estimatedByteSize = SizedUtil.KEY_VALUE_SIZE + PLong.INSTANCE.getByteSize(); TRACE_PROJECTOR = new RowProjector(projectedColumns, estimatedByteSize, false); diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/UnionCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/UnionCompiler.java index 1176ebdc7e..6277affcda 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/UnionCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/UnionCompiler.java @@ -90,7 +90,7 @@ public class UnionCompiler { List<PColumn> projectedColumns = new ArrayList<PColumn>(); for (int i = 0; i < plan.getProjector().getColumnCount(); i++) { ColumnProjector colProj = plan.getProjector().getColumnProjector(i); - String name = selectNodes == null ? colProj.getName() : selectNodes.get(i).getAlias(); + String name = selectNodes == null ? colProj.getLabel() : selectNodes.get(i).getAlias(); PName colName = PNameFactory.newName(name); PColumnImpl projectedColumn = new PColumnImpl(PNameFactory.newName(name), UNION_FAMILY_NAME, targetTypes.get(i).getType(), targetTypes.get(i).getMaxLength(), diff --git a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java index 478a0aa874..4283a59e00 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java @@ -636,104 +636,104 @@ public class PhoenixDatabaseMetaData implements DatabaseMetaData { private static final RowProjector GET_COLUMNS_ROW_PROJECTOR = new RowProjector( Arrays.<ColumnProjector> asList( - new ExpressionProjector(TABLE_CAT, SYSTEM_CATALOG, + new ExpressionProjector(TABLE_CAT, TABLE_CAT, SYSTEM_CATALOG, new RowKeyColumnExpression(TENANT_ID_COLUMN, new RowKeyValueAccessor(PK_DATUM_LIST, 0)), false), - new ExpressionProjector(TABLE_SCHEM, SYSTEM_CATALOG, + new ExpressionProjector(TABLE_SCHEM, TABLE_SCHEM, SYSTEM_CATALOG, new RowKeyColumnExpression(TABLE_SCHEM_COLUMN, new RowKeyValueAccessor(PK_DATUM_LIST, 1)), false), - new ExpressionProjector(TABLE_NAME, SYSTEM_CATALOG, + new ExpressionProjector(TABLE_NAME, TABLE_NAME, SYSTEM_CATALOG, new RowKeyColumnExpression(TABLE_NAME_COLUMN, new RowKeyValueAccessor(PK_DATUM_LIST, 2)), false), - new ExpressionProjector(COLUMN_NAME, SYSTEM_CATALOG, + new ExpressionProjector(COLUMN_NAME, COLUMN_NAME, SYSTEM_CATALOG, new RowKeyColumnExpression(COLUMN_NAME_COLUMN, new RowKeyValueAccessor(PK_DATUM_LIST, 3)), false), - new ExpressionProjector(DATA_TYPE, SYSTEM_CATALOG, + new ExpressionProjector(DATA_TYPE, DATA_TYPE, SYSTEM_CATALOG, new KeyValueColumnExpression(DATA_TYPE_COLUMN), false), - new ExpressionProjector(TYPE_NAME, SYSTEM_CATALOG, + new ExpressionProjector(TYPE_NAME, TYPE_NAME, SYSTEM_CATALOG, new KeyValueColumnExpression(TYPE_NAME_COLUMN), false), - new ExpressionProjector(COLUMN_SIZE, SYSTEM_CATALOG, + new ExpressionProjector(COLUMN_SIZE, COLUMN_SIZE, SYSTEM_CATALOG, new KeyValueColumnExpression(COLUMN_SIZE_COLUMN), false), - new ExpressionProjector(BUFFER_LENGTH, SYSTEM_CATALOG, + new ExpressionProjector(BUFFER_LENGTH, BUFFER_LENGTH, SYSTEM_CATALOG, new KeyValueColumnExpression(BUFFER_LENGTH_COLUMN), false), - new ExpressionProjector(DECIMAL_DIGITS, SYSTEM_CATALOG, + new ExpressionProjector(DECIMAL_DIGITS, DECIMAL_DIGITS, SYSTEM_CATALOG, new KeyValueColumnExpression(DECIMAL_DIGITS_COLUMN), false), - new ExpressionProjector(NUM_PREC_RADIX, SYSTEM_CATALOG, + new ExpressionProjector(NUM_PREC_RADIX, NUM_PREC_RADIX, SYSTEM_CATALOG, new KeyValueColumnExpression(NUM_PREC_RADIX_COLUMN), false), - new ExpressionProjector(NULLABLE, SYSTEM_CATALOG, + new ExpressionProjector(NULLABLE, NULLABLE, SYSTEM_CATALOG, new KeyValueColumnExpression(NULLABLE_COLUMN), false), - new ExpressionProjector(REMARKS, SYSTEM_CATALOG, + new ExpressionProjector(REMARKS, REMARKS, SYSTEM_CATALOG, new KeyValueColumnExpression(REMARKS_COLUMN), false), - new ExpressionProjector(COLUMN_DEF, SYSTEM_CATALOG, + new ExpressionProjector(COLUMN_DEF, COLUMN_DEF, SYSTEM_CATALOG, new KeyValueColumnExpression(COLUMN_DEF_COLUMN), false), - new ExpressionProjector(SQL_DATA_TYPE, SYSTEM_CATALOG, + new ExpressionProjector(SQL_DATA_TYPE, SQL_DATA_TYPE, SYSTEM_CATALOG, new KeyValueColumnExpression(SQL_DATA_TYPE_COLUMN), false), - new ExpressionProjector(SQL_DATETIME_SUB, SYSTEM_CATALOG, + new ExpressionProjector(SQL_DATETIME_SUB, SQL_DATETIME_SUB, SYSTEM_CATALOG, new KeyValueColumnExpression(SQL_DATETIME_SUB_COLUMN), false), - new ExpressionProjector(CHAR_OCTET_LENGTH, SYSTEM_CATALOG, + new ExpressionProjector(CHAR_OCTET_LENGTH, CHAR_OCTET_LENGTH, SYSTEM_CATALOG, new KeyValueColumnExpression(CHAR_OCTET_LENGTH_COLUMN), false), - new ExpressionProjector(ORDINAL_POSITION, SYSTEM_CATALOG, + new ExpressionProjector(ORDINAL_POSITION, ORDINAL_POSITION, SYSTEM_CATALOG, new KeyValueColumnExpression(ORDINAL_POSITION_COLUMN), false), - new ExpressionProjector(IS_NULLABLE, SYSTEM_CATALOG, + new ExpressionProjector(IS_NULLABLE, IS_NULLABLE, SYSTEM_CATALOG, new KeyValueColumnExpression(IS_NULLABLE_COLUMN), false), - new ExpressionProjector(SCOPE_CATALOG, SYSTEM_CATALOG, + new ExpressionProjector(SCOPE_CATALOG, SCOPE_CATALOG, SYSTEM_CATALOG, new KeyValueColumnExpression(SCOPE_CATALOG_COLUMN), false), - new ExpressionProjector(SCOPE_SCHEMA, SYSTEM_CATALOG, + new ExpressionProjector(SCOPE_SCHEMA, SCOPE_SCHEMA, SYSTEM_CATALOG, new KeyValueColumnExpression(SCOPE_SCHEMA_COLUMN), false), - new ExpressionProjector(SCOPE_TABLE, SYSTEM_CATALOG, + new ExpressionProjector(SCOPE_TABLE, SCOPE_TABLE, SYSTEM_CATALOG, new KeyValueColumnExpression(SCOPE_TABLE_COLUMN), false), - new ExpressionProjector(SOURCE_DATA_TYPE, SYSTEM_CATALOG, + new ExpressionProjector(SOURCE_DATA_TYPE, SOURCE_DATA_TYPE, SYSTEM_CATALOG, new KeyValueColumnExpression(SOURCE_DATA_TYPE_COLUMN), false), - new ExpressionProjector(IS_AUTOINCREMENT, SYSTEM_CATALOG, + new ExpressionProjector(IS_AUTOINCREMENT, IS_AUTOINCREMENT, SYSTEM_CATALOG, new KeyValueColumnExpression(IS_AUTOINCREMENT_COLUMN), false), - new ExpressionProjector(ARRAY_SIZE, SYSTEM_CATALOG, + new ExpressionProjector(ARRAY_SIZE, ARRAY_SIZE, SYSTEM_CATALOG, new KeyValueColumnExpression(ARRAY_SIZE_COLUMN), false), - new ExpressionProjector(COLUMN_FAMILY, SYSTEM_CATALOG, + new ExpressionProjector(COLUMN_FAMILY, COLUMN_FAMILY, SYSTEM_CATALOG, new KeyValueColumnExpression(COLUMN_FAMILY_COLUMN), false), - new ExpressionProjector(TYPE_ID, SYSTEM_CATALOG, + new ExpressionProjector(TYPE_ID, TYPE_ID, SYSTEM_CATALOG, new KeyValueColumnExpression(TYPE_ID_COLUMN), false), - new ExpressionProjector(VIEW_CONSTANT, SYSTEM_CATALOG, + new ExpressionProjector(VIEW_CONSTANT, VIEW_CONSTANT, SYSTEM_CATALOG, new KeyValueColumnExpression(VIEW_CONSTANT_COLUMN), false), - new ExpressionProjector(MULTI_TENANT, SYSTEM_CATALOG, + new ExpressionProjector(MULTI_TENANT, MULTI_TENANT, SYSTEM_CATALOG, new KeyValueColumnExpression(MULTI_TENANT_COLUMN), false), - new ExpressionProjector(KEY_SEQ, SYSTEM_CATALOG, + new ExpressionProjector(KEY_SEQ, KEY_SEQ, SYSTEM_CATALOG, new KeyValueColumnExpression(KEY_SEQ_COLUMN), false) ), 0, true); private static final RowProjector GET_PRIMARY_KEYS_ROW_PROJECTOR = new RowProjector( Arrays.<ColumnProjector> asList( - new ExpressionProjector(TABLE_CAT, SYSTEM_CATALOG, + new ExpressionProjector(TABLE_CAT, TABLE_CAT, SYSTEM_CATALOG, new RowKeyColumnExpression(TENANT_ID_COLUMN, new RowKeyValueAccessor(PK_DATUM_LIST, 0)), false), - new ExpressionProjector(TABLE_SCHEM, SYSTEM_CATALOG, + new ExpressionProjector(TABLE_SCHEM, TABLE_SCHEM, SYSTEM_CATALOG, new RowKeyColumnExpression(TABLE_SCHEM_COLUMN, new RowKeyValueAccessor(PK_DATUM_LIST, 1)), false), - new ExpressionProjector(TABLE_NAME, SYSTEM_CATALOG, + new ExpressionProjector(TABLE_NAME, TABLE_NAME, SYSTEM_CATALOG, new RowKeyColumnExpression(TABLE_NAME_COLUMN, new RowKeyValueAccessor(PK_DATUM_LIST, 2)), false), - new ExpressionProjector(COLUMN_NAME, SYSTEM_CATALOG, + new ExpressionProjector(COLUMN_NAME, COLUMN_NAME, SYSTEM_CATALOG, new RowKeyColumnExpression(COLUMN_NAME_COLUMN, new RowKeyValueAccessor(PK_DATUM_LIST, 3)), false), - new ExpressionProjector(KEY_SEQ, SYSTEM_CATALOG, + new ExpressionProjector(KEY_SEQ, KEY_SEQ, SYSTEM_CATALOG, new KeyValueColumnExpression(KEY_SEQ_COLUMN), false), - new ExpressionProjector(PK_NAME, SYSTEM_CATALOG, + new ExpressionProjector(PK_NAME, PK_NAME, SYSTEM_CATALOG, new KeyValueColumnExpression(PK_NAME_COLUMN), false), - new ExpressionProjector(ASC_OR_DESC, SYSTEM_CATALOG, + new ExpressionProjector(ASC_OR_DESC, ASC_OR_DESC, SYSTEM_CATALOG, new KeyValueColumnExpression(ASC_OR_DESC_COLUMN), false), - new ExpressionProjector(DATA_TYPE, SYSTEM_CATALOG, + new ExpressionProjector(DATA_TYPE, DATA_TYPE, SYSTEM_CATALOG, new KeyValueColumnExpression(DATA_TYPE_COLUMN), false), - new ExpressionProjector(TYPE_NAME, SYSTEM_CATALOG, + new ExpressionProjector(TYPE_NAME, TYPE_NAME, SYSTEM_CATALOG, new KeyValueColumnExpression(TYPE_NAME_COLUMN), false), - new ExpressionProjector(COLUMN_SIZE, SYSTEM_CATALOG, + new ExpressionProjector(COLUMN_SIZE, COLUMN_SIZE, SYSTEM_CATALOG, new KeyValueColumnExpression(COLUMN_SIZE_COLUMN), false), - new ExpressionProjector(TYPE_ID, SYSTEM_CATALOG, + new ExpressionProjector(TYPE_ID, TYPE_ID, SYSTEM_CATALOG, new KeyValueColumnExpression(TYPE_ID_COLUMN), false), - new ExpressionProjector(VIEW_CONSTANT, SYSTEM_CATALOG, + new ExpressionProjector(VIEW_CONSTANT, VIEW_CONSTANT, SYSTEM_CATALOG, new KeyValueColumnExpression(VIEW_CONSTANT_COLUMN), false)), 0, true); @@ -1363,7 +1363,7 @@ public class PhoenixDatabaseMetaData implements DatabaseMetaData { }; private static final RowProjector TABLE_TYPE_ROW_PROJECTOR = new RowProjector(Arrays.<ColumnProjector>asList( - new ExpressionProjector(TABLE_TYPE, SYSTEM_CATALOG, + new ExpressionProjector(TABLE_TYPE, TABLE_TYPE, SYSTEM_CATALOG, new RowKeyColumnExpression(TABLE_TYPE_DATUM, new RowKeyValueAccessor(Collections.<PDatum>singletonList(TABLE_TYPE_DATUM), 0)), false) ), 0, true); diff --git a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixResultSet.java b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixResultSet.java index f05c98ae31..d01e88b88b 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixResultSet.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixResultSet.java @@ -1633,7 +1633,7 @@ public class PhoenixResultSet implements PhoenixMonitoredResultSet, SQLCloseable startingPos++, currentDynCol.getName().getString()); ColumnProjector dynColProj = new ExpressionProjector( - currentDynCol.getName().getString(), tableName, exp, false); + currentDynCol.getName().getString(), currentDynCol.getName().getString(), tableName, exp, false); allColumnProjectors.add(dynColProj); } diff --git a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixResultSetMetaData.java b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixResultSetMetaData.java index b1d42dc698..bfe952602b 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixResultSetMetaData.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixResultSetMetaData.java @@ -99,12 +99,11 @@ public class PhoenixResultSetMetaData implements ResultSetMetaData { @Override public String getColumnLabel(int column) throws SQLException { - return rowProjector.getColumnProjector(column-1).getName(); + return rowProjector.getColumnProjector(column-1).getLabel(); } @Override public String getColumnName(int column) throws SQLException { - // TODO: will return alias if there is one return rowProjector.getColumnProjector(column-1).getName(); } diff --git a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixStatement.java b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixStatement.java index 5b019d4cc4..8f72c7787c 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixStatement.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixStatement.java @@ -770,20 +770,24 @@ public class PhoenixStatement implements PhoenixMonitoredStatement, SQLCloseable private static final RowProjector EXPLAIN_PLAN_ROW_PROJECTOR_WITH_BYTE_ROW_ESTIMATES = new RowProjector(Arrays .<ColumnProjector> asList( - new ExpressionProjector(EXPLAIN_PLAN_ALIAS, EXPLAIN_PLAN_TABLE_NAME, + new ExpressionProjector(EXPLAIN_PLAN_ALIAS, EXPLAIN_PLAN_ALIAS, + EXPLAIN_PLAN_TABLE_NAME, new RowKeyColumnExpression(EXPLAIN_PLAN_DATUM, new RowKeyValueAccessor(Collections .<PDatum> singletonList(EXPLAIN_PLAN_DATUM), 0)), false), new ExpressionProjector(EXPLAIN_PLAN_BYTES_ESTIMATE_COLUMN_ALIAS, + EXPLAIN_PLAN_BYTES_ESTIMATE_COLUMN_ALIAS, EXPLAIN_PLAN_TABLE_NAME, new KeyValueColumnExpression( EXPLAIN_PLAN_BYTES_ESTIMATE_COLUMN), false), new ExpressionProjector(EXPLAIN_PLAN_ROWS_COLUMN_ALIAS, + EXPLAIN_PLAN_ROWS_COLUMN_ALIAS, EXPLAIN_PLAN_TABLE_NAME, new KeyValueColumnExpression(EXPLAIN_PLAN_ROWS_ESTIMATE_COLUMN), false), new ExpressionProjector(EXPLAIN_PLAN_ESTIMATE_INFO_TS_COLUMN_ALIAS, + EXPLAIN_PLAN_ESTIMATE_INFO_TS_COLUMN_ALIAS, EXPLAIN_PLAN_TABLE_NAME, new KeyValueColumnExpression(EXPLAIN_PLAN_ESTIMATE_INFO_TS_COLUMN), false)), diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java index 084a87ee4f..1fd938b67f 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java @@ -2072,8 +2072,11 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest { String query = "SELECT f1.*, v4 FROM t"; ResultSetMetaData rsMeta = statement.executeQuery(query).getMetaData(); assertEquals("V1", rsMeta.getColumnName(1)); + assertEquals("V1", rsMeta.getColumnLabel(1)); assertEquals("V2", rsMeta.getColumnName(2)); + assertEquals("V2", rsMeta.getColumnLabel(2)); assertEquals("V4", rsMeta.getColumnName(3)); + assertEquals("V4", rsMeta.getColumnLabel(3)); } finally { statement.execute("DROP TABLE IF EXISTS t"); conn.close(); @@ -2092,7 +2095,10 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest { String query = "SELECT f1.*, v4 FROM s.t"; ResultSetMetaData rsMeta = statement.executeQuery(query).getMetaData(); assertEquals("V1", rsMeta.getColumnName(1)); + assertEquals("V1", rsMeta.getColumnLabel(1)); assertEquals("V2", rsMeta.getColumnName(2)); + assertEquals("V2", rsMeta.getColumnLabel(2)); + assertEquals("V4", rsMeta.getColumnLabel(3)); assertEquals("V4", rsMeta.getColumnName(3)); } finally { statement.execute("DROP TABLE IF EXISTS s.t"); diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryMetaDataTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryMetaDataTest.java index 902162d815..7b2edbe099 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryMetaDataTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryMetaDataTest.java @@ -309,7 +309,8 @@ public class QueryMetaDataTest extends BaseConnectionlessQueryTest { assertEquals("organization_id".toUpperCase(),md.getColumnName(1)); assertEquals("a_string".toUpperCase(),md.getColumnName(2)); assertEquals("b_string".toUpperCase(),md.getColumnName(3)); - assertEquals("i".toUpperCase(),md.getColumnName(4)); + assertEquals("a_integer".toUpperCase(),md.getColumnName(4)); + assertEquals("i".toUpperCase(),md.getColumnLabel(4)); assertEquals("a_date".toUpperCase(),md.getColumnName(5)); assertEquals(String.class.getName(),md.getColumnClassName(1)); diff --git a/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixResultSetMetadataTest.java b/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixResultSetMetadataTest.java index 5653b7c19e..a593583a63 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixResultSetMetadataTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixResultSetMetadataTest.java @@ -18,6 +18,8 @@ package org.apache.phoenix.jdbc; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import java.sql.Connection; import java.sql.DriverManager; @@ -49,4 +51,107 @@ public class PhoenixResultSetMetadataTest extends BaseConnectionlessQueryTest { assertEquals("NULL", rs.getMetaData().getColumnTypeName(1)); } + + @Test + public void testCaseSensitiveExpression() throws Exception { + Connection conn = DriverManager.getConnection(getUrl()); + conn.createStatement().execute( + "CREATE TABLE T (pk1 CHAR(15) not null, pk2 VARCHAR not null, \"v1\" VARCHAR(15), v2 DATE, \"v3\" VARCHAR " + + "CONSTRAINT pk PRIMARY KEY (pk1, pk2)) "); + ResultSet rs = conn.createStatement().executeQuery("SELECT pk1 AS testalias1, pk2 AS \"testalias2\", " + + "\"v1\" AS \"testalias3\", v2, \"v3\" FROM T"); + + assertEquals("PK1", rs.getMetaData().getColumnName(1)); + assertEquals("TESTALIAS1", rs.getMetaData().getColumnLabel(1)); + assertFalse(rs.getMetaData().isCaseSensitive(1)); + + assertEquals("PK2", rs.getMetaData().getColumnName(2)); + assertEquals("testalias2", rs.getMetaData().getColumnLabel(2)); + assertTrue(rs.getMetaData().isCaseSensitive(2)); + + assertEquals("v1", rs.getMetaData().getColumnName(3)); + assertEquals("testalias3", rs.getMetaData().getColumnLabel(3)); + assertTrue(rs.getMetaData().isCaseSensitive(3)); + + assertEquals("V2", rs.getMetaData().getColumnName(4)); + assertEquals("V2", rs.getMetaData().getColumnLabel(4)); + assertFalse(rs.getMetaData().isCaseSensitive(4)); + + assertEquals("v3", rs.getMetaData().getColumnName(5)); + assertEquals("v3", rs.getMetaData().getColumnLabel(5)); + assertTrue(rs.getMetaData().isCaseSensitive(5)); + } + + @Test + public void testLabel() throws Exception { + Connection conn = DriverManager.getConnection(getUrl()); + conn.createStatement().execute( + "CREATE TABLE T (pk1 CHAR(15) not null, pk2 VARCHAR not null, v1 VARCHAR(15), v2 DATE, v3 VARCHAR " + + "CONSTRAINT pk PRIMARY KEY (pk1, pk2)) "); + ResultSet rs = conn.createStatement().executeQuery("SELECT pk1 AS testalias1, pk2, " + + "v1 AS testalias2, v2 FROM T"); + assertEquals("PK1", rs.getMetaData().getColumnName(1)); + assertEquals("TESTALIAS1", rs.getMetaData().getColumnLabel(1)); + assertEquals("PK2", rs.getMetaData().getColumnName(2)); + assertEquals("PK2", rs.getMetaData().getColumnLabel(2)); + assertEquals("V1", rs.getMetaData().getColumnName(3)); + assertEquals("TESTALIAS2", rs.getMetaData().getColumnLabel(3)); + assertEquals("V2", rs.getMetaData().getColumnName(4)); + assertEquals("V2", rs.getMetaData().getColumnLabel(4)); + } + + @Test + public void testSummandExpression() throws Exception { + Connection conn = DriverManager.getConnection(getUrl()); + conn.createStatement().execute( + "CREATE TABLE T (pk1 CHAR(15) not null, pk2 INTEGER not null, v1 VARCHAR(15), v2 DATE, v3 VARCHAR " + + "CONSTRAINT pk PRIMARY KEY (pk1, pk2)) "); + ResultSet rs = conn.createStatement().executeQuery("SELECT 3+pk2 FROM T"); + assertEquals("(3 + PK2)", rs.getMetaData().getColumnName(1)); + assertEquals("(3 + PK2)", rs.getMetaData().getColumnLabel(1)); + rs = conn.createStatement().executeQuery("SELECT 3+pk2 AS sum FROM T"); + assertEquals("(3 + PK2)", rs.getMetaData().getColumnName(1)); + assertEquals("SUM", rs.getMetaData().getColumnLabel(1)); + } + + @Test + public void testSqrtExpression() throws Exception { + Connection conn = DriverManager.getConnection(getUrl()); + conn.createStatement().execute( + "CREATE TABLE T (pk1 CHAR(15) not null, pk2 INTEGER not null, v1 VARCHAR(15), v2 DATE, v3 VARCHAR " + + "CONSTRAINT pk PRIMARY KEY (pk1, pk2)) "); + ResultSet rs = conn.createStatement().executeQuery("SELECT SQRT(3+pk2) FROM T"); + assertEquals("SQRT((3 + PK2))", rs.getMetaData().getColumnName(1)); + assertEquals("SQRT((3 + PK2))", rs.getMetaData().getColumnLabel(1)); + rs = conn.createStatement().executeQuery("SELECT SQRT(3+pk2) AS \"sqrt\" FROM T"); + assertEquals("SQRT((3 + PK2))", rs.getMetaData().getColumnName(1)); + assertEquals("sqrt", rs.getMetaData().getColumnLabel(1)); + } + + @Test + public void testView() throws Exception { + Connection conn = DriverManager.getConnection(getUrl()); + conn.createStatement().execute( + "CREATE TABLE IF NOT EXISTS S.T (A INTEGER PRIMARY KEY, B INTEGER, C VARCHAR, D INTEGER)"); + conn.createStatement().execute( + "CREATE VIEW IF NOT EXISTS S.V (VA INTEGER, VB INTEGER) AS SELECT * FROM S.T WHERE B=200"); + conn.createStatement().execute( + "UPSERT INTO S.V (A, B, C, D, VA, VB) VALUES (2, 200, 'def', -20, 91, 101)"); + conn.createStatement().execute( + "ALTER VIEW S.V DROP COLUMN C"); + + ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM S.V"); + assertEquals("A", rs.getMetaData().getColumnName(1)); + assertEquals("A", rs.getMetaData().getColumnLabel(1)); + assertEquals("B", rs.getMetaData().getColumnName(2)); + assertEquals("B", rs.getMetaData().getColumnLabel(2)); + assertEquals("C", rs.getMetaData().getColumnName(3)); + assertEquals("C", rs.getMetaData().getColumnLabel(3)); + assertEquals("D", rs.getMetaData().getColumnName(4)); + assertEquals("D", rs.getMetaData().getColumnLabel(4)); + assertEquals("VA", rs.getMetaData().getColumnName(5)); + assertEquals("VA", rs.getMetaData().getColumnLabel(5)); + assertEquals("VB", rs.getMetaData().getColumnName(6)); + assertEquals("VB", rs.getMetaData().getColumnLabel(6)); + } }