code: func (s *Session) Query(stmtID uint64, prmFieldSet *ParameterFieldSet, resultFieldSet *ResultFieldSet, args []driver.NamedValue) (uint64, *FieldValues, PartAttributes, error) {
  	s.mu.Lock()
  	defer s.mu.Unlock()
  
  	s.statementID.id = &stmtID
  	if err := s.writeRequest(mtExecute, false, s.statementID, newInputParameters(prmFieldSet.inputFields(), args)); err != nil {
  		return 0, nil, nil, err
  	}
  
  	var rsetID uint64
  	fieldValues := newFieldValues()
  
  	f := func(p replyPart) {
  
  		switch p := p.(type) {
  
  		case *resultsetID:
  			p.id = &rsetID
  		case *resultset:
  			p.s = s
  			p.resultFieldSet = resultFieldSet
  			p.fieldValues = fieldValues
  		}
  	}
  
  	if err := s.readReply(f); err != nil {
  		return 0, nil, nil, err
  	}
  
  	return rsetID, fieldValues, s.ph.partAttributes, nil
  }
docs: // Query executes a query.