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));
+    }
 }


Reply via email to