docs: def _execute_cell(args, cell_body):
    """Implements the BigQuery cell magic used to execute BQ queries.
  
     The supported syntax is:
       %%bq execute <args>
       [<inline SQL>]
  
    Args:
      args: the optional arguments following '%%bq execute'.
      cell_body: optional contents of the cell
    Returns:
      QueryResultsTable containing query result
    """
    env = google.datalab.utils.commands.notebook_environment()
    config = google.datalab.utils.commands.parse_config(cell_body, env, False) or {}
    parameters = config.get('parameters') or []
    if parameters:
      jsonschema.validate({'parameters': parameters}, BigQuerySchema.QUERY_PARAMS_SCHEMA)
    table_name = google.datalab.bigquery.Query.resolve_parameters(args['table'], parameters)
  
    query = google.datalab.utils.commands.get_notebook_item(args['query'])
    if args['verbose']:
      print(query.sql)
  
    query_params = get_query_parameters(args, cell_body)
  
    if args['to_dataframe']:
      # re-parse the int arguments because they're passed as strings
      start_row = int(args['dataframe_start_row']) if args['dataframe_start_row'] else None
      max_rows = int(args['dataframe_max_rows']) if args['dataframe_max_rows'] else None
      output_options = QueryOutput.dataframe(start_row=start_row, max_rows=max_rows,
                                             use_cache=not args['nocache'])
    else:
      output_options = QueryOutput.table(
        name=table_name, mode=args['mode'], use_cache=not args['nocache'],
        allow_large_results=args['large'])
    context = google.datalab.utils._utils._construct_context_for_args(args)
    r = query.execute(output_options, context=context, query_params=query_params)
    return r.result()