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.expression; |
7 | |
8 | import org.h2.engine.Session; |
9 | import org.h2.table.Column; |
10 | import org.h2.table.ColumnResolver; |
11 | import org.h2.table.TableFilter; |
12 | import org.h2.util.StatementBuilder; |
13 | import org.h2.value.Value; |
14 | import org.h2.value.ValueArray; |
15 | |
16 | /** |
17 | * A list of expressions, as in (ID, NAME). |
18 | * The result of this expression is an array. |
19 | */ |
20 | public class ExpressionList extends Expression { |
21 | |
22 | private final Expression[] list; |
23 | |
24 | public ExpressionList(Expression[] list) { |
25 | this.list = list; |
26 | } |
27 | |
28 | @Override |
29 | public Value getValue(Session session) { |
30 | Value[] v = new Value[list.length]; |
31 | for (int i = 0; i < list.length; i++) { |
32 | v[i] = list[i].getValue(session); |
33 | } |
34 | return ValueArray.get(v); |
35 | } |
36 | |
37 | @Override |
38 | public int getType() { |
39 | return Value.ARRAY; |
40 | } |
41 | |
42 | @Override |
43 | public void mapColumns(ColumnResolver resolver, int level) { |
44 | for (Expression e : list) { |
45 | e.mapColumns(resolver, level); |
46 | } |
47 | } |
48 | |
49 | @Override |
50 | public Expression optimize(Session session) { |
51 | boolean allConst = true; |
52 | for (int i = 0; i < list.length; i++) { |
53 | Expression e = list[i].optimize(session); |
54 | if (!e.isConstant()) { |
55 | allConst = false; |
56 | } |
57 | list[i] = e; |
58 | } |
59 | if (allConst) { |
60 | return ValueExpression.get(getValue(session)); |
61 | } |
62 | return this; |
63 | } |
64 | |
65 | @Override |
66 | public void setEvaluatable(TableFilter tableFilter, boolean b) { |
67 | for (Expression e : list) { |
68 | e.setEvaluatable(tableFilter, b); |
69 | } |
70 | } |
71 | |
72 | @Override |
73 | public int getScale() { |
74 | return 0; |
75 | } |
76 | |
77 | @Override |
78 | public long getPrecision() { |
79 | return Integer.MAX_VALUE; |
80 | } |
81 | |
82 | @Override |
83 | public int getDisplaySize() { |
84 | return Integer.MAX_VALUE; |
85 | } |
86 | |
87 | @Override |
88 | public String getSQL() { |
89 | StatementBuilder buff = new StatementBuilder("("); |
90 | for (Expression e: list) { |
91 | buff.appendExceptFirst(", "); |
92 | buff.append(e.getSQL()); |
93 | } |
94 | if (list.length == 1) { |
95 | buff.append(','); |
96 | } |
97 | return buff.append(')').toString(); |
98 | } |
99 | |
100 | @Override |
101 | public void updateAggregate(Session session) { |
102 | for (Expression e : list) { |
103 | e.updateAggregate(session); |
104 | } |
105 | } |
106 | |
107 | @Override |
108 | public boolean isEverything(ExpressionVisitor visitor) { |
109 | for (Expression e : list) { |
110 | if (!e.isEverything(visitor)) { |
111 | return false; |
112 | } |
113 | } |
114 | return true; |
115 | } |
116 | |
117 | @Override |
118 | public int getCost() { |
119 | int cost = 1; |
120 | for (Expression e : list) { |
121 | cost += e.getCost(); |
122 | } |
123 | return cost; |
124 | } |
125 | |
126 | @Override |
127 | public Expression[] getExpressionColumns(Session session) { |
128 | ExpressionColumn[] expr = new ExpressionColumn[list.length]; |
129 | for (int i = 0; i < list.length; i++) { |
130 | Expression e = list[i]; |
131 | Column col = new Column("C" + (i + 1), |
132 | e.getType(), e.getPrecision(), e.getScale(), |
133 | e.getDisplaySize()); |
134 | expr[i] = new ExpressionColumn(session.getDatabase(), col); |
135 | } |
136 | return expr; |
137 | } |
138 | |
139 | } |