/*
 * Copyright 2004-2019 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.command.dml;

import org.h2.command.CommandInterface;
import org.h2.command.Prepared;
import org.h2.engine.Session;
import org.h2.expression.Expression;
import org.h2.expression.ExpressionVisitor;
import org.h2.result.LocalResult;
import org.h2.result.ResultInterface;
import org.h2.value.Value;

This class represents the statement CALL.
/** * This class represents the statement * CALL. */
public class Call extends Prepared { private boolean isResultSet; private Expression expression; private Expression[] expressions; public Call(Session session) { super(session); } @Override public ResultInterface queryMeta() { LocalResult result; if (isResultSet) { Expression[] expr = expression.getExpressionColumns(session); result = session.getDatabase().getResultFactory().create(session, expr, expr.length); } else { result = session.getDatabase().getResultFactory().create(session, expressions, 1); } result.done(); return result; } @Override public int update() { Value v = expression.getValue(session); int type = v.getValueType(); switch (type) { case Value.RESULT_SET: // this will throw an exception // methods returning a result set may not be called like this. return super.update(); case Value.UNKNOWN: case Value.NULL: return 0; default: return v.getInt(); } } @Override public ResultInterface query(int maxrows) { setCurrentRowNumber(1); Value v = expression.getValue(session); if (isResultSet) { return v.getResult(); } LocalResult result = session.getDatabase().getResultFactory().create(session, expressions, 1); Value[] row = { v }; result.addRow(row); result.done(); return result; } @Override public void prepare() { expression = expression.optimize(session); expressions = new Expression[] { expression }; isResultSet = expression.getType().getValueType() == Value.RESULT_SET; if (isResultSet) { prepareAlways = true; } } public void setExpression(Expression expression) { this.expression = expression; } @Override public boolean isQuery() { return true; } @Override public boolean isTransactional() { return true; } @Override public boolean isReadOnly() { return expression.isEverything(ExpressionVisitor.READONLY_VISITOR); } @Override public int getType() { return CommandInterface.CALL; } @Override public boolean isCacheable() { return !isResultSet; } }