/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.command.dml;
import java.sql.ResultSet;
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.
*/
public class Call extends Prepared {
private boolean isResultSet;
private Expression expression;
private Expression[] expressions;
public Call(Session session) {
super(session);
}
public ResultInterface queryMeta() {
LocalResult result;
if (isResultSet) {
Expression[] expr = expression.getExpressionColumns(session);
result = new LocalResult(session, expr, expr.length);
} else {
result = new LocalResult(session, expressions, 1);
}
result.done();
return result;
}
public int update() {
Value v = expression.getValue(session);
int type = v.getType();
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();
}
}
public ResultInterface query(int maxrows) {
setCurrentRowNumber(1);
Value v = expression.getValue(session);
if (isResultSet) {
v = v.convertTo(Value.RESULT_SET);
ResultSet rs = v.getResultSet();
return LocalResult.read(session, rs, maxrows);
}
LocalResult result = new LocalResult(session, expressions, 1);
Value[] row = { v };
result.addRow(row);
result.done();
return result;
}
public void prepare() {
expression = expression.optimize(session);
expressions = new Expression[] { expression };
isResultSet = expression.getType() == Value.RESULT_SET;
if (isResultSet) {
prepareAlways = true;
}
}
public void setExpression(Expression expression) {
this.expression = expression;
}
public boolean isQuery() {
return true;
}
public boolean isTransactional() {
return true;
}
public boolean isReadOnly() {
return expression.isEverything(ExpressionVisitor.READONLY_VISITOR);
}
public int getType() {
return CommandInterface.CALL;
}
public boolean isCacheable() {
return !isResultSet;
}
}