1 | /* |
2 | * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, |
3 | * and the EPL 1.0 (http://h2database.com/html/license.html). |
4 | * Initial Developer: H2 Group |
5 | */ |
6 | package org.h2.command.dml; |
7 | |
8 | import java.util.ArrayList; |
9 | import org.h2.expression.Expression; |
10 | import org.h2.expression.ExpressionColumn; |
11 | import org.h2.table.Column; |
12 | import org.h2.table.ColumnResolver; |
13 | import org.h2.table.TableFilter; |
14 | import org.h2.value.Value; |
15 | |
16 | /** |
17 | * This class represents a column resolver for the column list of a SELECT |
18 | * statement. It is used to resolve select column aliases in the HAVING clause. |
19 | * Example: |
20 | * <p> |
21 | * SELECT X/3 AS A, COUNT(*) FROM SYSTEM_RANGE(1, 10) GROUP BY A HAVING A>2; |
22 | * </p> |
23 | * |
24 | * @author Thomas Mueller |
25 | */ |
26 | public class SelectListColumnResolver implements ColumnResolver { |
27 | |
28 | private final Select select; |
29 | private final Expression[] expressions; |
30 | private final Column[] columns; |
31 | |
32 | SelectListColumnResolver(Select select) { |
33 | this.select = select; |
34 | int columnCount = select.getColumnCount(); |
35 | columns = new Column[columnCount]; |
36 | expressions = new Expression[columnCount]; |
37 | ArrayList<Expression> columnList = select.getExpressions(); |
38 | for (int i = 0; i < columnCount; i++) { |
39 | Expression expr = columnList.get(i); |
40 | Column column = new Column(expr.getAlias(), Value.NULL); |
41 | column.setTable(null, i); |
42 | columns[i] = column; |
43 | expressions[i] = expr.getNonAliasExpression(); |
44 | } |
45 | } |
46 | |
47 | @Override |
48 | public Column[] getColumns() { |
49 | return columns; |
50 | } |
51 | |
52 | @Override |
53 | public String getSchemaName() { |
54 | return null; |
55 | } |
56 | |
57 | @Override |
58 | public Select getSelect() { |
59 | return select; |
60 | } |
61 | |
62 | @Override |
63 | public Column[] getSystemColumns() { |
64 | return null; |
65 | } |
66 | |
67 | @Override |
68 | public Column getRowIdColumn() { |
69 | return null; |
70 | } |
71 | |
72 | @Override |
73 | public String getTableAlias() { |
74 | return null; |
75 | } |
76 | |
77 | @Override |
78 | public TableFilter getTableFilter() { |
79 | return null; |
80 | } |
81 | |
82 | @Override |
83 | public Value getValue(Column column) { |
84 | return null; |
85 | } |
86 | |
87 | @Override |
88 | public Expression optimize(ExpressionColumn expressionColumn, Column column) { |
89 | return expressions[column.getColumnId()]; |
90 | } |
91 | |
92 | } |