code: func (e *executor) executeSetColumnAttrs(ctx context.Context, index string, c *pql.Call, opt *execOptions) error {
  	span, ctx := tracing.StartSpanFromContext(ctx, "Executor.executeSetColumnAttrs")
  	defer span.Finish()
  
  	// Retrieve index.
  	idx := e.Holder.Index(index)
  	if idx == nil {
  		return ErrIndexNotFound
  	}
  
  	col, okCol, errCol := c.UintArg("_" + columnLabel)
  	if errCol != nil || !okCol {
  		return fmt.Errorf("reading SetColumnAttrs() col errs: %v found %v", errCol, okCol)
  	}
  
  	// Copy args and remove reserved fields.
  	attrs := pql.CopyArgs(c.Args)
  	delete(attrs, "_"+columnLabel)
  	delete(attrs, "field")
  
  	// Set attributes.
  	if err := idx.ColumnAttrStore().SetAttrs(col, attrs); err != nil {
  		return err
  	}
  	idx.Stats.Count("SetProfileAttrs", 1, 1.0)
  	// Do not forward call if this is already being forwarded.
  	if opt.Remote {
  		return nil
  	}
  
  	// Execute on remote nodes in parallel.
  	nodes := Nodes(e.Cluster.nodes).FilterID(e.Node.ID)
  	resp := make(chan error, len(nodes))
  	for _, node := range nodes {
  		go func(node *Node) {
  			_, err := e.remoteExec(ctx, node, index, &pql.Query{Calls: []*pql.Call{c}}, nil)
  			resp <- err
  		}(node)
  	}
  
  	// Return first error.
  	for range nodes {
  		if err := <-resp; err != nil {
  			return err
  		}
  	}
  
  	return nil
  }
docs: // executeSetColumnAttrs executes a SetColumnAttrs() call.