code: func (cc *clientConn) handleFieldList(sql string) (err error) {
  	parts := strings.Split(sql, "\x00")
  	columns, err := cc.ctx.FieldList(parts[0])
  	if err != nil {
  		return err
  	}
  	data := cc.alloc.AllocWithLen(4, 1024)
  	for _, column := range columns {
  		// Current we doesn't output defaultValue but reserve defaultValue length byte to make mariadb client happy.
  		// https://dev.mysql.com/doc/internals/en/com-query-response.html#column-definition
  		// TODO: fill the right DefaultValues.
  		column.DefaultValueLength = 0
  		column.DefaultValue = []byte{}
  
  		data = data[0:4]
  		data = column.Dump(data)
  		if err := cc.writePacket(data); err != nil {
  			return err
  		}
  	}
  	if err := cc.writeEOF(0); err != nil {
  		return err
  	}
  	return cc.flush()
  }
docs: // handleFieldList returns the field list for a table.
  // The sql string is composed of a table name and a terminating character \x00.