def callproc(self, procname, args=()):
    self._CheckOpen()
    self._Reset()

    request = sql_pb2.ExecRequest()
    request.statement_type = sql_pb2.ExecRequest.CALLABLE_STATEMENT
    request.statement = 'CALL %s(%s)' % (procname, ','.join('?' * len(args)))




    self._AddBindVariablesToRequest(
        request.statement, args, request.bind_variable.add,
        direction=client_pb2.BindVariableProto.INOUT)
    result = self._DoExec(request)
    self._executed = request.statement


    return_args = list(args[:])
    for var in result.output_variable:
      return_args[var.position - 1] = self._DecodeVariable(var.type, var.value)
    return tuple(return_args)
If a function wrapped with wait_for hits the timeout, it cancels
dataset/ETHPy150Open AppScale/appscale/AppServer/google/storage/speckle/python/api/rdbms.py/Cursor.callproc--crossover with--dataset/ETHPy150Open itamarst/crochet/crochet/tests/test_api.py/WaitForTests.test_timeoutCancels