code: func (c *conn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (rows driver.Rows, err error) {
  	if c.session.IsBad() {
  		return nil, driver.ErrBadConn
  	}
  
  	if len(args) != 0 {
  		return nil, driver.ErrSkip //fast path not possible (prepare needed)
  	}
  
  	// direct execution of call procedure
  	// - returns no parameter metadata (sps 82) but only field values
  	// --> let's take the 'prepare way' for stored procedures
  	if checkCallProcedure(query) {
  		return nil, driver.ErrSkip
  	}
  
  	sqltrace.Traceln(query)
  
  	id, idx, ok := decodeTableQuery(query)
  	if ok {
  		r := procedureCallResultStore.get(id)
  		if r == nil {
  			return nil, fmt.Errorf("invalid procedure table query %s", query)
  		}
  		return r.tableRows(int(idx))
  	}
  
  	done := make(chan struct{})
  	go func() {
  		var (
  			id             uint64
  			resultFieldSet *p.ResultFieldSet
  			fieldValues    *p.FieldValues
  			attributes     p.PartAttributes
  		)
  		id, resultFieldSet, fieldValues, attributes, err = c.session.QueryDirect(query)
  		if err != nil {
  			goto done
  		}
  		select {
  		default:
  		case <-ctx.Done():
  			return
  		}
  		if id == 0 { // non select query
  			rows = noResult
  		} else {
  			rows, err = newQueryResult(c.session, id, resultFieldSet, fieldValues, attributes)
  		}
  	done:
  		close(done)
  	}()
  
  	select {
  	case <-ctx.Done():
  		return nil, ctx.Err()
  	case <-done:
  		return rows, err
  	}
  }
docs: // QueryContext implements the database/sql/driver/QueryerContext interface.