private Object getValueInternal(Session session, Object[] aggregateData) {
boolean isValue = false;
int variableCount = routine.getVariableCount();
Result result;
int extraArg = routine.javaMethodWithConnection ? 1
: 0;
Object[] data = ValuePool.emptyObjectArray;
boolean push = true;
if (extraArg + nodes.length > 0) {
if (opType == OpTypes.USER_AGGREGATE) {
data = new Object[routine.getParameterCount()];
for (int i = 0; i < aggregateData.length; i++) {
data[i + 1] = aggregateData[i];
}
} else {
data = new Object[nodes.length + extraArg];
}
if (extraArg > 0) {
data[0] = session.getInternalConnection();
}
}
Type[] dataTypes = routine.getParameterTypes();
for (int i = 0; i < nodes.length; i++) {
Expression e = nodes[i];
Object value = e.getValue(session, dataTypes[i]);
if (value == null) {
if (routine.isNullInputOutput()) {
return null;
}
if (!routine.getParameter(i).isNullable()) {
return Result.newErrorResult(
Error.error(ErrorCode.X_39004));
}
}
if (routine.isPSM()) {
data[i] = value;
} else {
data[i + extraArg] = e.dataType.convertSQLToJava(session,
value);
}
}
if (push) {
session.sessionContext.push();
}
if (routine.isPSM()) {
try {
session.sessionContext.routineArguments = data;
session.sessionContext.routineVariables =
ValuePool.emptyObjectArray;
if (variableCount > 0) {
session.sessionContext.routineVariables =
new Object[variableCount];
}
result = routine.statement.execute(session);
if (aggregateData != null) {
for (int i = 0; i < aggregateData.length; i++) {
aggregateData[i] = data[i + 1];
}
}
} catch (Throwable e) {
result = Result.newErrorResult(e);
}
} else {
if (opType == OpTypes.USER_AGGREGATE) {
data = routine.convertArgsToJava(session, data);
}
result = routine.invokeJavaMethod(session, data);
if (opType == OpTypes.USER_AGGREGATE) {
Object[] callResult = new Object[data.length];
routine.convertArgsToSQL(session, callResult, data);
for (int i = 0; i < aggregateData.length; i++) {
aggregateData[i] = callResult[i + 1];
}
}
}
if (push) {
session.sessionContext.pop();
}
if (result.isError()) {
throw result.getException();
}
if (isValue) {
return result.valueData;
} else {