/*
* Copyright 2004-2018 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.expression;
import org.h2.engine.
Session;
import org.h2.table.
Column;
import org.h2.table.
ColumnResolver;
import org.h2.table.
TableFilter;
import org.h2.util.
StatementBuilder;
import org.h2.value.
Value;
import org.h2.value.
ValueArray;
/**
* A list of expressions, as in (ID, NAME).
* The result of this expression is an array.
*/
public class
ExpressionList extends
Expression {
private final
Expression[]
list;
public
ExpressionList(
Expression[]
list) {
this.
list =
list;
}
@
Override
public
Value getValue(
Session session) {
Value[]
v = new
Value[
list.length];
for (int
i = 0;
i <
list.length;
i++) {
v[
i] =
list[
i].
getValue(
session);
}
return
ValueArray.
get(
v);
}
@
Override
public int
getType() {
return
Value.
ARRAY;
}
@
Override
public void
mapColumns(
ColumnResolver resolver, int
level) {
for (
Expression e :
list) {
e.
mapColumns(
resolver,
level);
}
}
@
Override
public
Expression optimize(
Session session) {
boolean
allConst = true;
for (int
i = 0;
i <
list.length;
i++) {
Expression e =
list[
i].
optimize(
session);
if (!
e.
isConstant()) {
allConst = false;
}
list[
i] =
e;
}
if (
allConst) {
return
ValueExpression.
get(
getValue(
session));
}
return this;
}
@
Override
public void
setEvaluatable(
TableFilter tableFilter, boolean
b) {
for (
Expression e :
list) {
e.
setEvaluatable(
tableFilter,
b);
}
}
@
Override
public int
getScale() {
return 0;
}
@
Override
public long
getPrecision() {
return
Integer.
MAX_VALUE;
}
@
Override
public int
getDisplaySize() {
return
Integer.
MAX_VALUE;
}
@
Override
public
String getSQL() {
StatementBuilder buff = new
StatementBuilder("(");
for (
Expression e:
list) {
buff.
appendExceptFirst(", ");
buff.
append(
e.
getSQL());
}
if (
list.length == 1) {
buff.
append(',');
}
return
buff.
append(')').
toString();
}
@
Override
public void
updateAggregate(
Session session) {
for (
Expression e :
list) {
e.
updateAggregate(
session);
}
}
@
Override
public boolean
isEverything(
ExpressionVisitor visitor) {
for (
Expression e :
list) {
if (!
e.
isEverything(
visitor)) {
return false;
}
}
return true;
}
@
Override
public int
getCost() {
int
cost = 1;
for (
Expression e :
list) {
cost +=
e.
getCost();
}
return
cost;
}
@
Override
public
Expression[]
getExpressionColumns(
Session session) {
ExpressionColumn[]
expr = new
ExpressionColumn[
list.length];
for (int
i = 0;
i <
list.length;
i++) {
Expression e =
list[
i];
Column col = new
Column("C" + (
i + 1),
e.
getType(),
e.
getPrecision(),
e.
getScale(),
e.
getDisplaySize());
expr[
i] = new
ExpressionColumn(
session.
getDatabase(),
col);
}
return
expr;
}
}