/** * Copyright (C) 2009-2013 FoundationDB, LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.foundationdb.sql.pg; import com.foundationdb.sql.server.ServerCallInvocation; import com.foundationdb.sql.parser.CallStatementNode; import com.foundationdb.sql.parser.ParameterNode; import com.foundationdb.sql.parser.StatementNode; import com.foundationdb.sql.parser.StaticMethodCallNode; import com.foundationdb.server.error.CantCallScriptLibraryException; import com.foundationdb.server.explain.Explainable; import java.util.List; /** * SQL statements that affect session / environment state. */ public class PostgresCallStatementGenerator extends PostgresBaseStatementGenerator { public PostgresCallStatementGenerator(PostgresServerSession server) { } @Override public PostgresStatement generateStub(PostgresServerSession server, String sql, StatementNode stmt, List<ParameterNode> params, int[] paramTypes) { if (!(stmt instanceof CallStatementNode)) return null; CallStatementNode call = (CallStatementNode)stmt; StaticMethodCallNode methodCall = (StaticMethodCallNode)call.methodCall().getJavaValueNode(); // This will signal error if undefined, so any special handling of // non-AIS CALL statements needs to be tested by an earlier generator. ServerCallInvocation invocation = ServerCallInvocation.of(server, methodCall); final PostgresStatement pstmt; switch (invocation.getCallingConvention()) { case LOADABLE_PLAN: pstmt = PostgresLoadablePlan.statement(server, invocation); break; case SCRIPT_LIBRARY: throw new CantCallScriptLibraryException(stmt); default: pstmt = PostgresJavaRoutine.statement(server, invocation, params, paramTypes); } // The above makes extensive use of the AIS. This doesn't fit well into the // create and then init, so just mark with AIS now. if (pstmt != null) pstmt.setAISGeneration(server.getAIS().getGeneration()); return pstmt; } public static Explainable explainable(PostgresServerSession server, CallStatementNode call, List<ParameterNode> params, int[] paramTypes) { StaticMethodCallNode methodCall = (StaticMethodCallNode)call.methodCall().getJavaValueNode(); ServerCallInvocation invocation = ServerCallInvocation.of(server, methodCall); switch (invocation.getCallingConvention()) { case LOADABLE_PLAN: return PostgresLoadablePlan.explainable(server, invocation); default: return PostgresJavaRoutine.explainable(server, invocation, params, paramTypes); } } }