[ https://issues.apache.org/jira/browse/PHOENIX-514?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14302346#comment-14302346 ]
ASF GitHub Bot commented on PHOENIX-514: ---------------------------------------- Github user twdsilva commented on a diff in the pull request: https://github.com/apache/phoenix/pull/34#discussion_r23970708 --- Diff: phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java --- @@ -945,55 +963,79 @@ public MutationState createIndex(CreateIndexStatement statement, byte[][] splits PDataType dataType = MetaDataUtil.getViewIndexIdDataType(); ColumnName colName = ColumnName.caseSensitiveColumnName(MetaDataUtil.getViewIndexIdColumnName()); allPkColumns.add(new Pair<ColumnName, SortOrder>(colName, SortOrder.getDefault())); - columnDefs.add(FACTORY.columnDef(colName, dataType.getSqlTypeName(), false, null, null, false, SortOrder.getDefault())); + columnDefs.add(FACTORY.columnDef(colName, dataType.getSqlTypeName(), false, null, null, false, SortOrder.getDefault(), null)); } // First columns are the indexed ones - for (Pair<ColumnName, SortOrder> pair : indexedPkColumns) { - ColumnName colName = pair.getFirst(); - PColumn col = resolver.resolveColumn(null, colName.getFamilyName(), colName.getColumnName()).getColumn(); - unusedPkColumns.remove(col); - // Ignore view constants for updatable views as we don't need these in the index - if (col.getViewConstant() == null) { - PDataType dataType = IndexUtil.getIndexColumnDataType(col); - colName = ColumnName.caseSensitiveColumnName(IndexUtil.getIndexColumnName(col)); - allPkColumns.add(new Pair<ColumnName, SortOrder>(colName, pair.getSecond())); - columnDefs.add(FACTORY.columnDef(colName, dataType.getSqlTypeName(), col.isNullable(), col.getMaxLength(), col.getScale(), false, SortOrder.getDefault())); - } + Set<ColumnName> indexedColumnNames = Sets.newHashSetWithExpectedSize(indexParseNodeAndSortOrderList.size()); + for (Pair<ParseNode, SortOrder> pair : indexParseNodeAndSortOrderList) { + ParseNode parseNode = pair.getFirst(); + // compile the parseNode to get an expression + PhoenixStatement phoenixStatment = new PhoenixStatement(connection); + final StatementContext context = new StatementContext(phoenixStatment, resolver); + // normalize the parse node + parseNode = StatementNormalizer.normalize(parseNode, resolver); + ExpressionCompiler expressionCompiler = new ExpressionCompiler(context); + Expression expression = parseNode.accept(expressionCompiler); + if (expressionCompiler.isAggregate()) { + throw new SQLExceptionInfo.Builder(SQLExceptionCode.AGGREGATE_EXPRESSION_NOT_ALLOWED_IN_INDEX).build().buildException(); + } + if (expression.getDeterminism() != Determinism.ALWAYS) { + throw new SQLExceptionInfo.Builder(SQLExceptionCode.NON_DETERMINISTIC_EXPRESSION_NOT_ALLOWED_IN_INDEX).build().buildException(); + } + // true for any constant (including a view constant), as we don't need these in the index + if (expression.isStateless()) { + continue; + } + unusedPkColumns.remove(expression); + + ColumnName colName = null; + // if expression is KeyValueExpression set the column name correctly --- End diff -- This is needed so that colName is set correctly for columns that have a family name > Support functional indexes > -------------------------- > > Key: PHOENIX-514 > URL: https://issues.apache.org/jira/browse/PHOENIX-514 > Project: Phoenix > Issue Type: Task > Reporter: James Taylor > Assignee: Thomas D'Silva > Labels: enhancement > > Instead of only defining the set of columns from the data table that make up > an index, you should be able to use expressions. For example: > CREATE INDEX upper_last_name_idx ON person (UPPER(last_name)) > Then in queries that use UPPER(last_name), we can replace them with column > references to the index table. -- This message was sent by Atlassian JIRA (v6.3.4#6332)